蘇 靜,劉兆峰,王 嫄,馮柯翔,王曉薇
(天津科技大學人工智能學院,天津 300457)
計算機視覺技術(shù)正逐步進入人們?nèi)粘I?,并推動著人機交互領(lǐng)域的升級和進化.基于手勢的人機交互中一個非常重要的環(huán)節(jié)是手勢識別.目前已實現(xiàn)的手勢識別算法包括基于模板匹配、基于數(shù)據(jù)手套以及基于隱馬爾科夫模型等.但是,這些算法存在工序復雜、設備昂貴、計算量大等問題,導致訓練模型的泛化能力差,因此很難達到實時檢測的目的.基于計算機視覺的手勢識別方法可以有效克服傳統(tǒng)方法的弊端,YOLO(you only look once)算法的出現(xiàn),在目標檢測領(lǐng)域取得極佳的檢測效果[1].
目標檢測是一個從深度學習快速發(fā)展中受益匪淺的領(lǐng)域,近年來人們實現(xiàn)了許多目標檢測算法,包括Faster RCNN算法[2]、SSD算法[3]、Mask-RCNN算法[4]和RetinalNet算法等[5].YOLO算法是目標檢測中one-stage的開山之作,開辟性地將物體檢測任務直接作為回歸問題處理,直接將候選和檢測兩個階段合而為一,“只需要看一眼”就可以知道在每張圖片中有哪些物體以及物體的位置.相較于之前的物體檢測方法,YOLO算法在保證一定的檢測準確率的前提下達到了實時檢測的速度.
在實驗中將原始版本的YOLOv3算法[6]應用于手勢實時識別領(lǐng)域,雖然可以取得較好的效果,平均準確率(mAP)達到96.36%,準確率為98.06%,但召回率僅為81.59%,在檢測的精度和速度上還有一定的提升空間,并且由于訓練集數(shù)量和GPU顯存的限制,導致訓練時間過長.
為了解決上述問題,本文提出對YOLOv3算法進行改進:首先,YOLOv3算法中的先驗框是利用Kmeans[7]聚類算法在COCO數(shù)據(jù)集預計算定義,但由于目標檢測結(jié)果往往需要縮放到原始尺寸,自定義數(shù)據(jù)集中目標對象的尺寸與COCO數(shù)據(jù)集的并不完全相同,因此需通過對所有標簽的邊界框進行重新聚類計算先驗框,提高模型識別的準確率和召回率;之后,針對GPU顯存的限制,采用在輸入端進行Mosaic數(shù)據(jù)增強[8]的方式解決,通過隨機選取4張圖片進行隨機縮放、隨機裁減、隨機分布的方式進行拼接,一次訓練4張圖片可以大大提高訓練效率,個人電腦單GPU就可以達到很好的效果,并且極大縮短了訓練時間;最后,在輸出端調(diào)整損失函數(shù),結(jié)合IoU、GIoU、CIoU、DIoU[9]定義GCDIoU損失函數(shù),加快訓練過程中的位置損失的下降速度,提高模型的訓練效率.
YOLOv3是完全卷積網(wǎng)絡(fully convolutional networks for semantic segmentation,F(xiàn)CN)[10],有75個卷積層,還有跳躍連接層和上采樣層,沒有池化層,使用步長為2的卷積層對特征圖進行采樣.作為完全卷積網(wǎng)絡,YOLOv3是可以處理各種輸入圖像的大小,但在實際實驗中還要保持一個恒定的輸入大小,其中一個很大的問題是,如果想進行批處理圖像,那么就需要固定圖像的寬高,這是將多個圖像連接成一個大批處理所需要的.
網(wǎng)絡通過步長因子對圖像進行下采樣.例如,如果網(wǎng)絡的步長是32,則大小為416×416的輸入圖像將產(chǎn)生大小為13×13的輸出圖像.一般來說,網(wǎng)絡中任何一層的步長都等于該層的輸出小于網(wǎng)絡輸入圖像的因子.
在深度方面,特征圖中有 S× S( B × ( 5+ C))個元素,B表示每個單元格可以預測的邊界框的數(shù)量,每個邊界框都有5+C屬性,這些屬性描述每個邊界框的中心坐標、尺寸、對象性得分和C類置信度.YOLOv3為每個單元格預測3個邊界框.
YOLOv3網(wǎng)絡對輸入圖像進行下采樣直到第一檢測層,其中使用步長為32的層的特征映射進行檢測,以因子2向上采樣,然后與具有相同特征圖大小的先前層的特征圖連接.另一個檢測層的步長為16,重復相同的上采樣程序,并在步長為8的層進行最終檢測.上采樣可以幫助網(wǎng)絡學習細粒度特征,這些特征有助于YOLOv3檢測小物體.
網(wǎng)絡在3個不同的尺度上進行預測,檢測層用于對3種不同尺寸(32、16、8)的特征圖進行檢測.也就是說,當輸入是416×416的情況下,模型在13×13、26×26和52×52的尺度上進行檢測.
由于特定手勢控制數(shù)據(jù)集的稀缺,導致互聯(lián)網(wǎng)上暫時未有符合項目要求的公開數(shù)據(jù)集,因此實驗中采用眾包方式收集大量手勢錄像.對于通過使用攝像頭和計算機視覺技術(shù)捕獲的RGB手勢錄像,首先要將其按照10 幀/秒進行切分,然后按照YOLO算法數(shù)據(jù)集的格式通過CVAT進行人工標記手勢區(qū)域,標注內(nèi)容包括手勢的類別信息以及位置信息.
標注工作完成后要對所有的標簽進行K-means聚類處理,結(jié)果如圖1所示.圖1中:(a)為選擇的5種手勢圖片數(shù)量,0—4分別代表鼠標的單擊、雙擊、右鍵、上滑和下滑;(b)為通過K-means聚類算法得到的先驗框,由于數(shù)據(jù)集中大部分都是手勢box,所以表現(xiàn)為豎直框;(c)為手勢位置在圖片中的分布,空白部分為面部和胸前位置;(d)為box的寬高所占圖像寬高比例分布,呈現(xiàn)線性相關(guān)性.
圖1 K-means聚類處理結(jié)果 Fig. 1 Clustering results of K-means
數(shù)據(jù)增強是由現(xiàn)有的、有限的訓練數(shù)據(jù)通過變換創(chuàng)建新的訓練樣本,通過調(diào)整圖像的參數(shù)推廣到其他情況,允許模型適應更廣泛的情況.用于手勢識別的數(shù)據(jù)集并不大,因此采用了廣泛的數(shù)據(jù)增強,包括幾何畸變、光照畸變、色彩空間調(diào)整和圖像遮擋等等.除此之外,在手勢識別的項目訓練中,由于手勢大部分都是小目標,而YOLOv3針對小目標的檢測效果并不理想,因此需要對數(shù)據(jù)進行一些處理. Mosaic數(shù)據(jù)增強是參考CutMix數(shù)據(jù)增強[11]的方式,但CutMix數(shù)據(jù)增強只使用了2張圖片進行拼接,而Mosaic數(shù)據(jù)增強則采用了4張圖片,實驗在此基礎上又添加了色彩空間的調(diào)整(圖2),通過隨機縮放、隨機裁減、隨機分布的方式進行拼接,并且隨機添加邊緣空白.
圖2 Mosaic數(shù)據(jù)增強和色彩空間調(diào)整 Fig. 2 Data enhancement and color space adjustment
隨機縮放增加了很多小目標,讓網(wǎng)絡檢測效果更好,對小目標檢測的準確率更高,并且通過Mosaic數(shù)據(jù)增強訓練時可以直接計算4張圖片的數(shù)據(jù),使得小批次訓練大小并不需要特別大,個人電腦的GPU就可以達到很好的效果.
IoU_Loss[12]由曠視科技提出,把4個點(x,y,w,h)構(gòu)成目標的真實邊界框(box)看成整體進行回歸,對兩個box計算其交并比,但IoU_Loss有兩個缺點:第一,當預測框和目標框不相交時,IoU=0,不能反映距離的遠近,此時損失函數(shù)不可導,因此無法優(yōu)化兩個box不相交的情況;第二,如果預測框和目標框的大小確定,只要兩個box的相交值是確定的,其IoU值就是確定的,但并不能反映兩個box是如何相交的.
基于IoU存在的問題,一個好的位置損失函數(shù)應該考慮重疊面積、中心點距離、box寬高比這3個重要的幾何因素.
GIoU損失函數(shù)是通過IoU減去兩個邊界框閉包區(qū)域中不屬于兩個框的區(qū)域占閉包區(qū)域的比重表示.DIoU和CIoU損失函數(shù)是將目標與先驗框之間的距離、重疊率、尺度和box寬高比均考慮進去,使得目標框回歸變得更加穩(wěn)定,不會像IoU和GIoU一樣出現(xiàn)訓練過程中發(fā)散等問題.
綜合考慮各種IoU的計算優(yōu)劣勢,定義GCDIoU_Loss為損失函數(shù) LGCDIoU_Loss進行優(yōu)化.
式中:b和 bgt分別為預測框B和預測框Bgt的中心點,ρ(·)為歐式距離,c為預測框B和預測框Bgt的最小外接矩形的對角線距離,v用來度量寬高比的相似性.
訓練的模型可以通過調(diào)用電腦的默認攝像頭獲取圖像,并返回屏幕中識別的手勢位置和標簽,然后通過pynput庫進行人機交互.
pynput庫是一個可以控制和監(jiān)聽輸入設備,通過pynput.mouse包含用于控制和監(jiān)聽鼠標或觸控板的類,通過pynput.keyboard包含用于控制和監(jiān)聽鍵盤的類,并且可以通過設置環(huán)境變量將其值作用于適合當前平臺的鍵盤或鼠標后端.
為了確保在Windows上監(jiān)聽器和控制器之間的坐標一致,當系統(tǒng)縮放比例增加到100%以上時,最新版本的Windows支持運行舊版本的應用程序,這使舊的應用程序可以縮放,盡管比較模糊,但這種縮放導致鼠標監(jiān)聽器和控制器的坐標信息不一致,監(jiān)聽器接收物理空間坐標,但是通過控制器設計必須使用縮放的坐標.要解決以上問題,需要設置Windows應用支持定位精度DPI,并且這是一個全局設置,因此需要通過ctypes模塊啟用DPI感知.
pynput方法參考:click(button,count=1)表示在當前位置發(fā)出按鈕單擊事件,move(dx,dy)表示將鼠標指針從其當前位置移出多個像素,position表示返回鼠標指針的當前位置,press(button)表示在當前位置發(fā)出按鈕按下事件,release(button)表示在當前位置發(fā)出按鈕釋放事件,scroll(dx,dy)表示發(fā)送滾動 事件.
實驗環(huán)境:Window 10、Intel(R)Core(TM)i7-7700HQ CPU@2.80GHz、NVIDIA GeForce GTX 1060 with Max-Q Design、Python 3.8、PyTorch 1.7.1、CUDA 10.2、cudnn 7.0個人電腦.
實驗結(jié)果如圖3所示.由圖3可以發(fā)現(xiàn),實驗中所采用的方法得到了預期的效果.GCDIoU由于增加了包含預測框和真實框的最小矩形框,計算每個預測框之間的歐氏距離,并且綜合考慮重疊率和寬高比,讓模型加速收斂.迭代次數(shù)為100時,位置損失低于0.03,置信度損失低于0.01,分類損失低于0.01.最終檢測的準確率為98.87%,接近100%.由于Mosaic數(shù)據(jù)增強人為制造了大量的小目標,提升了對手勢檢測的召回率,在迭代次數(shù)為100時,就已經(jīng)穩(wěn)定在99.98%.
圖3 訓練集實驗結(jié)果 Fig. 3 Experimental results of training sets
對于深度學習的神經(jīng)網(wǎng)絡模型來說,損失函數(shù)的設計尤為重要,對比YOLO-V1和YOLOv3中的定位損失,采用的是平方和的損失計算方法,雖然可以考慮不同尺度對回歸損失的影響,但沒有考慮到位置坐標的相關(guān)性,并不能很好地反映預測框與真實框的重合程度.
通過結(jié)合IoU、GIoU、CIoU、DIoU定義的GCDIoU損失函數(shù),充分考慮了預測框和真實框的重疊面積、中心點距離、寬高比,在訓練過程中加快了位置損失的下降速度,以此提高模型的訓練效率.如圖4所示,GCDIoU的損失值相比于其他4種基本處于較低水平.
圖4 不同IoU損失值下降對比 Fig. 4 Comparison of different IOU loss values
為檢測模型改進效果,實驗中對比改進前與改進后模型在測試集的mAP值對比(圖5),結(jié)果表明改進效果較好.
圖5 模型改進前后測試集mAP值對比 Fig. 5 Comparison of mAP value of test sets before and after model improvement
本文提出了一種基于改進的YOLOv3實現(xiàn)的手勢實時識別人機交互方法.數(shù)據(jù)集通過對錄像按照10 幀/秒進行切分獲得圖片,借助CVAT標注工具進行標注.底層特征提取器采用遷移Darknet-53模型,通過K-means聚類算法對先驗框進行優(yōu)化,訓練時通過Mosaic數(shù)據(jù)增強提高手勢檢測準確率,最后通過訓練出的模型結(jié)合pynput模塊實現(xiàn)手勢識別控制鼠標達成人機交互.改進后的人機交互方法在識別準確率、召回率和速度上都取得了很好的效果,可用于基于視覺手勢交互場景的實時識別,對視頻中的多目標手勢進行快速、準確的識別.
人機交互方式的改進可以帶來工作效率的提升,本文提出的手勢識別與人機交互方法只是針對靜態(tài)手勢進行識別,對于視頻中幀與幀之間的時序信息沒有加以利用,未來改進的方向是識別和理解連續(xù)的、動態(tài)的手勢.