呂文杰 魏孝虎 陳眾孚 童灝 馬燕
摘要:圖像識別技術近年來被運用得越來越廣泛。應用圖像識別技術進行垃圾分類成為研究的熱點。該文介紹了一種基于卷積神經網絡,利用Tensorflow、Android系統開發的能通過拍照自動識別垃圾類別的應用程序。
關鍵詞:圖像識別;垃圾分類;卷積神經網絡
中圖分類號:TP399 文獻標識碼:A
文章編號:1009-3044(2020)05-0203-02
開放科學(資源服務)標識碼(OSID):
由于計算機運算速度的提升,近年來,圖像識別技術得到了巨大的發展。一些經典的分類算法,比如,基于SVM分類器的圖像分類算法[1]已逐漸被卷積神經網絡[2]所替代。盡管卷積神經網絡依然處于一種“黑盒”的狀態,將卷積神經網絡運用到圖像識別的技術中有著非常好的效果。因而誕生了諸如AlexNet、GoogLeNet這樣的模型,使得圖像識別被廣泛運用到現實生活中成為可能。
垃圾分類也是近年來比較熱門的一個話題。上海在今年的7月實施了《上海市生活垃圾管理條例》,正式宣告將對垃圾分類進行嚴格的管制。與此同時,全國各地的其他城市也紛紛效仿,開始推行垃圾分類的相關措施。但是,市面上關于垃圾自動分類的產品依然不多。因而,本文結合基于卷積升級網絡的圖像識別算法,開發了一種通過拍照自動識別垃圾類別的手機應用,可對日常的垃圾分類起到一定的幫助。
1 開發思路
如果訓練一個基于卷積神經網絡的識別垃圾的模型,需要耗費大量的物力和人力。需要列舉出大量的生活物品,并根據這些生活物品收集大量的照片;構建一個比較復雜的網絡,對于類別個數多,樣本個數多的數據集來說,一個較淺的網絡無法訓練出很好的效果;再通過高性能的計算機進行訓練,由于網絡的結構比較復雜,這將耗費大量的時間。這種方法是難以實施的。
生活垃圾的分類,可以看成生活中常見物體的識別。并且,現在市場上,有許多開源的,已經訓練好的模型可以用于識別常見物體。這些模型已經經過了很多測試和改進,有著非常好的性能。本文采用的,即是Google的Inception-v3模型。具體的思路為:先用Inception-v3對物體進行識別,再將分類得到的結果映射到其對應的垃圾類別,即可完成垃圾的分類。
此外,考慮到應用使用的便利性,以及國內手機用戶所使用的操作系統,本文決定基于Android系統開發這款應用。
2 Inception橫型的介紹
Google推出Inception模型的目的是為了解決稀疏矩陣計算速度較慢的問題。深度網絡存在著以下幾點的問題:
1)神經網絡的層數越深,將出現梯度彌散,導致前面幾層的作用消失。
2)神經網絡的參數越多,越容易過擬合,導致模型實際效果不好。
3)神經網絡越大,計算成本也就越高。
為了解決上述這些問題,往往會采用稀疏連接,從而打破神經網絡的對稱特性,同時提高模型的準確率,防止過擬合的 現象出現。但是稀疏鏈接會導致訓練模型時的計算成本大大增加,計算機的軟件和硬件對于稀疏結構的計算能力都比較有限。Google為了能夠找到一種方法,使得能夠利用密集矩陣的高計算性能的同時,保持網絡的稀疏結構以提高模型的準確率,從而提出了Inception的結構,Inception結構有如下特點:
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的卷積核卷積來替代。
這種做法可以減少很多的參數,減輕過擬合現象,同時也增加了非線性的特性。再Inception-v3的論文中提到,這種非對稱的卷積結構拆分,其結果比堆成地拆分為幾個相同的小卷積核效果更佳明顯,可以處理更為復雜的空間特征。
與此同時,Inception模型也在Inception-v3得到了相應的優化,增加了8*8、17*17、35*35這三種不相同的卷積核尺寸。且這些模型不會再模型的前半部分出現,前半部分采用的依然是一些普通的卷積層。在模型的后半部分才開始出現改進后的Inception模型。
總的來說,將Inception-v3模型用于圖像的分類和識別有著不錯的效果。
3 具體實現
本文使用基于Android Studio的開發環境和Java語言進行Android應用程序的編寫。本文開發了一個ImageClassification類,專門用于做普通的圖像識別。
首先,在build.gradle文件中寫入如下語句,來將Tensorflow框架的移動版本加入項目中:
implementation 'org.tensorflow:tensorflow-android:+'
其次,調用Tensorflow模型的關鍵語句為:
TensorFlowlnferencelnterface inferencelnterface=new Ten-sorFlowInferenceInterface(context.getAssetsO,M ODE L_FILE) 其中,MODEL FILE為需要調用的模型的名稱,我們將Google的移動版的Inception-v3模型和其標簽放入main\assests這個文件夾下,即可將模型加載到內存當中去。
再通過如下代碼:
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。圖像歸一化可以通過以下代碼實現:
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為假定的圖像像素的標準差。在本應用中,將其分別設置為117和3,經試驗發現這種設置有著較好的效果。在ouputs中會返回相應的編號。根據編號可以對應lmagen-et_comp_graph_label_strings.txt本文文件中的行號,查找到相應的名稱。
最后,通過構造一個ImageClassification類的實例,再通過該實例調用imageclassification0方法,傳人一個bitmap和當前活動的上下文即可完成分類,該方法將返回一個String類型的字符串,其內容即是分類的結果和可信度,具體代碼如下所示:
ImageClassification imageClassification= new ImageClassifi-cation0;
String englishResult= imageClassification.imageclassification(bitmap, getContext0);
再將英文結果翻譯為中文結果,映射到相應的垃圾類別輸出即可。這是該應用最為核心的代碼,其余代碼較為簡單,在此不多贅述。
4 結束語
基于卷積神經網絡開發的垃圾自動分類應用程序,可以將手機拍攝的照片經過壓縮和處理后輸入到Google的Inception-v3模型中,識別出相關的結果并映射到對應的垃圾類別。該應用可以識別1000多種物體,并且不需要連接網絡,使用起來十分便利。整個項目的工程文件和源代碼可在Github開源社區中下載使用,地址為: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].電子技術與軟件工程,2018(18):20-22.
[5]吳健,陳豪,方武.基于計算機視覺的廢物垃圾分析與識別研究[J].信息技術與信息化,2016(10):81-83.
【通聯編輯:唐一東】
收稿日期:2019 -11-15
作者簡介:呂文杰(1998-),男,上海人,學士,主要研究方向為模式識別;魏孝虎(1998-),男,安徽蕪湖人,學士,主要研究方向為模式識別;陳眾孚(1999-),男,上海人,學士,主要研究方向為模式識別;童灝(1999-),男,上海人,學士,主要研究方向為模式識別;通訊作者:馬燕(1970-),女,浙江海寧人,上海師范大學信息與機電工程學院計算機系教授,主要研究方向為圖像分割、模式識別和三維建模等。