劉杰 于啟紅 戈軍 王璐






摘要:針對人們對日常生活中見到的事物進行靈活、實時地識別分類的需求,設計開發了一款基于Android的圖像識別系統。通過百度AI開放平臺中圖像識別數據服務接口與圖像庫,對用戶上傳的圖像數據進行實時抓取和識別,達到圖像識別的核心功能。系統實現了圖像識別的移動化、實時化、便捷化,能夠有效地提高對物體的識別精度、識別速度,并且具有占用手機存儲資源低的優點。
關鍵詞:Android;圖像識別;SVM;百度AI;OKHttp協議
中圖分類號:TP319? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)36-0092-03
開放科學(資源服務)標識碼(OSID):
Design and Implementation of Image Recognition System Based on Android
LIU Jie, YU Qi-hong, GE Jun, WANG Lu
(Institute of Information Engineering, Suqian College, Suqian 223800, China)
Abstract: Aiming at the demand of people's flexible and real-time recognition and classification of things seen in daily life, an image recognition system based on Android is designed and developed. Through the image recognition data service interface and image library in Baidu AI open platform, the image data uploaded by users are captured and recognized in real time to achieve the core function of image recognition. The system realizes the mobility, real-time and convenience of image recognition, can effectively improve the recognition accuracy and recognition speed of objects, and has the advantages of low occupation of mobile phone storage resources.
Key words: Android; image recognition; SVM; Baidu AI; OKHttp protocol
1 背景
日常生活中,在人們的身邊伴隨著形形色色的事物,其中最直觀的展現形式就是人們通過自己的肉眼觀察這些事物[1]。得益于當今計算機視覺和圖像處理技術的發展,對圖像進行識別分類的研究和應用場景越來越多,一些軟件公司也成功研發了許多圖像識別應用系統,比如小米的智能識物,錘子科技的圖像處理等[2-3]。但是目前大多數圖像識別應用系統都是在計算機上操作實現的,難以滿足數量龐大的移動用戶的需求[4]。在人們不斷地追求物質生活與精神生活的今天,用戶也渴望著能夠擁有更方便更快捷的方式方法去解決問題,能夠實時地對圖像進行識別分類的工作,在自己的手機上實現物體圖像識別無疑會給人們帶來極大的便利。所以,設計和開發一款基于Android的圖像識別系統,用戶可以隨時隨地拍攝或從手機相冊上傳待識別對象,系統能夠高精度識別圖像,在移動化圖像識別的同時能提高圖像識別的精度和及時性。
2 需求分析
本系統旨在設計出一款手機App,方便人們隨時隨地可以拿出手機來識別自己身邊想要知道的事物。系統在上傳圖片之前可以顯示用戶拍攝的圖片;經用戶確認后通過網絡上傳至服務器;服務器接收到圖片后,開始執行識別程序,并將識別結果返回到客戶端,系統的識別精度也會隨之相應地給出。具體需求如下:
1)運用本系統可以做到對絕大多數事物進行識別,如動物、植物、汽車、菜品;
2)App操作便捷,系統不可過于煩瑣,需要面向大部分人群,老人幼兒都可使用;
3)識別的精確度較肉眼識別的準確,確保對相似物體的識別準確率,要求達到0.7以上;
4)除了可以利用手機攝像頭拍照之外,還可以訪問手機相冊中的圖片,使得圖像采集更加人性化;
5)識別圖像需要快速,效率要高,要求達到1秒以下;
6)手機App在使用一段時間之后,不可占用大量的手機內存,要求在50MB以下。
3 系統設計
3.1 系統功能設計
本系統主要識別4類常見的物體:動物識別、植物識別、汽車識別以及菜品識別。在識別物體之前,首先預判待識別物體是否滿足這4類,經預判后,進入待識別物體界面進行圖像采集,采集之后的圖像經OKhttp協議上傳至服務器,進行圖像的特征提取并識別,然后通過信息交互模塊將識別的信息回傳至客戶端,保存識別數據。系統的流程圖如圖1所示。
3.2 系統功能模塊設計
系統的主要功能是采集用戶的待識別圖像的信息,并且通過設計數據接口向App提供數據源,同時經OKhttp協議上傳至服務器,進行圖像的特征提取并識別,然后通過信息交互模塊將識別的信息回傳至客戶端,保存識別數據。后臺服務程序設計分為:客戶端模塊、數據服務接口和信息交互模塊,系統功能模塊圖如圖2所示。
1)客戶端模塊:此模塊主要設計系統的界面及功能交互,對待識別物體主要分為四類以及數據的記錄的顯示。
2)數據服務接口:當App客戶端向數據服務接口發出請求,處理程序根據對應的請求對圖像進行特征提取與識別的操作,同時返回響應數據提供給App客戶端進行顯示。
3)信息交互模塊:通過OKHttp協議實現攔截器攔截請求,往請求頭里面添加 token,發送同步的GET請求與異步的POST請求。
4 系統實現的關鍵技術
4.1 線性多分類SVM
線性多分類SVM大致可分為兩類[5],本系統使用SVM n(n=2)分類器,它允許不完整的分類和異常的懲罰因子C;內核函數是一個線性的內核函數,不需要任何的指向高維空間的方向映射以及線性的區別。核心代碼如下:
vector<Mat> vecImages;
vector<int> vecLabels;
CvSVM *mySVM = new CvSVM();
CvSVMParams params = CvSVMParams();
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-10);
vector<float> vecDescriptors;
4.2 圖形庫的建立
建立相關的圖片庫,并進行了base64格式的字符串與圖片相互轉化,每樣各30萬張,如表1所示。
服務器端是整個系統的核心,實現的功能主要有:調用百度AI圖像識別接口對圖像的預處理、圖像特征的提取與圖像識別、建立百度AI圖像庫。
4.3 客戶端模塊實現
客戶端模塊的功能是:獲取待識別圖片并上傳至服務器。實現的邏輯表述如下:
1)系統初始界面設計:主要用來展現系統的名稱以及作者,體現了本設計的嚴謹性,該界面主要由ImageView與TextView兩個控件組成。
2)系統主界面設計:用handler處理機制,使初始界面在三秒后進入主界面activity_main,該界面按照系統的實際需求,分為4種常見的圖像種類識別,分別為動物、植物、汽車、菜品。系統主界面上每個圖標點擊時可以識別不同的事件,空白部分用于存儲用戶的使用記錄,如圖3所示。
3)圖片上傳界面設計:將拍照所得或圖庫中的圖片上傳到服務器,點擊拍照/圖庫按鈕,響應上傳圖片事件。此處,通過OKHttp協議,向Web站點發送GET請求、POST請求,并從Web站點取得響應,獲取圖片相關信息以及可信度的評估,圖4所示為動物上傳后的識別測試。
4.4 服務器模塊實現
服務器端是整個系統的核心,實現的功能主要有:調用百度AI圖像識別接口對圖像的預處理、圖像特征的提取與圖像識別、建立百度AI圖像庫。實現的邏輯表述如下:
1)百度相同圖/相似圖/商品圖檢索:API服務支持開發者基于自建圖片庫進行入庫、檢索、刪除、更新操作。開發者在控制臺創建應用后,需要在控制臺-應用詳情頁申請建庫,建庫成功后相關接口能力可正常調用。
2)申請建庫時,圖庫的圖片數量上限為50萬,避免浪費資源;如果容量不夠用,可以申請擴容,每次擴容的申請上限也是50萬,可以反復申請擴容,原則上圖庫總量無上限。
3)圖像搜索已上線圖庫管理功能:支持對圖庫里的圖片進行可視化管理,可小批量上傳圖片、預覽大圖、修改摘要和分類信息、刪除圖片、查詢某張圖是否在庫里,入口在控制臺-應用詳情頁管理圖庫。識別的前提是需要對識別功能做一個簡單的訓練:先對圖片進行預處理,更加突出特征,然后采用的特征來進行訓練,所以提取圖像的HOG特征,加入SVM訓練器,經過幾分鐘后將會得到一個識別模型,該模型將是后期識別物體所需要的模型[6],也就是說,機器通過該模型就具備了識別所選物體種類的能力。
4.5 信息交換模塊實現
信息交互模塊主要功能就是將客戶端與服務器連接起來。為了在Android項目中使用OkHttp,首先需要登錄http://square.github.io.okttp/站點下載OKHttp的兩個JAR包,即okhttp-3.10.0.jar和okio-1.14.0.jar (版本號可能更新)。在Android Studio中添加第三方JAR包只需如下兩步。
Step1:拷貝JAR包:將okhttp-3.10.0.jar和okio-l.14.0jar添加到Android項目中的libs目錄下。
Step2:添加庫:在AndroidStudio左上角的項目管理界面中切換為Project視圖,在該視圖下選中okhttp-3. 10.0.jar和okio-l.14.0.jar兩個JAR包,單擊鼠標右鍵,在彈出的快捷菜單中單擊Add As Library即可。
為Android項目添加了OKHttp之后,接下來即可使用OKHttp來實現網絡通信了。客戶端與服務器端的信息交互主要通過使用OkHttp來完成,主要代碼如下:
public HttpResponseListener(Context context, Request<?> request,
HttpListener<T> httpCallback, boolean canCancel, boolean isLoading) {
this.mContext = context;
this.mRequest = request;
if (context != null && isLoading) {
mWaitDialog = DialogUtils.initLoadingDialog(context, "正在加載中...");
}
this.callback = httpCallback;
}
@Override
public void onStart(int what) {
}
5 測試結果分析
系統的測試結果的分析主要從圖像識別的精度、圖像識別的速度以及識別之后占用手機內存空間的大小進行分析。以圖像識別精度為例,手機上經過多次測試之后,得到了大量的測試結果,經過精心的比較與分析之后,得出了如表2所示統計表。
最終測試結果經過分析后,平均識別率已經可以達到0.7以上,達到了系統設計預期要求。
6 結束語
基于Android的圖像識別分類系統主要包括客戶端模塊、數據服務接口和信息交互模塊等。客戶端通過拍照或從手機相冊中獲取一個待識別的圖片對象,之后通過使用OKHttp協議將圖片上傳至網絡,圖片接收服務器接收圖片并保存到指定目錄,經過圖像識別服務器讀取指定目錄識別目錄下的圖片,然后將結果信息返回Android 客戶端進行顯示,并使得識別的精度達到0.7以上,系統實現了圖像識別的移動化、實時化、便捷化。
參考文獻:
[1] 陳新磊.基于灰度變換及邊緣檢測的腦地形圖像識別算法的研究[J].電腦編程技巧與維護,2019(3):131-133.
[2] 張寶燕.基于深度學習模型的圖像識別應用研究[J].山西電子技術,2020(6):87-89,93.
[3] 倪凡,舒彧,馮光璐.圖像識別技術的應用與發展[J].產業創新研究,2020(22):44-45,48.
[4] 黃曉璐.基于計算機智能圖像識別的算法與技術研究[J].電子制作,2020(22):67-68.
[5] 管峻,毛保磊,劉慧英.利用單分類SVM算法檢測Android應用程序[J].計算機系統應用,2021,30(6):148-153.
[6] 劉思,馬靖瑜,袁倩,等.基于邊緣計算的人臉識別系統[J].軟件工程,2020,23(12):40-42.
【通聯編輯:謝媛媛】