盧 迪 馬文強
(哈爾濱理工大學 哈爾濱 150080)
在人機交互領域,手勢有很多種應用場景,如游戲控制、智能家居、手語實時翻譯等[1]。因此,對于手勢的快速準確檢測和識別十分重要。自20世紀末,國外就開始了基于手勢識別交互的研究,主要分為基于外部設備的手勢識別和基于計算機視覺的手勢識別。相較于基于外部設備的手勢識別方式,基于計算機視覺的手勢識別方式更為方便靈活、降低了設備成本。傳統的基于計算機視覺的手勢識別方法分為手勢的檢測和分割、手勢特征提取與手勢識別3個階段。常常使用膚色分割模型分割出手勢區域,再提取尺度不變特征變換(Scale-Invariant Feature Transform, SIFT)、加速穩健特征(Speeded Up Robust Features, SURF)、方向梯度直方圖(Histogram of Oriented Gradient, HOG)、Hu矩等特征,采用支持向量機(Support Vector Machine, SVM)、Adaboost等機器學習方法進行分類。該類方法對數據集的依賴性大,算法的魯棒性不強,且人工提取特征的方式過程煩瑣復雜,依賴工程人員的自身經驗,算法的應用局限性較大。
隨著深度學習的研究與發展,基于深度學習的方法識別速度快,準確率高,成為主流的手勢識別算法。Oyedotun等人[2]將圖像二值化,利用閾值分割來獲取手勢區域,使用卷積神經網絡(Convolutional Neural Networks, CNN)和編碼器進行手勢識別。王龍等人[3]利用膚色模型進行手勢檢測,并將得到的手勢區域重建為灰度圖像,最終將手勢區域輸入CNN進行特征提取和識別。Mohanty等人[4]不進行手勢檢測處理,將原始圖像直接輸入簡單的2層CNN進行特征提取和識別。上述手勢識別分類算法中,當圖像中存在人體膚色等復雜背景干擾時,CNN識別率顯著下降。隨著目標檢測算法的發展,許多學者將手勢識別的分類問題轉換為目標檢測問題,主要分為兩種:基于回歸的1階段目標檢測方法和基于區域推薦的2階段目標檢測方法。1階段目標檢測算法主要有YOLO (You Only Look Once)[5-8], SSD (Single Shot multibox Detector)[9],RetinaNet[10]和CornerNet[11]等,2階段目標檢測算法主要有R-CNN (Region-based CNN)[12],Fast R-CNN(Fast Region-based CNN)[13], Faster R-CNN (Faster Region-based CNN)[14]和R-FCN(Region-based Fully Convolutional Networks)[15]等。Soe等人[16]用Faster R-CNN算法進行手勢識別的研究,采用ZFNet網絡作為特征提取的主干網絡,網絡雖然簡單,但不能充分提取到手勢的特征,識別率不高,在NUS-II數據集[17]所有手勢的精確率只有90.08%,手勢c的精確率更是只有65.82%。常建紅[18]提出了一種改進Faster R-CNN的手勢識別算法,在NUS-II手勢數據集上精確率達到99.89%,但是由于該算法先經過RPN推薦候選框,再進行識別,屬于2階段目標檢測算法,速度較慢。1階段的目標檢測方法比2階段法檢測速度快,更適用于一些實時性要求高的情況。張勛等人[19]基于SSD算法,使用輕量化的ASSD模型,fps為30,算法可以實時對手勢進行檢測與識別,平均精度均值為93.3,識別效果不是很好。彭玉青等人[20]提出一種基于YOLO定位和CNN分類識別的HGDR-Net算法,在復雜背景下取得不錯的效果,在處理時間為0.065 s的情況下F1平均值達到98.43%,但算法要先通過YOLO算法定位,再進行識別,識別過程復雜。王粉花等人[21]用改進YOLOv3-tiny算法進行手勢識別,fps達到220,平均精度均值為92.24%,YOLOv3-tiny-T算法識別速度雖然很快,但是平均精度均值相對較低。Jiang等人[22]提出一種改進YOLOv4-tiny算法,該算法具有更快的目標檢測速度,適合在移動端和嵌入式等運算能力不強的設備開發。
經過上述分析,以上手勢檢測識別算法都存在一定缺陷,不能在準確率和速度之間取得最好的均衡。基于此問題,本文選取適合在移動端部署的YOLOv4-tiny算法來進行手勢的檢測與識別,并在此基礎上改進算法實現準確率和速度的最佳平衡。
YOLOv4-tiny算法是在YOLOv4方法的基礎上設計的,其具有更快的目標檢測速度,預測過程與YOLOv4相同。該算法首先調整輸入圖像的大小,使所有輸入圖像具有相同的固定大小A×A(本文為416×416)。將A×A大小的圖片分為兩個尺度的網格進行預測,這兩個尺度分別為B1=A/32和B2=A/16。如果真實標注框中某個目標的中心坐標落在哪個網格中,那么就由該網格來預測該目標。網絡預測得到的輸出有兩個維度是提取到的特征圖的維度,還有一個維度(深度)大小為n×(5+N),其中n 表示每個網格預測的邊界框的數量,YOLOv4-tiny中n為3;N表示檢測的類別數,5表示4個坐標信息和1個置信度。模型會輸出(B1×B1+B2×B2)×n個邊界框,最后通過預測置信度和非極大值抑制算法來排除多余的邊界框,得到模型的最終檢測框。
YOLOv4-tiny方法使用CSPDarknet53-tiny網絡作為主干網絡來代替YOLOv4方法中使用的CSPDarknet53網絡。在特征融合部分,YOLOv4-tiny方法使用特征金字塔網絡提取不同尺度的特征并進行融合,提高了目標檢測精度。YOLOv4-tiny使用13×13和26×26兩種不同比例的特征圖來預測檢測結果,YOLOv4-tiny網絡結構如圖1所示。

圖1 YOLOv4-tiny網絡結構圖
一般卷積神經網絡結構中,在卷積層后面通常連接全連接層。而全連接層的特征數是固定的,所以在網絡輸入的時候,會固定輸入圖像的大小。在實際中,輸入的圖像尺寸不能滿足要求,需要裁剪和拉伸,但會使圖像失真。空間金字塔池化(Spatial Pyramid Pooling, SPP)是由He等人[23]提出的,用來解決計算機視覺領域中輸入圖像尺度不同而造成圖片失真的問題。如圖2(a)所示,SPP空間金字塔池化使用多級大小空間窗口,在同一個特征圖的不同尺度上提取特征并做池化操作,能夠對任意大小輸入圖像產生相同尺度的輸出。

圖2 空間金字塔池化
借鑒SPP空間金字塔池化思想,本文使用的是如圖2(b)所示的SPP空間金字塔池化模塊,對特征圖的局部區域進行最大池化操作。這里的多尺度空間金字塔池化模塊由3個最大池化層組成,池化窗口的大小分別為13×13, 9×9和5×5,步長均為1。對輸入特征圖填充0,從而確保池化后輸出的特征圖與輸入特征圖大小相同。該空間金字塔池化模塊融合了多重感受野,同時利用局部特征和全局特征來提高目標檢測的精度。
原始YOLOv4-tiny算法中的先驗框尺寸是對COCO數據集聚類得到的,有80種檢測目標,這些目標物體尺寸不一。本文手勢檢測識別網絡的檢測目標只有手勢,手勢目標數據集聚類生成的多數先驗框大小相近、寬高比相似,為了使得改進YOLOv4-tiny算法更加快速準確地預測出目標手勢的位置,本文利用K-means++聚類算法對手勢數據集NUS-II進行重新聚類,得到更適合檢測手勢的先驗框。K-means++算法是K-means算法的改進版,K-means++算法逐個選取k個簇中心,離其他簇中心越遠的樣本點越有可能成為下一個簇中心,然后計算目標與簇中心的距離,并把它們分配給最近的簇中心成為k個簇中心,重復計算更新簇中心,直到簇中心不再改變,得到最終的聚類結果。K-means++算法通常以歐氏距離作為計算的度量距離,但在該文算法中,利用簇類中心先驗框與其他先驗框的面積交并比(Intersection Over Union,IOU)作為度量距離。對NUS-II手勢數據集重新進行聚類,生成6個先驗框為(92, 165), (176, 165),(118, 256), (138, 335), (258, 284), (202, 303)。
本文在原始YOLOv4-tiny的基礎上增加SPP空間金字塔池化模塊,通過SPP模塊實現了局部手勢特征和全局手勢特征的融合,特征圖經過局部手勢特征與全局手勢特征相融合后,豐富了特征圖的表達能力,所以在檢測精度上有了較好的提升。同時,本文在YOLOv4-tiny每個最大池化層和SPP空間金字塔池化模塊后添加1×1卷積模塊,減少參數量和計算量。NUS-II手勢數據集上分類個數為10,改進YOLOv4-tiny算法的手勢識別網絡結構如圖3所示。

圖3 改進YOLOv4-tiny算法手勢識別結構圖
本實驗操作系統為Ubuntu16.04,設備為Intel(R) Core(TM) i5-9400F和NVIDIA GeForce RTX 2080Ti,采用深度學習框架為Darknet,調用CUDA(Computer Unified Device Architecture)和英偉達神經網絡庫(NVIDIA CuDNN, cuDNN)為顯卡加速,CUDA和cuDNN版本分別為10.1和7.6,同時安裝計算機視覺庫OpenCV3.4.11顯示檢測的結果。采用遷移學習思想,將YOLO官網在COCO數據集上預訓練的yolov4-tiny.conv.29權重作為初始權重進行訓練,加快網絡收斂。網絡輸入圖像為416×416大小的RGB圖像,批量大小設置為64,subvision設置為8,動量參數設置為0.9,權重衰減為0.0005,訓練最大迭代數設置為40000,初始學習率設置為0.001,分別在總迭代數的80%和90%即32000次和36000次時將學習率調為0.0001和0.00001。
實驗采用的是公開手勢數據集NUS-II,這是一個10類手勢數據集,手勢背景比較復雜,是各種自然場景。這些形狀不同、尺寸各異的手勢由40名不同種族人士分別在不同背景下拍攝,分別展示字母“a”到“j”總共10種手勢,每個字母手勢拍攝5次。同時,數據集中還包括帶有人類干擾的750張圖片,數據集合計2750張。數據集貼合實際生活,可以研究不同復雜背景、不同光照、不同手勢下的識別,有很大的研究價值。將2750張數據集分為2305張訓練集和445張測試集,數據集部分圖片如圖4所示。

圖4 NUS-II手勢數據集
訓練過程中,每4個epoch在測試集上計算1次mAP,圖5顯示了手勢檢測識別模型在訓練期間的損失曲線和mAP曲線變化。從圖5看出,在模型訓練的初級階段,模型學習效率較高,訓練曲線收斂速度快。隨著訓練的深入,訓練曲線的斜率逐漸減小,最后,當訓練迭代數到達大約8000,模型學習效率逐漸達到飽和,損失在0.006左右。mAP在迭代數2000時基本達到100%并穩定維持。訓練的YOLOv4-tiny算法對手勢的檢測識別效果如圖6所示,可以看出該算法能夠準確檢測并識別出NUSII測試集上復雜背景、帶有膚色和人臉干擾的“a”-“j”10種手勢。

圖5 手勢檢測模型的mAP和損失曲線

圖6 手勢檢測識別結果
實驗采用精確率、平均精度均值和每秒傳輸幀數作為評價手勢檢測識別方法的性能評價標準。精確率和召回率計算方法如式(1)和式(2)所示

其中,TP表示正樣本被正確識別為正樣本的個數,FP表示負樣本被錯誤識別為正樣本的個數,FN表示正樣本被錯誤識別為負樣本的個數。通過取不同的精確率和召回率值可以畫出PR曲線,PR曲線下的面積就定義為AP,取所有檢測類別AP的均值即為mAP。性能評價指標AP和mAP計算方法如式(3)和式(4)所示

與文獻[16,18]、YOLOv3-tiny和YOLOv4-tiny進行比較,以測試該文改進算法的性能,其中,YOLOv4-tiny1表示用K-means++聚類算法對手勢數據集生成的先驗框進行的實驗;YOLOv4-tiny2表示在K-means++聚類的基礎上,添加1×1卷積模塊進行的實驗;YOLOv4-tiny3表示在K-means++聚類的基礎上,添加SPP空間金字塔池化模塊進行的實驗。
結果如表1所示,文獻[16]精確率只有90.08%,文獻[18]精確率99.89%最高,但是由于文獻[18]使用的是2階段目標檢測算法Faster R-CNN,因此速度很慢,不能實時檢測手勢。由于NUS-II數據集相對簡單,YOLOv3-tiny, YOLOv4-tiny和本文改進YOLOv4-tiny算法都能很容易學習到數據集手勢特征,在IOU取0.5的時候,mAP@0.5都很高,分別為99.97%, 100%, 100%。本文也選取對檢測要求更高的即IOU為0.9和IOU為0.5:0.05:0.9的均值作為衡量算法性能的標準。可以看出雖然YOLOv3-tiny算法速度最快,FPS為420,但是IOU為0.9的時候,mAP@0.9僅為22.13%,說明YOLOv3-tiny對手勢定位不準,不能很好地預測出手勢的準確位置。同理,IOU為0.9的時候,YOLOv4-tiny算法的mAP@0.9為61.87%,而本文改進YOLOv4-tiny算法的mAP@0.9為71.36%,提高了9.49個百分點。計算在IOU取0.5到0.95時候的10個mAP均值,YOLOv3-tiny, YOLOv4-tiny和本文改進YOLOv4-tiny算法的mAP@0.5:0.95分別為77.05%, 86.10%和88.01%,本文改進算法提高了1.91%。綜合考慮算法的精度和速度,本文改進算法有著最好的檢測效果。

表1 實驗結果對比
為了更直觀地看出算法的性能,用3種算法分別對測試集中的圖片預測,結果如圖7至圖9所示,可以看出,對于手勢a,3種算法都能很好地檢測識別出手勢a;對于手勢d,YOLOv3-tiny算法定位手勢稍有偏差,YOLOv4-tiny和本文改進算法都能準確定位并識別;對于手勢c,YOLOv3-tiny和YOLOv4-tiny算法都出現了一定的定位偏差,本文改進算法依然可以準確定位到手勢并識別出來。本文改進算法是以上算法中速度和準確率最佳權衡的算法。

圖7 YOLOv3-tiny算法手勢檢測識別結果

圖8 YOLOv4-tiny算法手勢檢測識別結果

圖9 改進YOLOv4-tiny算法手勢檢測識別結果
安卓(Android)是Google開發的基于Linux平臺的開源手機操作系統,主要用于智能手機與平板電腦,現在已經拓展到互聯網電視、智能家居等。它包括操作系統、用戶界面和應用程序。應用非常廣泛,開發環境不會受到各種條條框框的限制,開發者任意修改開放的源代碼來實現與開發各種實用的手機APP軟件,具有高級圖形顯示、界面友好等特點,對人機交互有著廣泛的應用前景。
為了方便在移動端部署深度學習模型,出現了很多移動端深度學習工具,本文使用ncnn[24]框架進行模型部署。騰訊優圖實驗室的ncnn是一個為手機端極致優化的高性能神經網絡計算框架。設計初心就考慮手機端的部署和使用,手機端CPU的處理速度快于目前已知的移動端深度學習框架。開發者能夠將深度學習算法輕松移植到手機端并高效執行,開發出人工智能手機APP,將人工智能算法在手機端運行。
首先將在darknet環境中訓練的改進YOLOv4-tiny手勢識別權重文件gesture.weights和網絡配置文件gesture.cfg文件轉成ncnn格式的gesture.param和gesture.bin文件。然后搭建Android手勢識別項目工程,在主程序中調用手勢識別算法進行檢測識別。手勢識別算法在小米10手機進行測試,如圖10所示,對拍攝手勢圖進行檢測識別,手機APP可以正確識別出“a”-“j”10種手勢,一張手勢圖處理時間僅需4.4 ms,fps為22,可以達到移動端實時檢測識別的效果。

圖10 移動端手勢識別
手勢識別算法的發展趨勢要求識別準確率高,識別速度快,同時識別算法要小,可以部署在移動端。本文提出一種改進YOLOv4-tiny算法,通過增加SPP空間金字塔池化模塊來融合圖像全局和局部特征,增強算法的手勢定位準確度,豐富了特征圖的表達能力;通過增加1×1卷積模塊減少網絡參數,同時提升網絡處理速度;通過K-means++聚類算法對手勢數據集重新聚類,得到更適合檢測手勢的先驗框。實驗表明,本文改進算法在幾乎不影響處理速度的情況下提升檢測性能,mAP@0.9為71.36%,相比改進前提高了9.49個百分點,mAP@0.5:0.95為88.01%,相比改進前提高了1.91%,檢測效果得到明顯的提升。將本文算法移植到移動端,僅需要4.4 ms即可準確檢測并識別出手勢,可以在移動端進行實時的手勢檢測與識別,對人機交互領域有很大的研究意義。