文/劉鵬臻
如今,在關注人們的健康和飲食狀況方面,技術手段正扮演越來越重要的角色。因此誕生了許多應用可以讓用戶拍下的食物照片,識別食物并檢測營養成分。怎么及時有效地從食物照片中提取出有用的信息是個挑戰。在食物圖像識別領域,現在也有一些食物圖像識別的項目,這些項目主要基于手工設計特征提取的傳統方法,然后使用機器學習的分類器進行食物分類。本文中,我們提出了一個ResNetcompress50網絡模型,來實現食物識別。
圖像識別屬于人工智能的一個重要領域,國外很多高校和公司在圖像識別方面投入了大量的資金和人力研究。2012年,深度學習技術在圖像識別領域產生了巨大突破,Hinton教授的研究小組在ImageNet的大規模視覺挑戰賽的圖像分類比賽中贏得了第一名,準確率超過第二名10%之多,而其他小組均是使用的傳統的圖像識別方法。同年,谷歌受到深度學習的啟發,發布了基于深度學習的圖像搜索引擎,與之前圖像搜索引擎對比,圖像的準確率得到大幅提升。2015年的ImageNet圖像識別比賽中,微軟亞洲研究院的何凱明等人設計的殘差網絡更是達到了152層之深,并一舉奪得冠軍。2019年Hinton也因為深度學習獲得圖靈獎。

圖1:圖片增強結果示意圖

圖2:瓶頸單元塊結構示意圖
數據集的圖像識別對象是新加坡的常見食物,我們使用爬蟲從網上爬取新加坡食物的圖片,進行數據清洗,給每個圖片貼上準確的食物標簽,進行監督學習。
訓練集中每種食物只包含了400張圖片,為了防止過擬合,這里我們參考使用ResNet論文中的方法進行圖像增強。通過將原始圖像統一調整到256×256像素,對圖片進行截取和翻轉將一張圖片變成多張圖片。截取是指分別在統一調整的圖像左上角,右上角,左下角,右下角以及中間截取五處,截取大小為224×224像素。每張截取的圖片都進行翻轉,一張圖片經過增強處理后,變成十張圖片。如圖1所示,這是一張辣椒螃蟹的圖片進行圖像增強后的結果。
根據相關文獻論文,使用CIFAR-10數據集,同樣深度的深度殘差網絡和普通網絡,深度殘差網絡在解決了深度退化問題,表現顯然更好,所以我們選用深度殘差網絡。我們提出的ResNet-compress50模型是根據何凱明提出的深度殘差網絡50層模型結構改進的,減少了其中卷積層中的卷積核總數的1/4。根據實驗結果顯示,該方案確實大大減少了模型的訓練時間和模型的大小,而準確率沒有明顯衰減。我們的網絡單元塊結構使用了何凱明提出的瓶頸結構,如圖2所示。
我們使用三層網絡來描述殘差函數,三層的卷積核大小分別是1x1,3x3和1x1,其中1x1的卷積層主要是針對輸入和輸出維度不同是,使用1x1的卷積核可以做到先減少維度,后恢復維度,使得3x3的卷積層具有較小的輸入輸出尺寸。瓶頸結構相對于三層卷積層,三種卷積的時間復雜度很接近。這樣設計卷積層的操作不會改變輸入數據的維度,即輸出的特征圖和輸入數據的維度不會改變,在于使用3*3的卷積核卷積層都會配一個大小為1的pad,同時步長被設置為1,同時每做一次池化操作輸出的特征圖的長寬都會縮小一倍。而1*1的卷積核的加入可以進一步增加模型的非線性,并且不會改變特征圖的大小,這就大大增加了模型的表現能力。在輸入方面,因為殘差網絡的輸入設計一般都設置為256或者384等維度,模型不需要根據不同的輸入維度設計不同的卷積結構,這就大大方便了模型的設計,直接加深網絡結構使用同樣的單元塊就可以了。另外,我們在批量規范化層之后的激活函數都使用的是ReLU,ReLU能夠使得函數收斂得更快,取得更高的準確率。在何凱明的另一篇論文中,提出了另一個瓶頸結構,把批量規范化放到相加層之后,如圖3所示。

圖5:相加層使用BN和沒有使用BN對比圖

圖6:使用checkpoint和不使用checkpoint訓練對比圖
組合瓶頸塊結構,根據何凱明提出的殘差網絡結構,如圖4所示。我們的實現的殘差網絡共50層,有4個stage,每個stage分別包含了3,4,6,3個單元塊,為了減少模型的參數以及訓練的時間,我們對模型結構進行了一些改進,減少了卷積層conv2到conv5卷積核的個數,卷積核的個數變為原來的3/4。在輸出層,沒有使用全連接層,這就大大減少了模型的參數,縮短了訓練時間和驗證用時。在輸出之前,殘差網絡使用了全局平均池化層,全局平均池化將最后一層的特征圖進行全局的均值池化,通過輸入平鋪層,形成一個個特征點,然后將這些特征點組成特征向量,通過softmax層進行歸一化處理,計算分類概率。
深度學習訓練平臺使用的是新加坡國立大學的深度學習框架SINGA,現在網絡模型越來越深,數據集也越來越大,目前一般采用的算法時上述兩種方法的折中,訓練方法采用小批量梯度下降法,小批量梯度下降法把數據分為若干個批,按批來更新參數。
我們進行三個實驗,選出最好的模型和超參數。第一個是對比不同層數的普通卷積神經網絡和殘差網絡,以及我們提出的改進的方案性能,數據集采用的是ImageNet,我們初始化網絡參數采用服從期望為0,標準差是0.01的高斯分布,網絡的學習速率被初始化為0.01,每次遇到錯誤率平臺區時學習率除以10,進行下一階段的訓練。為了提升模型的泛化能力,避免過擬合,我們在訓練過程中還使用了權值衰減懲罰技術,其速率參數大小設為0.0001,沖量參數大小設為0.9,目標函數使用了L2范式的正則化處理。

表1:不同網絡模型性能對比

表2:不同Iteration的Accuracy

表3:Sgfood50數據集兩種網絡對比
第二個實驗是在使用了另一種瓶頸結構與普通殘差網絡的瓶頸結構效果進行對比。參數相關設置同實驗一。
第三個實驗是采用了預訓練的方式,在初始化參數時,我們首先使用ImageNet的數據集進行預先訓練,得到的參數作為checkpoint,不再使用隨機參數,而是采用checkpoint。其余設置同實驗一。
3.2.1 實驗設置
使用的硬件設備是單節點機器,使用GPU進行訓練,單節點包含了3個NVIDIA GeForce GT 970 GPU,每個GPU內存4G,操作系統是Ubuntu16.04。
數據集一共包含了50種新加坡常見食物,整個數據集共有二十萬張圖片,訓練集和驗證集的比例我們設置成9:1,即訓練集有18萬張圖片,驗證集有2萬張圖片。
3.2.2 實驗結果分析
第一個實驗對比卷積神經網絡和殘差網絡。我們使用SINGA訓練了五種不同的網絡,普通卷積神經網絡19層34層及深度殘差網絡的19層,34層和50層結構。如表1所示,普通神經網絡參數大,錯誤率高。而使用ResNet則解決了梯度消失的問題,網絡越深,識別率效果越好,模型相對普通卷積神經網絡要小得多。
第二個實驗我們在第一個實驗基礎上,選擇ResNet-compress50進行繼續訓練,對50層模塊進行改進,在一個瓶頸基礎塊中的相加層之后加上批量規范化層。在使用了不同的瓶頸單元塊之后,50層的網絡結果的變化,實驗結果如圖5所示,實驗證明在相加層之后使用了模型規范化在本數據集中是較好的選擇。
第三個實驗是關于訓練方式的優化,如圖6所示,顯然使用了checkpoint的參數進行訓練的效果要好很多,通過優化,ResNetcompress50的網絡的預測準確率可以達到82.3%,準確度甚至更優,訓練收斂速度更快。
模型的訓練時間。訓練一個50層的模型需要大量的時間,使用殘差網絡向前傳播大概一張圖片需要3到4秒鐘。在我們的實驗中,訓練的時間主要受幾方面影響,一個是GPU的性能,如果使用CPU,訓練時間可能達到一周甚至更久,輸入圖片的大小,以及我們的迭代次數和mini-batch的大小。根據粗略的估計,我們使用ImageNet進行預訓練的時間大概需要10個小時,然后使用預訓練的參數模型進行訓練需要7個小時左右。
最終,我們在實現神經網絡選用的是50層的殘差網絡,訓練方法采用使用ImageNet數據集進行預訓練得到的參數進行初始化模型,再使用基于mini-batch的隨機梯度下降算法進行訓練和權重更新。第一種食物準確率達到82.3%,前五種食物的識別準確率可達95.2%。
3.2.3 模型性能評估
最后,對我們的ResNet-compress50模型的評估,我們主要從三個方面進行評估。
第一個方面是ResNet-compress50模型的準確率Accuracy,系統的功能測試結果,我們得到第一名的預測結果準確率達到82.3%,前五位包含正確結果準確率達到95.2%。如表2所示。
第二個方面是,模型參數大小,訓練總長,主要通過與原始ResNet50模型的對比。模型大小是92MB,訓練時間需要7個小時左右,相對于原始的ResNet50網絡,我們訓練時間縮短了4個小時,模型大小也縮小了35MB,而模型識別的準確率幾乎沒有明顯變化,訓練時間的縮短對于日后使用用戶數據集進行持續訓練是大有好處的,對比結果如表3所示。
第三個方面是訓練時間和預測時間,針對NVIDIA GeForce GT 970 GPU,加速庫使用的是cuDNN5.1,每次迭代訓練時間是測出一個minibatch一次迭代的時間,我們計算10次連續迭代過程間的平均時間差,我們設置每個minibatch大小是50,最后得到平均每秒可以執行1.2次迭代,而預測平均每秒可以執行6.7次迭代。
我們提出了一個基于ResNet的網絡模型ResNet-compress50來實現食物識別,這個50層的深層神經網絡的表現很好,前五種結果識別準確率達95%,滿足了一個關注健康和飲食應用所需要的圖像準確識別的需求。
通過實驗,本文選出最適合我們食物圖像識別系統的模型,調優了模型的超參數以及最好的訓練方法。因此,利用了深度學習的技術來滿足食物圖像識別的功能需求,這對于許多食物識別的的應用都是有參考意義的。