張行健 張建新
(浙江理工大學(xué)機械與自動控制學(xué)院 浙江 杭州 310018)
隨著機器學(xué)習(xí)和嵌入式等技術(shù)的發(fā)展,現(xiàn)代工業(yè)愈加智能化[1]。目前工業(yè)領(lǐng)域中傳統(tǒng)的人機交互方式復(fù)雜,在操作上不夠自然直觀。為此,研究一種能實現(xiàn)對機械手的直觀控制的新型人機交互方式很有必要,其中一種交互方式是讓機械手直接模擬操作者的動作,實現(xiàn)直接控制,這一方式的關(guān)鍵是計算機能夠?qū)κ謩葸M行識別和判斷。
目前手勢識別方法主要分為三個類別。(1)基于超聲波的手勢識別。Yang等[2]提出的手勢識別是利用多個超聲波裝置檢測手勢的位置,該方法的識別平均準確率可以達到93%,但是在較復(fù)雜的噪聲環(huán)境中容易被干擾。(2)基于傳感器的手勢識別。謝小雨[3]提出一種利用手勢控制臂帶(MYO)傳感器采集的肌電信息和加速度實現(xiàn)手勢的識別,該方法的識別平均準確率可以達到96%,但該類方法由于需要佩戴傳感器,使用不夠方便等。(3)基于機器視覺的手勢識別。賀航[4]基于OpenCV函數(shù)庫,利用基于HU不變矩提取手勢的圖像特征值,再通過模板匹配法完成手勢識別,但該方法對不同人的手勢識別準確率差異較大,泛化性較差。孫玉等[5]利用Leap Motion設(shè)備獲取手勢的三維坐標信息,并結(jié)合長短期記憶網(wǎng)絡(luò)模型進行動態(tài)手勢識別,但Leap Motion設(shè)備較為昂貴,不利于工業(yè)的大規(guī)模使用。朱雯文等[6]提出了一種基于加速度信號的卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型,但是由于采用的是簡單的LeNet網(wǎng)絡(luò)結(jié)構(gòu),手勢識別準確率只能達到90%。石雨鑫等[7]提出了一種將CNN模型和隨機森林(RF)相結(jié)合的手勢識別算法,其識別準確率達到97%,但RF會明顯加大運算量,且容易在噪聲較大的分類中出現(xiàn)過擬合現(xiàn)象。
本文將采用機器視覺和卷積神經(jīng)網(wǎng)絡(luò)的思路,提出一種以AlexNet結(jié)構(gòu)為基礎(chǔ)針對手勢特征識別的CNN模型。改進后的CNN模型可以有效識別手勢,通過STM32單片機實現(xiàn)對機械手的直觀控制。本文改進的CNN模型的手勢識別正確率在測試集中達到98%。
本文設(shè)計的手勢識別控制系統(tǒng)是先用攝像頭保存操作者的手勢動作,然后用PC機中預(yù)先訓(xùn)練好的CNN模型去識別手勢動作,再將手勢動作的識別結(jié)果通過串口通信傳輸給STM32單片機,最后通過單片機控制機械手,實現(xiàn)操作者手勢直接控制機械手的功能??傮w方案設(shè)計如圖1所示。
圖1 總體方案設(shè)計圖
CNN的典型結(jié)構(gòu)如圖2所示。CNN發(fā)展歷史中的里程碑事件是Alex提出AlexNet結(jié)構(gòu),獲得了ILSVRC-2012大賽冠軍[8]。AlexNet結(jié)構(gòu)通過6 000萬個參數(shù)和65萬個神經(jīng)元,成功地把120萬幅高分辨率圖像分成1 000個不同的類別[8]。
圖2 CNN典型結(jié)構(gòu)示意圖
本文提出的CNN結(jié)構(gòu)以AlexNet結(jié)構(gòu)為基礎(chǔ),并根據(jù)實際手勢識別的情況做了以下改進(具體結(jié)構(gòu)參數(shù)如表1所示):
表1 CNN具體結(jié)構(gòu)參數(shù)
(1)刪除LRN層。AlexNet結(jié)構(gòu)使用局部響應(yīng)歸一化(LRN)用于正則化。但是Simonyan等[9]發(fā)現(xiàn)LRN的效果十分細微,反而會大量占據(jù)存儲量和花費許多計算時間。本文在有無LRN層的CNN模型上進行測試,結(jié)果并無區(qū)別,說明LRN層確實性價比太低,于是本文刪除LRN層,以加速訓(xùn)練過程。
(2)改小卷積核大小。AlexNet結(jié)構(gòu)的第一個卷積核的大小為11×11,是為了適應(yīng)1 000種圖像的多分類問題,讓輸入的第一個卷積層盡可能包含大的圖像特征。而本文改進的CNN模型是用于手勢識別,手勢的特征分布相對區(qū)分度較小,所以較小的卷積核能夠更好地獲取這些特征分布。本文把第一個卷積核大小改為3×3,并且使用較小的卷積核可以很明顯地減少訓(xùn)練參數(shù)。
(3)加深網(wǎng)絡(luò)深度。AlexNet結(jié)構(gòu)的卷積核過大導(dǎo)致隨著網(wǎng)絡(luò)層數(shù)加深,網(wǎng)絡(luò)的參數(shù)指數(shù)型上升,會發(fā)生明顯的過擬合現(xiàn)象。而本文把卷積核減小了很多,所以可以適當?shù)丶由罹W(wǎng)絡(luò)的深度,因為卷積層的深度對CNN識別準確率有很重要的影響。本文分別在第一個和第二個池化層前增加了一個和前一個卷積層規(guī)模大小一樣的卷積層,即一共增加了2層卷積層。
(4)更換優(yōu)化函數(shù)。AlexNet結(jié)構(gòu)使用的是隨機梯度下降法(SGD),雖然SGD比標準的梯度下降算法在運算速度上有所提高和更不容易收斂到局部最優(yōu)值,但是由于SGD頻繁的更新和波動會導(dǎo)致存在一定的超調(diào)量。本文使用自適應(yīng)時刻估計算法(Adam),該算法能計算每個參數(shù)的自適應(yīng)學(xué)習(xí)率[10]。Adam可以計算和存儲每個參數(shù)的對應(yīng)動量變化,可以有效緩解學(xué)習(xí)率消失、收斂過慢和損失函數(shù)波動較大問題。
本文改進的CNN結(jié)構(gòu)的池化層都選擇最大值池化方式,再接著3個全連接層,每個全連接層都有1 024個神經(jīng)元,dropout設(shè)置為0.5。在全連接層3后面有一個Softmax函數(shù),將預(yù)測結(jié)果分為剪刀、石頭、布、GOOD和OK這5類手勢動作。
過擬合現(xiàn)象是困擾卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展的重要因素。過擬合是指模型在訓(xùn)練集上學(xué)習(xí)的特征過多,以至于不具有泛化能力,雖然可以在訓(xùn)練集上達到100%的正確率,但是在測試集上的正確率卻不盡如人意。本文主要通過以下4種方法來緩解甚至避免過擬合現(xiàn)象,以提升模型預(yù)測的準確率,具體過程與結(jié)果如表2所示。
表2 優(yōu)化過程
(1)數(shù)據(jù)增強。數(shù)據(jù)增強是避免過擬合現(xiàn)象最簡單的方法。數(shù)據(jù)增強有很多方法,比如翻轉(zhuǎn)、平移、水平反射和改變圖像RGB通道的強度等方法。本文采用最原始的方式,更多地拍攝手勢照片,因為一般只用標準手勢動作。最開始本文的訓(xùn)練集是每種手勢500幅照片,即一共只有2 500幅照片,模型在測試集上識別正確率只有50%。當本文的訓(xùn)練集增加到每種手勢1 300~1 450幅,一共有6 650幅照片時,模型在測試集上識別正確率可以達到70%。
(2)Dropout技術(shù)。Dropout是一種簡單但非常有效的避免過擬合的技術(shù)[11]。Dropout是指在模型每次隨機挑選部分神經(jīng)元不參與訓(xùn)練,減弱神經(jīng)元的協(xié)同效應(yīng),繼而讓神經(jīng)元不能依賴其他神經(jīng)元存在,被迫學(xué)習(xí)與其他神經(jīng)元不同的隨機子集,獲得更健壯的特性。本文在最后三層的全連接層都使用了Dropout技術(shù),并且設(shè)置隨機“脫落”神經(jīng)元的概率為50%。
(3)調(diào)整池化方式。池化層的填充有VALID和SAME兩種方式。當池化層的卷積核根據(jù)步長移動到圖像數(shù)據(jù)外面時,SAME是自動在周圍填0補齊,而VALID是忽略,所以相對于SAME池化方式,VALID方式會輸入周圍更少的特征。重疊池化是指讓卷積核移動的步長小于卷積核自身的大小,讓圖像數(shù)據(jù)中間的特征更豐富。因為訓(xùn)練集中的手勢動作基本都在圖像的中間,于是本文調(diào)整池化方式為VALID和重疊池化。
(4)選擇合適參數(shù)。訓(xùn)練批次大小、訓(xùn)練迭代步數(shù)、學(xué)習(xí)率和訓(xùn)練圖像大小等參數(shù)都會影響模型在測試集上的識別準確率。通過多輪單一變量對比實驗發(fā)現(xiàn),在以本文的數(shù)據(jù)集、模型結(jié)構(gòu)和卷積大小數(shù)量為訓(xùn)練背景下,代價函數(shù)用交叉熵函數(shù),其形式如下:
(1)
式中:C表示代價;x表示樣本;n表示樣本的總數(shù);y表示實際值;a表示預(yù)測值。
激活函數(shù)用非線性ReLU函數(shù)。因為ReLU函數(shù)可以通過單側(cè)抑制,使神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元具有稀疏激活性,其形式如下:
(2)
訓(xùn)練批次大小設(shè)置為64,訓(xùn)練迭代步數(shù)設(shè)置為799步,學(xué)習(xí)率設(shè)置為0.000 1,訓(xùn)練圖像大小壓縮為227×227,RGB圖像為輸入。
本文使用的機械手系統(tǒng)如圖3所示,其動力系統(tǒng)由6個MG996R舵機組成,可以實現(xiàn)機械手的上下、左右及前后抓取搬運等動作演示。轉(zhuǎn)向關(guān)節(jié)處均采用的是杯式軸承,可以使轉(zhuǎn)向更加靈活,同時使舵機的轉(zhuǎn)向在同一圓心。底盤采用4 mm厚度的鋁制圓盤形式,使機械手左右轉(zhuǎn)動更加靈活順暢并且穩(wěn)固。機械手控制模塊是一個搭載STM32F103核心處理器的6路舵機控制模塊,該模塊是一種高效的微伺服電機控制器,可以控制6個舵機協(xié)同動作。機械手系統(tǒng)硬件的總體設(shè)計框圖如圖4所示。STM32單片機和PC機通過串口進行通信,實物設(shè)計圖如圖5所示。
圖3 機械手實物圖
圖4 機械手系統(tǒng)總體設(shè)計圖
圖5 機械手系統(tǒng)實物圖
機械手系統(tǒng)選用USART作為STM32單片機的串口通信寄存器,通過USB轉(zhuǎn)TTL設(shè)備完成上位機和下位機的通信,該設(shè)備的一端連接STM32單片機的四個IO口,另一端連接電腦的USB口。
機械手系統(tǒng)的軟件控制總流程圖如圖6所示,STM32單片機通過串口中斷接受PC機的手勢識別結(jié)果,再通過定時器中斷控制機械手。
STM32單片機通過定時器產(chǎn)生周期為20 ms,即50 Hz,高電平的脈沖寬度的最小值為1~2 ms的PWM,具體流程圖如圖7所示。
圖7 定時器生成PWM波
由于系統(tǒng)一共識別5種手勢,所以STM32單片機存儲了5個PWM波組,每個PWM波組都有6個脈沖寬度不同的PWM波,使機械手系統(tǒng)可以做5個不同的動作,每個動作都有6個自由度可以設(shè)置。
本文利用OpenCV建立數(shù)據(jù)集,并分為訓(xùn)練集和測試集。圖片數(shù)據(jù)集中有5種基本手勢:剪刀、石頭、布、GOOD手勢和OK手勢;采集自9位大學(xué)生志愿者,其中5位男性、4位女性。訓(xùn)練集中OK手勢圖片有1 450幅,其他四種手勢圖片有1 300幅;測試集中每種手勢的圖片數(shù)量都為450幅。采集的數(shù)據(jù)集如圖8和圖9所示。
圖8 剪刀手勢數(shù)據(jù)圖
圖9 五種手勢數(shù)據(jù)圖
拍攝手勢的照片是按照手勢動作名加上當前幀數(shù)命名,這樣后期不需要再手動進行標注設(shè)置。同時由于只需要識別手勢動作,并不需要攝像頭拍到的完整畫面,于是在保存圖像的時候自動設(shè)置感興趣區(qū)域的大小為300×300,切割后可以有效地減少拍攝背景等干擾。
本文利用TensorFlow搭建的CNN模型在訓(xùn)練集訓(xùn)練的效果如圖10所示,實際訓(xùn)練步數(shù)是每個step值的20倍。
圖10 CNN在訓(xùn)練集的正確率和損失率
改進后的CNN模型在測試集中的平均準確率能達到98%,且用交叉熵度量的損失率僅為0.14。
手勢實時測試是調(diào)用保存在PC機中預(yù)先訓(xùn)練好的CNN模型進行在線手勢判斷。本文在線測試了5種手勢,在背景為灰色窗簾有人臉干擾的情形下測試手勢識別效果如圖11所示。
圖11 五種手勢實時識別
在手勢實時測試過程中每種手勢都測試了10次,每次CNN模型都能正確識別;一位女性測試者在相同的環(huán)境進行手勢識別測試,她的5種手勢也都可以被準確識別。實驗證明該CNN模型在手勢識別中具有較高的準確性和較強的泛化性。
本文用LeNet-5結(jié)構(gòu)、AlexNet結(jié)構(gòu)、VGG-16結(jié)構(gòu)和改進的CNN模型在測試集上預(yù)測,得出的實驗結(jié)果如表3所示。結(jié)果表明本文提出的改進后的CNN模型在手勢識別領(lǐng)域比AlexNet結(jié)構(gòu)具有更高的識別準確率,能滿足手勢識別的需求。
表3 實驗結(jié)果對比
本文提出改進的CNN模型的正確率在測試集中可以達到98%,在背景不是很復(fù)雜的情形下(如只有人臉干擾)可以達到100%的識別準確率。實驗證明該CNN模型具有較強的泛化能力,可以很好地完成手勢動作識別任務(wù),從而直觀地控制機械手做出相應(yīng)動作。未來可以考慮如下兩個方面的改進:
(1)數(shù)據(jù)增強。本文的數(shù)據(jù)集還遠不夠,要拍攝更多不同背景下的手勢動作和更多志愿者的手勢動作,并且使用多種數(shù)據(jù)增強的手段,如:旋轉(zhuǎn)、縮放、膨脹和平移等。
(2)多結(jié)果融合。同時用多個不同的CNN模型算出結(jié)果概率,然后將這些結(jié)果概率取平均得到最大預(yù)測結(jié)果概率。