999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Tensorflow的Android端相冊分類App設計與實現

2020-04-09 03:16:48
浙江工業大學學報 2020年2期
關鍵詞:分類模型

(浙江工業大學 信息工程學院,浙江 杭州 310023)

如果手機中相片數量非常龐大,那么用戶尋找到一張特定的圖像或者一類圖像就會非常困難。自動相冊分類是解決這個問題的重要途徑,也是很多相冊類應用的基本功能。目前,由于移動端的算力限制,相冊分類的實現方式,包括iOS系統相冊、騰訊相冊寶等應用,大多是將相冊共享到云端,由高算力服務器進行圖像分類并給照片打上標簽,重新下發到移動端,再由移動端根據標簽完成圖像分類[1-3]。這樣的做法缺點非常明顯,可以歸納為:1)沒有連接互聯網就無法進行分類,運行環境苛刻;2)用戶拍照和相片分類之間存在時間差,無法實時進行圖像分類;3)由于要上傳用戶相片,用戶的隱私無法保障,存在安全隱患。采用基于移動端本地對圖像進行圖像分類的方案可以有效地解決上述問題。移動端進行圖像分類的最大困難在于如何利用移動端有限的算力,達到和服務器類似的分類效果。2017年,谷歌針對移動端推出了TensorflowLite神經網絡框架[4]。通過該框架可以在移動端運行InceptionV3[5]圖像識別神經網絡,并達到較高的準確率。

本研究目標是基于TensorflowLite框架和相關圖像識別算法,開發一款可以由移動設備獨立進行圖像分類,并且兼顧時效性和有一定準確度的移動端應用軟件。接下來將圍繞相冊分類軟件App的結構設計和實現、圖像識別神經網絡的改進、圖像識別神經網絡的訓練、神經網絡移動端移植圖像分類功能的驗證四方面來論述。

1 相冊分類App的總體設計

相冊分類App(以下簡稱App)主要遵循軟件工程中經典的Model-View-Presenter(MVP)模式[6-8]。視圖(View)層、邏輯(Presenter)層和數據(Model)層三層彼此獨立解耦,從而讓軟件獲得較好的拓展性和魯棒性。

App主要由圖1所示的三大模塊組成:主工程模塊、基礎層Framework模塊以及圖像識別模塊。主工程模塊負責承載App的界面顯示和邏輯,并初始化圖像識別模塊和基礎層模塊。通過讀取系統相冊,將系統內所有的圖片路徑管理在一個字典(dict)中,通過圖像識別模塊給所有圖片打上分類標簽。并按標簽并保存在數據庫。最后通過分類標簽,進行圖片歸類并通過視圖界面呈現?;A層Framework模塊向所有模塊提供通用基礎功能,比如數據庫訪問、代碼編寫中的工具類和網絡庫等。其中,工具類包括字符工具類、圖像工具類和url拼接工具類等。另外,為了保證代碼質量,通常會編寫單元測試進行代碼邏輯檢查或者一些Lint靜態腳本來保證代碼的書寫規范。圖像識別模塊是本文的核心功能模塊,是真正進行圖片識別和分類的模塊。主工程會在App初始化階段向圖像識別模塊注入配置參數并初始化。圖像識別模塊向主工程暴露自己的功能接口,App具體表現為識別某一張圖片并返回該圖片類別的概率數據。圖像識別模塊通過在Android上執行TensorflowLite框架,并在該框架上運行利用InceptionV3改進的圖像分類神經網絡模型來實現圖像分類的主要功能。構建該功能將面臨三大問題:1)選取并改進性能強大、功耗合適的卷積神經網絡;2)對卷積神經網絡重新訓練,能夠適應移動端的分類需求;3)如何進行卷積神經網絡的移動端移植。接下來的內容將圍繞這三個問題進行闡述。

圖1 App的主要架構

2 分類神經網絡的改進

圖像分類是本文的核心,其中起到圖像分類主要作用的是圖像分類的卷積神經網絡。運行在服務器端上的傳統圖像分類網絡通常如圖2所示,分為圖像預處理層、特征提取層以及分類器。服務器具有強大的計算能力,為了更高的識別準確度,通常使用層數很深的卷積神經網絡來提取更多的特征向量,這一類神經網絡典型為VGG-16。

圖2 傳統圖像分類神經網絡

VGG-16共有16 個卷積層,包含1.38 億個參數,無論是訓練還是具體特征提取,對設備性能的消耗都非常高。另外,由于服務器強大的算力,最后的分類器可以設置更多的參數來精準地區分特征向量,達到更細顆粒度的圖像類別劃分。表1展示了VGG-16和AlexNet的計算量[9],用FLOPS(即相同時間完成神經網絡計算所需要的浮點計算量)來表示,單位是Gb。AlexNet是第一代卷積神經網絡,其計算量相對較小,但是精準度也隨之降低。VGG-16的計算量是AlexNet的20倍左右,每秒需要16 Gb的浮點運算量,這在移動設備上運行將會非常緩慢,所以有必要對圖像提取層進行改善。

表1 VGG-16和Alex-Net的計算量

最直接的改善方式就是替換特征提取層,筆者將使用適合移動設備的特征提取網絡來替換VGG-16進而改進神經網絡的性能。表2展示了近年經典圖像分類模型的錯誤率[10],可以看出:自從2012年ImageNet的ILSVRC圖像識別挑戰賽創辦以來,圖像識別神經網絡的準確率有了長足的進步[11-13]。

表2 歷年圖像分類模型Top 5錯誤率

Table 2 Over the years image classification model Top 5 error rate

年份模型名稱Top5錯誤率/%2012AlexNet15.302013ZFNet14.802014GoogleNet(InceptionV1)6.672015InceptionV35.60

其中InceptionV3功耗適中,圖像識別的準確率高[12],在圖像識別方面表現優秀。神經網絡的最后一層一般為一個全連接層,在全連接層之前的神經網絡被稱作瓶頸層(BottleNeck),可以作為特征提取層來使用。已經通過訓練的Inception-V3模型性能優秀,其瓶頸層僅僅通過一個單層的全連接網絡就可以區分1 000 種類別的圖像[12]。這說明InceptionV3的瓶頸層輸出可以作為圖像簡練且表義明確的特征向量,并可以利用該特征向量進行進一步的分類。

InceptionV3通過卷積堆疊、引入Batch-Norm算法以及卷積降緯等方法,減少神經網絡的深度,改善卷積核心的大小以及數量,從而改善神經網絡的功耗[13]。InceptionV3神經網絡的參數總量為2 400 萬左右,相當于VGG-16的六分之一。改進后的圖像分類神經網絡如圖3所示。

圖3 基于IncetionV3的圖像分類神經網絡

在改進的神經網絡模型中,使用InceptionV3的特征提取層來替換VGG-16作為整個神經網絡的特征提取層,并將其輸出的特征向量輸入全連接層進行進一步的分類。另外,由于移動端的相冊應用并不需要InceptionV3多達1 000 多種的分類能力,所以需要重新訓練神經網絡的分類器,即全連接層,降低分類標簽的數量,來滿足客戶端的分類需求,這一部分內容將在第4部分進行闡述。

3 模型性能對比

神經網絡的性能通常用準確率和計算量來衡量。其中,準確率指在分類的過程當中正確的預測占全部預測的比例,計算公式為

(1)

式中:TP代表正確的預測;FP代表錯誤的預測。準確率主要用來衡量模型對事物類別判斷能力的高低。

計算量主要衡量模型對算力的要求,在實際測算當中,通常使用同一數據集合的運算時間來間接表示。本次數據集采用公開數據集Pascal VOC 2007,總計20 個大類,9 963 張被標注的圖片,標注對象是常見的人、狗和汽車等。性能測試實驗的設計如表3所示,加入了AlexNet作為特征提取層的神經網絡作為對照組。在實驗中隨機抽取各個大類的200 張圖片,總計4 000 張圖像作為實驗數據。三次圖像處理過程均運行在同一臺硬件平臺上,Tensorflow平臺均開啟GPU加速。

表3 性能測試實驗設計

由表4可知:VGG-16作為特征提取層的準確率最高,但是運行時間非常長,對性能的要求最高;InceptionV3模型雖然準確率相對VGG-16低,但仍在移動端相冊分類可以接受的誤差范圍內,但是其突出特點是運行速率相對于VGG-16大幅度提升,對設備性能要求最低;AlexNet雖然速度最快,但是其精準度比較低,對用戶體驗存在較大影響。在不大幅損失準確率的前提下,使用InceptionV3作為特征提取層,大幅降低了計算復雜度,符合移動端圖像分類的特點。

表4 性能測試實驗結果

4 模型的遷移訓練

訓練InceptionV3圖像分類的數據集有120 萬被標注的圖片,收集圖片數據集,并且利用數據集重新訓練一個模型非常費時,可能需要幾天甚至幾周。為了解決訓練一個全新的神經網絡而產生的效率問題,遷移學習應運而生。遷移學習就是將已經在某個問題上訓練好的模型,通過相對簡單的調整,使其能夠適應新的問題。在保留已經訓練好神經網絡瓶頸層輸出基礎上,通過替換最后一層全連接層,可以讓該模型解決新的圖像分類問題[14-16]。從上文可知:IncetionV3的瓶頸層具有良好的性能。通過遷移訓練,可以讓InceptionV3瓶頸層輸出和全連接層組成的神經網絡獲得識別特定類目的圖像的能力。

全連接層的訓練網絡的設計如圖4所示。圖4中線條上的數字代表一次訓練過程中神經網絡中數據流向的先后順序。相同的數字編號的數據傳遞過程是同時進行的。整個過程利用不斷迭代前向傳播,后向傳播更新參數,讓交叉熵收斂,最終達到神經網絡訓練的目標。綜合神經網絡訓練以及前后期工作,整個遷移訓練的關鍵步驟歸納如下:1)圖像預處理和數據集獲取;2)獲取瓶頸層輸出并緩存;3)定義全連接層;4)訓練全連接層;5)模型性能數據的輸出。

圖4 全連接層訓練網絡

移動端的相冊模型分類不同于照相時的實時場景識別,并不需要區分1 000 多個類別,這樣會導致模型過于龐大以及因分類過于具體而準確率低下。對于移動端,只需要分類出“單人肖像”“多人照片”“物體”“植物”等較為抽象的詞匯即可,而無需具體區分出“鼠標”“筆”等具體事物。所以,筆者的分類模型選取了13 個比較常見的分類詞目。接下來將結合移動端的實際需求對模型遷移進行闡述。

4.1 圖像預處理和數據集獲取

相較于訓練一個全新的模型,遷移學習對于圖像數據集數量的要求大大降低,但是對于一個單一的類目識別,同樣需要數百個樣本圖像。

基于python語言編寫爬蟲腳本是獲取圖片數據集的重要途徑。圖5展示了爬蟲腳本的主要流程。整個爬蟲腳本由config.py,spider.py和deal_image.py三個文件組成。其中config.py是配置文件,spider.py是爬取腳本,deal_image.py是圖像處理腳本。爬蟲腳本的主要原理是通過Baidu搜圖等圖像搜索引擎發起搜索請求,解析其搜索結果,并逐個下載圖片,并對圖片進行規范化裁切和格式化,最后進行部分人工篩選以保證數據的可用性。本實驗共爬取了13 個圖像類目,保存在13 個文件目錄中,分別以類目名命名。

圖5 圖像爬蟲腳本的主要流程

4.2 獲取瓶頸層的輸出并緩存

瓶頸層的輸出是利用InceptionV3模型對圖像數據集進行處理,獲得每張圖片的特征向量作為全連接層的輸入。為了提升運行效率,需要配合緩存機制對圖片進行存取。數據的流向如圖6所示。

圖6 瓶頸層數據的獲取

在代碼中,通過create_image_lists方法創建數據集列表,將上一小節爬取的圖像按照預先設定的分類比例,將每個圖像類目隨機分為驗證、測試和訓練三個字數據集,并通過InceptionV3模型提取特征向量并緩存。通過get_image_path()方法來獲取對應的某一張圖像的文件絕對路徑。隨后加載已經訓練好的InceptionV3模型,對訓練數據集和特征向量進行提取并緩存。其中train_bottle_neck緩存將作為圖4中瓶頸層輸入,validate_bottle_neck作為標準答案輸入,test_bottle_neck作為最后計算準確率的輸入。

4.3 全聯接層的定義

根據圖4,并利用Tensorflow框架的函數接口可以很方便地定義整個神經網絡當中的元素。首先定義全聯接層的兩個輸入,分別為輸入數據集和標準答案。定義一個輸入數據集,命名為bottoleneck_input,顧名思義是將瓶頸層輸出的特征向量作為輸入。再定義標準答案用于反向傳遞和計算交叉熵,命名為groud_truth_input。這兩個輸入的實質是特征向量,即浮點數組。全連接層的定義需要設定一系列的參數。其初始的weights(權重分布)由tf.trucated_normal(shape,mean,stddev)輸出一個正態分布的矩陣產生,大小(shape)由瓶頸層輸出的矩陣大小(bottleneck_tensor_size)決定,均值(mean)默認為0,標準差(stddev)為0.1。bias(偏置)默認為一個長度為訓練類目個數的全零向量。另外,需要定義交叉熵損失函數(cross_entropy),命名為cross_reduce_mean。交叉熵計算公式為

(2)

損失函數用于描述預測的概率分布p來表達正確概率分布q的困難程度。神經網絡通過不斷調整參數,將損失函數收斂到預定程度。

每次遞歸的對神經網絡參數的優化策略即優化器(train_step),會在每次遞歸時調整神經網絡的參數矩陣。其過程可以表示為

(3)

式中:θn+1表示新的參數;θn表示更新前的參數。本次實驗采用梯度下降優化器(GradientDescentOptimizer),每次調整的幅度,即學習率η為0.01。

最終神經網絡的性能需要通過準確率來表征,準確率命名為accuracy。通過比較最終輸出和驗證數據集是否正確,得到準確率,準確率用于描述模型的識別能力。

4.4 全連接層的訓練

全連接層的訓練網絡定義完成之后將進行全連接層的訓練。訓練的實質是通過反向傳播算法,不斷調整預定義神經網絡參數,讓交叉熵收斂到預定程度的過程,其主要流程如圖7所示。在初始化階段完成后,每次隨機取兩個train_bottle_neck固定數量的子集(batch)分別作為訓練數據集和標準答案。每次訓練都將數據集數據填入用于可視化的Summary數據集,用于實驗結果的可視化。在每次訓練次數達到準確率輸出常量時,取validation_bottle_neck數據集的一個隨機子集(batch)計算一次準確率。在訓練完成后,使用test_bottle_neck數據集進行一次精準度計算。

圖7 神經網絡訓練流程

4.5 模型性能

在遷移訓練完成之后,在TensorBoard(Tensorflow的訓練可視化工具)當中可視化訓練過程。之前在Summary數據集中保存的節點數據,將會以Json格式的數據包保存。而TensorBoard將會解析這個數據包,并繪制模型的訓練圖表。TensorBoard的輸出表格數據較為繁復,筆者將其簡化后重新繪制為圖8,9。

圖8 準確率變化曲線

圖9 交叉熵變化曲線

圖8是模型的準確率變化曲線。100 次左右訓練后,準確率在90%附近波動,并逐漸上升。圖9表示交叉熵隨著訓練進行的變化曲線。前100 次訓練,交叉熵下降明顯,之后趨于穩定。

通過tf.savemodel()方法在指定的文件目錄下,保存整個神經網絡模型的節點數據文件(以*.pb格式保存)和分類標簽(以*.txt格式保存)文件。

5 分類模型在Android端的移植

在第3部分當中訓練的模型,可以在PC端對圖像進行分類。但是,如果需要將該模型運行在Android端,由于性能和兼容性原因,需要進行移植操作。移動工作主要解決兩個問題:即Tensorflow框架在移動端的運行和分類模型針對移動端Tensorflow的文件結構優化。

Tensorflow框架對于移動端十分友好,其后續針對移動端的TensorflowLite框架可以在移動端非常輕松地運行。通過在Android編譯配置文件build.gradle當中添加TensorflowLite的Android Archive(即AAR,Android系統中用于取代傳統Java第三方庫Jar格式壓縮包的數據包格式),就可以通過谷歌Jcenter服務器的Maven代碼倉庫引入TensorflowLite的Android版,可以省去很多兼容性的配置。在此之后,Tensorflow框架可以在Android工程中被開發者調用。

與TensorflowLite同時發布的還有TensorflowLiteConverter模塊(簡稱TOCO)。該模塊用于普通的Tensorflow計算圖向TensorflowLite計算圖的轉換。對于開發者而言,計算圖級別的模型轉化已經可以極大地提高模型在移動端的運行效率。通過該模塊,可以將Tensorflow模型轉換壓縮成TensorflowLite模型。TensorflowLite模型由一個*.pb文件和一個名為label.txt的標簽文件組成。將這兩個模型文件加入Android工程的資源文件包Assets當中,就可以在Android工程中通過TensorflowLite框架動態加載神經網絡,并作為Java接口使用。

6 相冊分類App的分類效果

相冊分類App使用的分類模型總共訓練了13 個類別的識別來滿足日常的圖像分類需求。在應用開啟后會通過Android的系統相冊對象掃描手機中所有的圖像,并對所有圖像進行分類。每一張圖片的分類過程在一個獨立線程中,線程資源通過線程池進行管理和分配。每個圖像分類線程會在后臺通過圖片識別模塊給圖片打上分類標簽。整個圖像分類的時間控制在合理范圍內。相冊分類App安裝在相對比較過時落后的摩托羅拉Nexus 6平臺,相冊分類應用仍然能夠在4 min內完成對總計72 張圖片的分類,在較新的小米5平臺上,同樣數量的照片分類需要2 min左右。

如圖10所示,多線程處理進行圖像識別并不會阻塞視圖主線程而造成頁面卡頓。在相冊分類頁面中,將會逐漸將已經分類好的圖片依次加入。圖像分類的進度會通過Android的“通知”(Notification)顯示(圖10a);和市面上大多相冊App一樣,在照片頁面展示手機存儲的所有圖片(圖10b);在相冊頁會將圖片歸納到不同類別的相冊中,比如動物、文字和人物等(圖10c)。同一張照片可能會有多個分類。點擊相應相冊可以查看該類目下的所有圖片,點擊圖片可以查看圖片的大圖。

圖10 照片頁和相冊頁

如圖11所示,在“物品”類目和“文字”類目當中的圖片,圖像主體識別已經相當準確,但對一些場景非常復雜的情況,會存在主體判別錯誤或者類別識別錯誤的情況。

圖11 “物品”與“文字”類目

7 結 論

雖然以往的相冊類App普遍都有照片分類功能,但普遍會將圖像識別分類的過程在服務器端完成,導致圖像分類實時性不足,并且必須有良好的網絡環境。所以,用戶需要更智能、使用條件更友好的相冊App。結合圖像識別模型和TensorflowLite框架,嘗試將圖像識別分類的過程在移動端本地進行,并在較短時間內完成,可以很好地滿足用戶的需求。通過遷移學習成熟的圖像識別框架,可以讓新的模型滿足不同的圖像分類需求。將訓練好的模型運行在移動端的TensorflowLite框架,可以讓Android應用程序能夠使用該模型進行圖像分類,從而實現相冊分類App的主要功能。在實驗的過程中,除了模型訓練、Android程序編寫等主要步驟外,針對訓練數據集不足和圖像分類模型移動端移植等困難,提供了相應的解決方法。

猜你喜歡
分類模型
一半模型
分類算一算
垃圾分類的困惑你有嗎
大眾健康(2021年6期)2021-06-08 19:30:06
重要模型『一線三等角』
重尾非線性自回歸模型自加權M-估計的漸近分布
分類討論求坐標
數據分析中的分類討論
教你一招:數的分類
3D打印中的模型分割與打包
FLUKA幾何模型到CAD幾何模型轉換方法初步研究
主站蜘蛛池模板: 久久精品日日躁夜夜躁欧美| 国模视频一区二区| 真人高潮娇喘嗯啊在线观看| 久久精品最新免费国产成人| 小说区 亚洲 自拍 另类| 久久久久88色偷偷| 高潮毛片无遮挡高清视频播放| 国产精品成人AⅤ在线一二三四| 专干老肥熟女视频网站| 美女一区二区在线观看| 男女性午夜福利网站| 亚洲中字无码AV电影在线观看| 麻豆国产原创视频在线播放| 欧美一区二区啪啪| 超薄丝袜足j国产在线视频| 中文字幕在线一区二区在线| 欧美特黄一免在线观看| 日韩精品成人网页视频在线| 国产91麻豆免费观看| 精品无码专区亚洲| 99国产精品国产高清一区二区| 又大又硬又爽免费视频| 激情無極限的亚洲一区免费| 99久久精彩视频| 性欧美久久| 国产黄视频网站| 欧美午夜小视频| 欧美亚洲一区二区三区在线| 婷婷五月在线视频| 亚洲AV无码乱码在线观看代蜜桃| 亚洲不卡av中文在线| 91毛片网| 99视频在线免费观看| 久久这里只有精品2| 日韩少妇激情一区二区| 凹凸精品免费精品视频| 欧美69视频在线| 无码av免费不卡在线观看| 国产欧美日韩18| 狠狠色狠狠综合久久| 天天色天天操综合网| 2020亚洲精品无码| 日韩在线2020专区| 高清不卡一区二区三区香蕉| 九九香蕉视频| 青青草91视频| 全午夜免费一级毛片| 亚洲天堂网在线视频| 亚洲欧美一区二区三区图片| 免费不卡视频| 精品国产成人高清在线| 999国内精品久久免费视频| 久久男人视频| 国产激情无码一区二区免费| 国产啪在线91| 四虎国产精品永久一区| 国产网站免费看| av在线人妻熟妇| 婷婷伊人五月| 久青草国产高清在线视频| 99久久亚洲精品影院| 伊人福利视频| 国产一区二区人大臿蕉香蕉| 国产亚洲视频免费播放| AV老司机AV天堂| 亚洲人成网站在线观看播放不卡| 国产国模一区二区三区四区| 青青青国产免费线在| 女人爽到高潮免费视频大全| 2020极品精品国产| 8090成人午夜精品| 国产精品55夜色66夜色| 日韩国产一区二区三区无码| 一本大道无码高清| 久久一日本道色综合久久| 国产亚洲精品yxsp| 四虎影视8848永久精品| 亚洲日本中文字幕天堂网| 草草线在成年免费视频2| 国产美女丝袜高潮| 亚洲AV一二三区无码AV蜜桃| a级免费视频|