呂文杰 魏孝虎 陳眾孚 童灝 馬燕
摘要:圖像識別技術(shù)近年來被運用得越來越廣泛。應用圖像識別技術(shù)進行垃圾分類成為研究的熱點。該文介紹了一種基于卷積神經(jīng)網(wǎng)絡(luò),利用Tensorflow、Android系統(tǒng)開發(fā)的能通過拍照自動識別垃圾類別的應用程序。
關(guān)鍵詞:圖像識別;垃圾分類;卷積神經(jīng)網(wǎng)絡(luò)
中圖分類號:TP399 文獻標識碼:A
文章編號:1009-3044(2020)05-0203-02
開放科學(資源服務(wù))標識碼(OSID):
由于計算機運算速度的提升,近年來,圖像識別技術(shù)得到了巨大的發(fā)展。一些經(jīng)典的分類算法,比如,基于SVM分類器的圖像分類算法[1]已逐漸被卷積神經(jīng)網(wǎng)絡(luò)[2]所替代。盡管卷積神經(jīng)網(wǎng)絡(luò)依然處于一種“黑盒”的狀態(tài),將卷積神經(jīng)網(wǎng)絡(luò)運用到圖像識別的技術(shù)中有著非常好的效果。因而誕生了諸如AlexNet、GoogLeNet這樣的模型,使得圖像識別被廣泛運用到現(xiàn)實生活中成為可能。
垃圾分類也是近年來比較熱門的一個話題。上海在今年的7月實施了《上海市生活垃圾管理條例》,正式宣告將對垃圾分類進行嚴格的管制。與此同時,全國各地的其他城市也紛紛效仿,開始推行垃圾分類的相關(guān)措施。但是,市面上關(guān)于垃圾自動分類的產(chǎn)品依然不多。因而,本文結(jié)合基于卷積升級網(wǎng)絡(luò)的圖像識別算法,開發(fā)了一種通過拍照自動識別垃圾類別的手機應用,可對日常的垃圾分類起到一定的幫助。
1 開發(fā)思路
如果訓練一個基于卷積神經(jīng)網(wǎng)絡(luò)的識別垃圾的模型,需要耗費大量的物力和人力。需要列舉出大量的生活物品,并根據(jù)這些生活物品收集大量的照片;構(gòu)建一個比較復雜的網(wǎng)絡(luò),對于類別個數(shù)多,樣本個數(shù)多的數(shù)據(jù)集來說,一個較淺的網(wǎng)絡(luò)無法訓練出很好的效果;再通過高性能的計算機進行訓練,由于網(wǎng)絡(luò)的結(jié)構(gòu)比較復雜,這將耗費大量的時間。這種方法是難以實施的。
生活垃圾的分類,可以看成生活中常見物體的識別。并且,現(xiàn)在市場上,有許多開源的,已經(jīng)訓練好的模型可以用于識別常見物體。這些模型已經(jīng)經(jīng)過了很多測試和改進,有著非常好的性能。本文采用的,即是Google的Inception-v3模型。具體的思路為:先用Inception-v3對物體進行識別,再將分類得到的結(jié)果映射到其對應的垃圾類別,即可完成垃圾的分類。
此外,考慮到應用使用的便利性,以及國內(nèi)手機用戶所使用的操作系統(tǒng),本文決定基于Android系統(tǒng)開發(fā)這款應用。
2 Inception橫型的介紹
Google推出Inception模型的目的是為了解決稀疏矩陣計算速度較慢的問題。深度網(wǎng)絡(luò)存在著以下幾點的問題:
1)神經(jīng)網(wǎng)絡(luò)的層數(shù)越深,將出現(xiàn)梯度彌散,導致前面幾層的作用消失。
2)神經(jīng)網(wǎng)絡(luò)的參數(shù)越多,越容易過擬合,導致模型實際效果不好。
3)神經(jīng)網(wǎng)絡(luò)越大,計算成本也就越高。
為了解決上述這些問題,往往會采用稀疏連接,從而打破神經(jīng)網(wǎng)絡(luò)的對稱特性,同時提高模型的準確率,防止過擬合的 現(xiàn)象出現(xiàn)。但是稀疏鏈接會導致訓練模型時的計算成本大大增加,計算機的軟件和硬件對于稀疏結(jié)構(gòu)的計算能力都比較有限。Google為了能夠找到一種方法,使得能夠利用密集矩陣的高計算性能的同時,保持網(wǎng)絡(luò)的稀疏結(jié)構(gòu)以提高模型的準確率,從而提出了Inception的結(jié)構(gòu),Inception結(jié)構(gòu)有如下特點:
1) Google在同- Inception層中采用了不同尺寸的卷積核,分別為1*l、3*3、5*5,才用這些尺寸了原因是為了保證圖像輸出時都能到達28*28的同一尺寸(只需要通過padding操作即可達到該目的)。
2)采用不同尺寸的卷積核的初衷,即是使用不同大小的局部感受野,并將不容尺寸的特征融合在一起。
3) Inception層中加入了pooling的操作,提取出較為重要的特征。
Inception-vl融合了9個Inception模型組成了一個22層的深度模型,并再最后采用了平均池化層來替代了全連接層。使得模型最終的準確率高于AlexNet。
Inception-v3則將較大的卷積核進行了拆分,考慮了n*l這種類型的卷積核,替代n*n的卷積核。即任意一個n*n的卷積核,都會通過一個l*n的卷積核卷積后接上一個n*l的卷積核卷積來替代。
這種做法可以減少很多的參數(shù),減輕過擬合現(xiàn)象,同時也增加了非線性的特性。再Inception-v3的論文中提到,這種非對稱的卷積結(jié)構(gòu)拆分,其結(jié)果比堆成地拆分為幾個相同的小卷積核效果更佳明顯,可以處理更為復雜的空間特征。
與此同時,Inception模型也在Inception-v3得到了相應的優(yōu)化,增加了8*8、17*17、35*35這三種不相同的卷積核尺寸。且這些模型不會再模型的前半部分出現(xiàn),前半部分采用的依然是一些普通的卷積層。在模型的后半部分才開始出現(xiàn)改進后的Inception模型。
總的來說,將Inception-v3模型用于圖像的分類和識別有著不錯的效果。
3 具體實現(xiàn)
本文使用基于Android Studio的開發(fā)環(huán)境和Java語言進行Android應用程序的編寫。本文開發(fā)了一個ImageClassification類,專門用于做普通的圖像識別。
首先,在build.gradle文件中寫入如下語句,來將Tensorflow框架的移動版本加入項目中:
implementation 'org.tensorflow:tensorflow-android:+'
其次,調(diào)用Tensorflow模型的關(guān)鍵語句為:
TensorFlowlnferencelnterface inferencelnterface=new Ten-sorFlowInferenceInterface(context.getAssetsO,M ODE L_FILE) 其中,MODEL FILE為需要調(diào)用的模型的名稱,我們將Google的移動版的Inception-v3模型和其標簽放入main\assests這個文件夾下,即可將模型加載到內(nèi)存當中去。
再通過如下代碼:
inferencelnterface. feed(input_name, floatValues, 1, in-put_size_width, input_size_height,3);
inferencelnterface.run(outpur_names,false);
inferencelnterface.fetch(output_name, outputs);
即可運行模型。其中input_name為模型輸入Tensor的名稱,floatValues為歸一化后的圖像RCB值,output_name為模型輸出Tensor的名稱。input_szie和output_size分別為模型所需要的,輸入圖像的尺寸。Inception-v3所需要的尺寸為224*224。圖像歸一化可以通過以下代碼實現(xiàn):
for (int i=0;i
final int val= intValues[i];
floatValues[i*3+0]=《(val>>16)& OxFF) - imageMean)/imageStd;
floatValues[i*3+1】=《(val>>8)&OxFF) - imageMean)/imageStd;
floatValues[i*3+2】=《val& OxFF) - imageMean)/imageS-td;}
其中,inValues為原圖像的RGB值,可以通過讀入Bitmap格式的圖片獲得。imageMean為假定的圖像像素平均值,im-ageStd為假定的圖像像素的標準差。在本應用中,將其分別設(shè)置為117和3,經(jīng)試驗發(fā)現(xiàn)這種設(shè)置有著較好的效果。在ouputs中會返回相應的編號。根據(jù)編號可以對應lmagen-et_comp_graph_label_strings.txt本文文件中的行號,查找到相應的名稱。
最后,通過構(gòu)造一個ImageClassification類的實例,再通過該實例調(diào)用imageclassification0方法,傳人一個bitmap和當前活動的上下文即可完成分類,該方法將返回一個String類型的字符串,其內(nèi)容即是分類的結(jié)果和可信度,具體代碼如下所示:
ImageClassification imageClassification= new ImageClassifi-cation0;
String englishResult= imageClassification.imageclassification(bitmap, getContext0);
再將英文結(jié)果翻譯為中文結(jié)果,映射到相應的垃圾類別輸出即可。這是該應用最為核心的代碼,其余代碼較為簡單,在此不多贅述。
4 結(jié)束語
基于卷積神經(jīng)網(wǎng)絡(luò)開發(fā)的垃圾自動分類應用程序,可以將手機拍攝的照片經(jīng)過壓縮和處理后輸入到Google的Inception-v3模型中,識別出相關(guān)的結(jié)果并映射到對應的垃圾類別。該應用可以識別1000多種物體,并且不需要連接網(wǎng)絡(luò),使用起來十分便利。整個項目的工程文件和源代碼可在Github開源社區(qū)中下載使用,地址為:https://github.com/lvl l O/RubbishRecog,
參考文獻:
[1] Liu L F,Ma Y,Zhang X F,et aI.High discriminative SIFT fea-ture and feature pair selection to improve the bag of visualwords modeI[Jl.IET Image Processing, 2017,11(11):994-1001.
[2]郭霖.第一行代碼Android[Ml.北京:人民郵電出版社,2014.
[3](美)Ian Goodfellow,(加)Yoshua Bengio,(加)Aaron Courville著.深度學習[Ml.趙申劍,黎或君,符天凡,李凱譯,北京,人 民郵電出版社,2017:201-226.
[4]鄭攀海,郭凌,丁立兵,基于TensorFlow的卷積神經(jīng)網(wǎng)絡(luò)的研究與實現(xiàn)[J].電子技術(shù)與軟件工程,2018(18):20-22.
[5]吳健,陳豪,方武.基于計算機視覺的廢物垃圾分析與識別研究[J].信息技術(shù)與信息化,2016(10):81-83.
【通聯(lián)編輯:唐一東】
收稿日期:2019 -11-15
作者簡介:呂文杰(1998-),男,上海人,學士,主要研究方向為模式識別;魏孝虎(1998-),男,安徽蕪湖人,學士,主要研究方向為模式識別;陳眾孚(1999-),男,上海人,學士,主要研究方向為模式識別;童灝(1999-),男,上海人,學士,主要研究方向為模式識別;通訊作者:馬燕(1970-),女,浙江海寧人,上海師范大學信息與機電工程學院計算機系教授,主要研究方向為圖像分割、模式識別和三維建模等。