王旖旎
(重慶商務職業(yè)學院,重慶 401331)
圖像分類是計算機視覺各種應用的基礎。從人臉表情識別到人體姿勢識別,圖像分類隨處可見。在過去幾年中,隨著機器學習和深度學習的進展,圖像分類鄰域已經(jīng)發(fā)生了深刻變化,陸續(xù)涌現(xiàn)了很多有效的算法,例如支持向量機、卷積神經(jīng)網(wǎng)絡等[1-2]。深度學習已被證明是最有效的機器學習技術之一,其核心思路是構建多層神經(jīng)元來訓練網(wǎng)絡。所有訓練網(wǎng)絡都使用數(shù)十個層,在網(wǎng)絡中構建上千個參數(shù),但是由于層級過深導致了較高的計算復雜度和過度擬合。對象狀態(tài)分類在機器人、醫(yī)療、天文、游戲等領域的各種應用中非常有價值,例如識別物體的狀態(tài)在人工智能技術中就很重要。在機器人領域,操作處于不同狀態(tài)的物體需要不同的抓取動作,這需要在機器人的抓取動作中進行不同的行為。
識別物體狀態(tài)問題的一種典型方法是使用形狀匹配算法[3],這類方法是從對象-對象-交互信息的三元組中獲取對象狀態(tài)來實現(xiàn)圖像分類。這種方法可以連接和模擬同一幀中物體的運動和特征,訓練過程由標記了的視頻序列完成。這類算法通?;谪惾~斯網(wǎng)絡,主要用對象特征、人類行為和對象反應作為參數(shù)[4]。劉成穎等利用PSO優(yōu)化了LS-SVM模型,實現(xiàn)了道具磨損狀態(tài)的識別[5]。楊昌其利用BP神經(jīng)網(wǎng)絡建立模型[6],并對空中管制員的疲勞進行分類,用來評估空中交通管制員的疲勞狀態(tài)。但是上述算法的神經(jīng)網(wǎng)絡深度較淺,優(yōu)化的目標太過復雜,導致其只適合對狀態(tài)分類較簡單的情況進行識別,識別率不高。
深度學習使用具有數(shù)百個隱藏層的神經(jīng)網(wǎng)絡,并且需要大量的訓練數(shù)據(jù)。構建良好的神經(jīng)網(wǎng)絡模型需要仔細考慮網(wǎng)絡的體系結構以及輸入數(shù)據(jù)格式。數(shù)據(jù)收集和預處理是深度學習[7]的重要組成部分。預處理的第一步是將數(shù)據(jù)分區(qū)為訓練和測試數(shù)據(jù)集。本文對數(shù)據(jù)集中的圖像執(zhí)行多種預處理技術,分別是圖像恢復、圖像插值放大、圖像增強和歸一化。
數(shù)據(jù)劃分:將數(shù)據(jù)劃分為訓練和測試數(shù)據(jù)集,在分類之前先用隨機算法將數(shù)據(jù)進行隨機混合,以便每個訓練和驗證集都沒有任何特殊性。對于此項目,數(shù)據(jù)分類以9∶1的比例完成。 90%的數(shù)據(jù)用于訓練,剩余的10%用于測試訓練結果。在劃分完成之后,輸入數(shù)據(jù)到圖像預處理器中,對圖像進行恢復和擴充等預處理,生成批量的規(guī)范化和增強數(shù)據(jù)。
圖像縮放:本文在不同的圖像大小和不同的epoch數(shù)量上訓練模型。如果圖像尺寸較大,則模型需要更多的epoch才能達到良好的準確度。為了讓訓練的時間復雜度更加穩(wěn)定,本文對輸入圖像最終確定了圖像尺寸256× 256。重新縮放圖像會按給定的縮放系數(shù)調(diào)整大小,由于重新縮放可能會嚴重影響精度,為了盡量不丟失圖像的信息,本文利用Cubic-convolution插值算法對圖像進行有理插值[8]。
規(guī)范化圖像輸入:規(guī)范化可確保每個輸入?yún)?shù)具有相似的數(shù)據(jù)分布,利用這一特性,規(guī)范化操作可以讓訓練時網(wǎng)絡的收斂更快。本文通過從每個像素中減去平均值并將該結果除以標準偏差來完成數(shù)據(jù)的標準化。在本文的實驗中,圖像像素值在[0,255]范圍內(nèi)歸一化。
數(shù)據(jù)擴充:如果在小型數(shù)據(jù)集上訓練深度神經(jīng)網(wǎng)絡,可能導致過度擬合或者可能在測試數(shù)據(jù)上表現(xiàn)不佳,數(shù)據(jù)擴充通過增加數(shù)據(jù)集的大小防止過度擬合[9]。由于本文主要針對食物的數(shù)據(jù)進行處理,而這類數(shù)據(jù)集本身比較小,因此利用數(shù)據(jù)擴充作為預處理技術的最后一步。本文的數(shù)據(jù)擴充主要利用生成對抗網(wǎng)絡 (Generative Adversarial Networks, GAN)來實現(xiàn)[10],該網(wǎng)絡可以不斷學習圖像特征,利用生成器不斷生成偽造圖片,利用判別器不斷判斷生成圖片的真?zhèn)?,最終達到納什均衡,從而生成出逼真的圖片。擴充后數(shù)據(jù)集的總大小約為30 000個圖像。
本文利用Inception V3進行轉(zhuǎn)移學習。在實際應用中,有時可能存在沒有足夠數(shù)據(jù)來訓練網(wǎng)絡以獲得有效結果的情況。在這種情況下,可以使用轉(zhuǎn)移學習。用于預訓練網(wǎng)絡的訓練可能僅對一個域是足夠的,并且我們擁有的數(shù)據(jù)可能在不同的特征空間中。在這些情況下,應用學習轉(zhuǎn)移方式賦予網(wǎng)絡已訓練好的參數(shù)信息,將大幅提高神經(jīng)網(wǎng)絡的學習性能。
創(chuàng)建的模型將在對數(shù)據(jù)集進行訓練時在預訓練模型上添加了一些圖層。整個模型如圖1所示。
圖1 本文提出的模型架構Fig.1 Model architecture presented in this paper
網(wǎng)絡的第一層是卷積層。卷積層以張量陣列的形式生成輸出[11-12]。
下一層是批量標準化層(BN層)。批量標準化提供了一種將輸入逼近0或?qū)斎霐?shù)組中所有值求平均的方法。這可以在網(wǎng)絡層的開始和中間使用,該技術有助于更快地學習并獲得更高的準確性。在深度卷積神經(jīng)網(wǎng)絡中,隨著數(shù)據(jù)進一步流動,權重和參數(shù)會調(diào)整它們的值。模型使用中間數(shù)據(jù),會導致計算量太大而增加復雜度,通過規(guī)范每個小批量數(shù)據(jù)可以避免這個問題。
網(wǎng)絡中的下一層是一個具有整流線性單元(ReLU)作為激活功能的激活層。 ReLU由于良好的收斂性被廣泛應用在深度卷積神經(jīng)網(wǎng)絡,其中Tanh的性能最高,能將收斂性提高6倍[13]。 ReLU的數(shù)學公式見式(1)。
y=(ex-e-x)/(ex+e-x).
(1)
另一層是最大池化層。進行最大池化的目的是對數(shù)據(jù)進行下采樣,這樣可以通過減少數(shù)據(jù)的維度來避免過度擬合。最大池化的另一個好處是它通過減少參數(shù)數(shù)量來降低計算成本。在本文的模型中,將數(shù)據(jù)的維度從8× 8降到2個4×4,然后從4 × 4降低到2個2× 2??傮w來說,在網(wǎng)絡中使用兩組卷積、批量標準化、激活和最大池化層可以獲得更高的準確度。
下一層進行Flatten[14-16]操作。Flatten將前一層的二維輸出轉(zhuǎn)換為單個長連續(xù)線性向量,F(xiàn)latten是在數(shù)據(jù)流進入全連接層之前的必要操作,全連接層只是一個人工神經(jīng)網(wǎng)絡(ANN)分類器,需要Flatten將輸入數(shù)組轉(zhuǎn)換為特征向量[17]。
再下一層是全連接層或稠密層。全連接層是完全連接的神經(jīng)網(wǎng)絡層,其中每個輸入節(jié)點連接到每個輸出節(jié)點。它將Flatten的向量作為輸入,并將n維度張量作為輸出。使用稠密層可以解決消失梯度問題,同時加強了特征傳播,促進了特征重用,并大幅減少了參數(shù)的數(shù)量。
接來下是激活層,然后是Dropout層用于正則化。正則化有助于通過降低過度擬合的風險,從而更好地推廣模型。如果數(shù)據(jù)集的大小與需要學習的參數(shù)數(shù)量相比太小,則存在過度擬合的風險。Dropout層隨機刪除網(wǎng)絡中的某些節(jié)點及其連接。我們可以使用帶有隱藏或輸入圖層的Dropout。通過使用Dropout,網(wǎng)絡中的節(jié)點對其他節(jié)點的耦合性變得更加不敏感,這使得模型更加穩(wěn)定。
網(wǎng)絡中的最后一層是具有Softplus激活功能的激活層。 Softplus函數(shù)將輸出收斂于0~1之間。通常最好在最后一層網(wǎng)絡中使用Softplus來解決分類問題。它用于分類概率分布。 Softplus函數(shù)的數(shù)學公式見式(2)。
?(x)=lg(1+ex).
(2)
模型的訓練分兩步完成。首先,僅在給定數(shù)據(jù)集上利用本文的模型進行訓練。訓練完成之后,通過訓練頂部4層基礎模型并保持底層的其余部分不參與訓練來完成微調(diào)。實驗在2個優(yōu)化器上完成:RMSprop和隨機梯度下降(Stochastic Gradient Descent, SGD)。首先,使用優(yōu)化器RMSprop編譯模型,僅訓練新層并保持基層不可訓練。 RMSprop通過將學習率除以指數(shù)衰減的平方梯度平均值來完成優(yōu)化[18],本文中 RMSprop的學習率設置為0.002。模型的目標函數(shù)是交叉熵損失函數(shù)(Categorical crossentropy loss),該目標函數(shù)通常用在數(shù)據(jù)集中存在。通過將epoch保持為20,50,100,同時保持batch大小為32來進行實驗。為了避免過度擬合,第一輪訓練的batch大小(32)選得相對較小。在訓練期間保存了最佳模型參數(shù)(在驗證損失和準確性方面),以便可以在第二步中繼續(xù)優(yōu)化。在訓練的第二步,通過使用給定數(shù)據(jù)集訓練前4層基礎模型來完成微調(diào),同時凍結剩余的下面幾層。在該過程中使用在訓練第一步中獲得的最佳模型,通過訓練前2層和前4層基礎模型進行實驗,并且訓練前4層給出最佳結果。此步驟中使用的優(yōu)化器是SGD。添加前4層的Inception會導致學習參數(shù)數(shù)量增加,從而增加過度擬合的可能性。因此采用SGD優(yōu)化器,其收斂速度較慢,可以降低過度擬合的情況。學習率0.000 2,衰減=e-6和momentum= 0.5。第一階段的訓練消耗了150個epoch,同時保存了每個epoch產(chǎn)生的所有模型。因為模型有可能隨著時間的推移而停止前進,從而產(chǎn)生過度擬合的模型,因此選擇最佳模型時本文綜合考慮了損失函數(shù)和最短運行時間。
本文算法在Tensorflow平臺完成編程,并在GTX1080Ti的GPU、32 G內(nèi)存、Xeon-E3 CPU、windows平臺下進行實驗。
本文使用的數(shù)據(jù)是20種肉類和植物食物(蘋果、西瓜、奶酪、牛肉、三文魚等)的圖像,具有6種不同的物理狀態(tài)(完整、切塊、切片、磨碎、糊狀、榨汁)。原始訓練數(shù)據(jù)集提供了大約6 231個圖像,擴充后達到30 000個圖像。圖片實例如圖2所示。
圖2 測試數(shù)據(jù)集樣例Fig.2 Data set of sample test
在訓練期間進行了各種實驗以產(chǎn)生最佳模型,同時利用GAN對圖片進行擴張。在對比實驗中,本文采用了基于SVM的圖像分類器、BP神經(jīng)網(wǎng)絡、ResNet與本文算法進行對比。
表1 算法結果對比Tab.1 Comparison of algorithm results
圖3 訓練和驗證的準確率對比Fig.3 Comparison of accuracy of training and verification
這些實驗可以添加更多層以改善分類結果。 在這種情況下,使用預訓練網(wǎng)絡(GoogLeNet)對這組圖層進行微調(diào)可以獲得最佳效果。使用之前的訓練中選擇的最佳模型進行微調(diào),進一步改善了結果。圖3顯示了顯示訓練和驗證準確率對比。
提出了一個基于Inception V3結構的神經(jīng)網(wǎng)絡食物狀態(tài)識別算法,在識別前先對食物圖像進行數(shù)據(jù)劃分、圖像縮放等預處理,再在原有Inception V3的基礎上采用兩階段訓練的方式提高了模型的準確度。在20個烹飪對象的對比實驗中,選擇了SVM、BP神經(jīng)網(wǎng)絡、ResNet進行參照。實驗結果表明,本文算法能有效提高識別準確率,與對比實驗中的次優(yōu)算法相比,本文算法訓練準確率提高了3.2%。通過不同epoch的訓練結果和測試數(shù)據(jù)可以看出,本文算法在識別過程中具有較好的性能,可以滿足圖像分類的可靠性、穩(wěn)定性等要求,為物體狀態(tài)識別領域提供有益參考。