謝淋東,仲志丹,喬棟豪,高辛洪
(河南科技大學 機電工程學院,河南 洛陽 471003)
近年來,視覺識別技術飛速發(fā)展并廣泛地應用于手勢識別中[1-2]。手勢分為靜態(tài)與動態(tài)兩種,由于動態(tài)手勢識別難度較高、實時性較差且可識別的手勢數量較少,無法滿足大量繁雜信息輸入的需求,所以目前的主要研究方向是靜態(tài)手勢的識別。用于靜態(tài)手勢識別方法大體分為兩種:一是基于傳統(tǒng)圖像特征和機器學習的方法[3],此類方法難以從復雜的背景中提取到有代表性的語義信息,識別精度普遍偏低。二是基于深度學習[4-5]的方法,如R-CNN(region with convolutional neural network)[6]模型、R-FCN(region-based fully convolutional networks)[7]模型、Faster R-CNN[8]模型、YOLO(you only look once)[9]模型、SSD[10]模型等,其中SSD模型因其具有較好的識別效果而備受青睞。然而SSD算法用于中小占比目標識別時,識別效果一般,因此,很多學者改進了SSD算法,例如Wen等[11]提出了一種改進的SSD算法,即加入了Atrous[12]濾波器、SeLU激活函數以及引入一種數據規(guī)則來提高識別精度與速度。Tang等[13]基于原始的SSD算法,提出了一種多視窗的處理特征圖的方法,該方法利用多個窗口多個通路檢測中小占比目標,但由于目標的拆分,該方法存在魯棒性低等問題。Fu等引入了一種特征提取能力更強的改進型網絡,提出了DSSD(deconvolutional single shot detector)模型,與原有的SSD模型相比,特征融合能力有所加強,識別精度有所提高,但計算復雜度更高,從而存在耗時長等問題。
該文基于SSD模型,引入特征融合思想,以提高模型的語義表征能力,同時,改進了損失函數,以提高目標的分類能力。
SSD算法用于目標識別時,以特征提取為基本思想,以金字塔特征結構進行信息的目標識別。在VGG16網絡中,每一級的卷積特征圖用作本層的特征信息,即每一級卷積層的特征圖始終描述著該層獨有的特征信息,由于相鄰的兩個卷積層是相互獨立的,從而忽視了對其他層的特征信息進行補充。
針對SSD算法存在的問題,該文提出了一種多尺度卷積特征融合的SSD手勢識別算法。該算法基于原有SSD模型中多尺度卷積檢測方法,同時引入了不同卷積層的特征融合思想,將新融合成的特征層代替原有的卷積層用做目標識別。此外,為了提升模型對目標手勢的分類能力,提出一種改進的損失函數。
在手勢識別過程中,手勢的特征圖通過卷積、池化等操作后,很可能出現深層語義特征層出現信息丟失的情況,最主要原因是僅有conv4_3層用于識別小占比目標,導致特征提取不充分,一旦某一級的卷積層信息出現丟失,則與此相關聯的另一卷積層也將受到影響,因此為了減少此類影響,采用空洞卷積操作[14]。空洞卷積操作能擴大卷積核的感受野范圍,且保證參數個數不變,進行空洞卷積操作的特征層將學習到更多的上下文語義信息。
卷積核的感受野可由如下計算式得到:
Fdi=[2(di/2)+2-1]×[2(di/2)+2-1]
(1)
其中,di(dilation)表示空洞卷積操作時的不同擴張值,即卷積核計算出的半徑值,Fdi表示不同感受野??梢钥闯?,隨著dilation的增加,感受野明顯擴大。
因此,通過空洞卷積操作,將淺層視覺特征層進行空洞卷積下采樣操作,與高層的特征層作融合處理,并且保持通道數不變,以及進行尺度的歸一化處理。
在SSD模型中,中高層的特征圖具有更豐富的語義信息,而在識別中小占比的目標時,淺層特征層所能學習到的語義信息有限,從而影響對此類目標的識別精度。因此,為了讓模型能夠學習到更多的上下文信息,采用反卷積操作。卷積操作實現的是對高維數據進行低維特征提取,而反卷積操作與卷積操作的作用相反,它能夠將低維度特征映射成高維輸入。
反卷積操作利用轉置后的卷積核對特征圖像進行處理,通過對輸入的特征圖像進行填充補零,使得輸出的特征圖像尺寸大于輸入圖像的尺寸,最終能夠將特征圖像擴大到原圖像的大小。假設輸入圖像大小為i、輸出圖像大小為o、邊緣擴充為q、卷積核大小為w、步長為p,通過卷積操作輸出的特征圖計算公式為:
o=[(i+2q-w)/p]+1
(2)
通過反卷積操作可將特征圖還原到原圖像大小,計算公式為:
I=p(o-1)+w-2q
(3)
因此,通過反卷積操作擴大了卷積運算之后輸入的特征圖的尺寸,同時也保留了更多的特征信息,提高了模型的特征表達能力。
該算法將利用在卷積層之后引入反卷積網絡以實現上采樣并學習的思想,實現將具有更豐富的語義的高層特征層融入到淺層特征層中,代替原有的淺層特征層用于手勢識別,且保持通道數不變,并對其進行歸一化處理。
針對原始的SSD算法中網絡結構忽略了層與層之間的聯系,提出一種新的基于特征融合的網絡結構。首先,基于原有的VGG16架構,將conv4_3_c,conv7_c,conv8_2_c,conv9_2_c, conv10_2_c,conv11_2_c設置為預測的新特征層,之后,使用空洞卷積下采樣操作將淺層特征層融入到深層特征層中,從而使得模型能夠學習到更多的中小占比的目標信息。考慮到深層特征層所含語義信息較豐富的特點,通過引入反卷積網絡實現上采樣與學習的特征,將深層特征層融入到淺層特征層中。
基于上述思想,新融合的低特征層conv4_3_c由兩部分組成,第一部分使用擴張值為1,步長為1,大小為3×3的卷積核,通過conv4_3層自身的卷積運算得到256個38×38的特征圖,這些特征圖的尺寸未發(fā)生變化。第二部分,使用大小為2×2,步長為2,擴張值為0的卷積核,通過conv7的反卷積上采樣操作得到256個38×38的特征圖,并且這些特征圖的尺寸增加了一倍。
新融合的特征層conv7_c由三部分構成,第一部分使用大小為3×3,步長為2,擴張值為2的卷積核,由conv4_3通過空洞卷積下采樣操作生成256個19×19的特征圖,這些特征圖的尺寸縮小了一半。
第二部分使用步長為1,擴張值為1,尺寸為3×3的卷積核,由conv7通過自身的卷積運算得到512個19×19的特征圖,此部分的特征圖的尺寸不變。第三部分使用步長為2,擴張值為1,尺寸為3×3的卷積核,由conv8_2通過反卷積上采樣操作得到的256個19×19的特征圖,特征圖增大了一倍。
新融合的conv8_2_c特征層與conv7_c融合類似,由三個部分構成,其中:第一部分使用尺寸為3×3,步長為2,擴張值為2的卷積核,由conv7通過空洞卷積下采樣方式生成,所得的特征圖尺寸縮小了一半。第二部分使用步長為1,擴張值為1,尺寸為3×3的卷積核,通過自身卷積操作得到。第三部分使用大小為2×2,步長值為2,擴張值為0的卷積核,由conv9_2_c通過反卷積上采樣操作提供的,特征圖尺寸增加一倍。
由于從conv9_2特征層開始,每個特征層尺度過小,自身包含的語義信息較強,所以,在保證算法精度的情況下應更多地考慮算法的檢測速度,因此對conv9_2層之后的特征層不做特征融合操作。新的網絡結構如圖1所示。
圖1 新的網絡結構
為了提高特征層的融合效果,對經過融合處理之后的特征層,加入BatchNorm層[15]用以計算不同特征圖之間的偏差,再用Scale運算進行歸一化處理。針對特征融合處理的特征層維度不相等的問題,使用1×1大小的卷積核進行降維處理,之后再經過一次BatchNorm運算,最終得到的結果作為該特征層的特征輸出。
SSD算法的損失函數是根據預測部分的輸出結果來設計的,其損失函數由置信度損失Lconf和位置損失Lloc組成,公式如下:
L(y,f,c,r)=n(Lconf(y,f)+βLloc(y,c,r))
(4)
(5)
(6)
其中,n=1/N,N表示與真實框匹配后的剩余個數。Lconf(y,f)表示置信度損失,Lloc(y,c,r)表示位置損失,β是位置損失的整體占比,即權重,位置損失一般運用smoothL1Loss計算得出;當預測框與真實框相互匹配時,y的值設為1,反之為0;c和r分別表示預測框和真實框的位置信息;f表示預測框的目標分類。
SSD在檢測過程中,檢測框所能檢測到的目標時為正樣本,反之則為負樣本,對于中小占比的目標手勢而言,在一張圖像中,目標手勢的占比很小,正樣本數量遠小于負樣本數量,直接導致了分類性能差等問題,從而影響檢測的精度與速度。因此,針對由于正負樣本不平衡導致模型分類性能差的問題,該文用改進的交叉熵損失函數IL(pt)代替了Lconf標準的交叉熵損失函數,公式如下:
CE(pt)=-ln(pt)
(7)
IL(pt)=-(1-βt)ηεln(pt)
(8)
其中,η=(pt-1)2,pt表示不同類別的分類置信度,且pt∈[0,1]。SI(pt)比CE(pt)多了βt和(1-pt)ε,βt為權重參數,在傳統(tǒng)模型中βt=0,但很容易導致正負樣本不均衡的問題。為了解決這個問題,對于正負樣本的βt值設定進行區(qū)分,對于負樣本,需要把βt設置為一個較小的值,用來平衡置信度損失和位置損失的比例。為了優(yōu)化負樣本的算法學習模型,將權重系數β設為0.1。ηε稱為調制項,它反映了算法的分類能力,且pt∈[0,1],當pt的值接近于0時,算法將重點放在難以分類的目標數據上。否則,它將側重于易于分類的目標數據。如圖2所示,以pt為橫軸,以loss為縱軸,繪制pt與loss的圖像,從圖中可以看出,隨著pt的增加,分類手勢的損失逐漸趨近于0,即損失在總損失中所占的比例越小,并且ε越大,分類損失減小的速度越快,分類能力越強。
圖2 損失函數變化
提出的手勢識別算法以Python語言作為實驗框架,實驗所使用的計算機配置為:Windows 10 64 位操作系統(tǒng),處理器(CPU)型號為Intel i7,內存為16 GB,顯卡(GPU)為NVIDIA GTX1080Ti。實驗中所使用的各個軟件版本為:Visual Studio 2016、Anaconda3、CUDA 9.0、Python 3.6.4、Tensorflow1.9.0。
最后,在集成環(huán)境上安裝如pandas、nose等Python的第三方庫及Keras、Tensorflow Research Models 等深度學習的API,以降低實驗的實施難度。
實驗所使用的數據集為MSRC-12 Kinect Gesture Dataset及2013 Chalearn Gesture Challenge Dataset,這兩個數據集均是從實際場景收集得到的,手勢屬于中小占比目標。其中,MSRC-12 Kinect Gesture Dataset數據集包含12個不同手勢,4 900張圖片,從每種手勢中隨機選取400張圖片,共4 800張圖片。為了使實驗更有說服力,選取數據庫更為龐大,且場景更為復雜的2013 Chalearn Gesture Challenge Dataset數據集,共包含20種不同手勢,圖片總量達11 000張,每種手勢隨機選取400張,共8 000張圖片,最終將兩個數據集的12 800張照片共32種不同手勢,以5∶3∶2的比例劃分為訓練集、測試集和驗證集。
訓練數據經過左右翻轉和隨機采樣實現數據增強,隨機采樣最小的Jaccard overlap值為0.5,訓練集與測試集的尺寸均等比例縮小為300*300大小,使用限制學習率的動態(tài)自適應梯度法[16]來訓練。網絡訓練過程中,為了使BatchNorm在訓練過程中有穩(wěn)定的計算結果,參考文獻[17]及現有的實驗平臺,實驗開始時,將batch_size設置為16,動量因子設置為0.9,初始學習速率設置為10-3,權重設置為0.000 5,模型訓練的時候使用回調函數觀測val_loss,耐心值patience設置為15,當val_loss經過15個epoch不下降時,學習速率降低10倍。模型訓練過程中的 training loss如圖3所示,經過144個epoch訓練后learning_rate從10-3降低為10-4,200個epoch后模型收斂。
圖3 訓練損失值
為了驗證提出的改進算法在對中小占比手勢識別上的可行性和優(yōu)越性,選取了目標完整度(COM)、全局精度(Global Acc)、IOU[18]以及FPS作為本次實驗的評價指標。
其中,目標完整度表示預測框中標記目標圖像占整個圖像的比例;全局精度表示對目標手勢正確分類的結果;IOU表示錯誤識別的目標手勢的情況,是一種測量在某一數據集中檢測的相應物體準確度的標準;FPS表示處理目標圖像的速度,每秒內可以處理的圖片數量。
為了探究訓練集對評價指標的影響,從訓練集中隨機挑選20%、40%、60%、80%、100%構成5個新的訓練集,基于這5個訓練集訓練模型,在檢測集上進行檢測,觀察不同訓練集上的檢測效果,檢測精度如表1所示。
表1 檢測精度
如表1所示,隨著訓練集比例的增加,即訓練集數據增多,目標的檢測效果也越好,最好的檢測效果是訓練集比例達100%時。此外,當在比例為60%訓練集訓練時,檢測效果已達到較高的檢測水平,再往后提高訓練集比例,識別效果提升幅度很小,因此,可以看出該算法具有較強的特征提取能力,在一定比例的訓練集上,就能達到較好的檢測效果,從而驗證其具有較高的魯棒性等特點。
為了更好地驗證識別效果,選出常用于目標檢測識別的Faster R-CNN算法、YOLO算法與SSD算法與文中算法(Our1)作對比,此外,分別對僅改進了網絡結構的算法(Our2)與僅改進了損失函數的算法(Our3)驗證改進效果。該實驗在100%比例的訓練集上訓練模型,最終在測試集上觀察測試效果,測試結果如表2所示,圖4為文中算法對部分數據集測試的效果圖。
表2 不同算法的測試結果
圖4 檢測效果
如表2所示,在目標完整度(COM)、全局精度(Global Acc)、IOU這三個指標中,Faster R-CNN識別效果最佳,文中所提出的方法識別精度與其相當,而SSD算法與YOLO算法在用于中小占比的手勢檢測中,識別精度較為一般,即通過多尺度卷積特征融合的方式改進SSD模型的網絡結構,一定程度上能夠提高識別精度。對于與檢測速度有關的FPS指標,SSD算法的FPS值最高,為40,文中算法為31,即在進行特征融合時,一定程度上會增加網絡的復雜度,從而影響模型的檢測速度,此外,檢測精度最高的Faster R-CNN卻為9,檢測目標圖像的速度最慢,YOLO算法檢測速度較為一般。
綜合這四項指標及實際場景中對手勢識別有著較高的識別精度與識別速度的需要,文中算法最優(yōu),即使Faster R-CNN算法的識別精度高,但卻是以犧牲大量的檢測速度實現的。為了提高對中小占比手勢目標的識別精度,對SSD網絡結構的卷積層進行空洞卷積操作與反卷積操作,將部分特征層進行融合,構建新的融合網絡結構以代替原有的VGG-16網絡結構用于手勢識別,同時,在檢測中小目標時,正負樣本不均衡導致的分類性能差,從而影響檢測精度與速度,對此改進了損失函數,將改進的交叉熵損失函數IL(pt)代替Lconf標準的交叉熵損失函數,以此提高了網絡對目標手勢的分類能力。對于conv_9_c層之后的語義信息較豐富的卷積層不做特征融合處理,以減輕網絡的冗雜度達到輕量化的目的,但也因此犧牲部分的檢測精度。
為了使模型更具有說服力,分別測試了僅改進網絡結構的算法(Our2)與僅改進損失函數的算法(Our3),對于Our2算法,主要通過特征融合的思想提高目標的識別精度,與SSD算法相比,較大程度提高了識別精度,但也犧牲了部分識別速度,而對于Our3算法,通過改進損失函數,提高模型的分類性能,與SSD算法相比,一定程度提高識別精度的同時,提高了模型的識別速度。因此,基于SSD網絡架構,通過改進網絡結構與改進的損失函數,均能在對中小占比的目標識別過程中,保證一定水平的檢測速度,同時提高目標識別精度。
提出了一種多尺度卷積特征融合的SSD手勢識別方法。在原始的SSD多尺度特征卷積的基礎上,引入了特征融合的思想,即對淺層視覺特征層與高層語義特征層作融合處理,以此使模型能夠學習到更多的特征信息,提高模型對中小占比手勢的識別精度,此外,提出一種改進的損失函數,使模型更側重于分類損失,以便該算法更好地完成分類任務。在實際應用場合中,對于手勢識別系統(tǒng)有著識別精度高和魯棒性好的需求,提出的方法能夠在保證較高水平的檢測速度的同時,具有更高的檢測精度與魯棒性。