刁艷俠,吳 浩
(康佳集團股份有限公司,廣東 深圳 518000)
智能電視作為智能家居的重要載體,已經逐步開啟全面智能化的發(fā)展進程。對于智能電視來說,傳統(tǒng)的遙控器操作不夠便捷,語音操控雖然在搜索媒資時非常便捷,但是受制于用戶群體和使用場景等因素的影響,并不能完美覆蓋智能電視的各種應用場景,手勢操控因為靈活便捷又不受環(huán)境噪音等影響,成為人與智能電視交互的一種很好的補充方式。本文就從手勢識別的基礎技術原理出發(fā),介紹在智能電視硬件性能受限的情況下如何做手勢識別算法設計,以及手勢識別的基本流程。
手勢的分類方法有很多種,最常見的是根據(jù)空間特性來將手勢分為靜態(tài)手勢和動態(tài)手勢。靜態(tài)手勢強調的是某個時間點的手形、與身體的相對位置以及方向,動態(tài)手勢則強調手的動作過程。
最早的手勢識別是通過設備“數(shù)據(jù)手套”完成的[1],通過利用傳感器等設備直接來檢測人手和各個關節(jié)的位置信息來識別手勢。雖然有較高的穩(wěn)定性和準確性,但可識別的手勢較少,檢測的限制也較多。另一種手勢識別的方式——基于視覺的手勢識別方式則是根據(jù)攝像頭采集到的數(shù)據(jù),通過計算機處理后對手勢進行識別的。其優(yōu)點在于交互操作更加便捷,而且隨著電子設備上攝像頭的推廣,手勢識別的硬件門檻更低。
基于視覺的手勢識別系統(tǒng)由手勢輸入、圖像預處理、手勢檢測及分割、手勢分析及手勢識別等組成,系統(tǒng)框架如圖1所示。
圖1 基于視覺的手勢識別系統(tǒng)框架
用戶手勢通過攝像頭獲取圖像輸入后,需要進行預處理。預處理的目的是提升畫面質量、去除噪聲,以便更好地進行手勢識別。常用的圖像預處理方法有去噪化、銳化處理等。
手勢檢測是識別的前提。通過手勢檢測來分辨圖像中是否存在手勢和手勢的空間位置,來識別視頻流圖像中的手勢目標。若存在手勢,就需要進行手勢分割,將手勢從背景中分割出來。常用的手勢檢測方法分為基于運動信息和基于表觀特征的檢測兩種?;谶\動信息的檢測方式利用手勢與背景的差異來實現(xiàn)手部動作的跟蹤,如光流法[2]?;诒碛^特征的檢測方式常用膚色、手型和輪廓等特征來分割手勢,其中最常用的特征是膚色,如通過YUV顏色空間[3]或是人體膚色的聚類特性[4]來進行手勢分割。此方法雖然排除了手的形狀的干擾,但是更容易受到如光照等外界環(huán)境的干擾。實際的技術落地中,環(huán)境往往非常復雜,單一方法難以往往難以應付,所以實際使用時最常見的做法是采取將多種特征融合的方式進行檢測分割,如結合膚色和運動檢測技術設計分割算法[5],可以克服單一標準分割的局限性。此外,通過識別深度信息也是一個克服復雜環(huán)境的常用方法,例如,談家譜等[6]、王松林[7]基于微軟公司開發(fā)的Kinect設備通過深度信息改善了手勢識別的效果。但是這種方法需要能識別深度信息的硬件支持,在實際落地過程中存在成本壓力。
手勢建模是手勢識別過程中最重要的步驟之一。只有模型足夠高效精確,才能保證識別的準確率。對于靜態(tài)的手勢識別,需要基于表觀特征來建立手勢模型。常見的建模方式有基于運動參數(shù)、基于圖像特征、基于可變性模板和基于灰度圖來建模。對于動態(tài)手勢而言,需要基于三維模型來建立手勢模型。常見的建模方式有三維骨架模型、網絡模型、紋理模型和幾何模型。
手勢分析是根據(jù)手勢模型來分析手勢,獲取手勢的特征值。特征提取是在手勢分割的基礎上提取手勢的關鍵特征。根據(jù)分割的結果得到手勢邊緣,進而得到手勢形狀,具體的特征有邊緣、手指的位置和方向等。
手勢識別是基于手勢分析的結果,進行手勢軌跡空間分類的過程。手勢分為靜態(tài)和動態(tài)兩種,其中靜態(tài)對應的是模型參數(shù)中的一個點,動態(tài)手勢對應的則是一個軌跡。靜態(tài)手勢的識別的常用算法是模板匹配和BP神經網絡等。動態(tài)手勢則適合用1968年提出的HMM模型[8]等。
通過設計計算機視覺算法實現(xiàn)識別OK手勢、手槍手勢、拇指向上、拇指向下、拇指向左、拇指向右,以及拳頭左滑和拳頭右滑8種手勢,分別實現(xiàn)確認、返回、上下左右移動和加減音量的功能;并將算法移植到Hi3516DV300上,從而實現(xiàn)通過手勢控制電視完成相應的功能。另外,算法移植到芯片上,單人單任務速度不大于30 ms。
按實現(xiàn)功能的方式分類,實現(xiàn)設計目標的算法設計思路有以下三種。
(1)采用3D ConvNet對連續(xù)的圖像序列建模進行手勢判斷,進而進行連續(xù)的動作識別。對檢測到的手勢圖像序列進行手勢動作識別,同樣可以采用3D ConNet或者LSTM Net對連續(xù)的圖像序列構建動作模型,對連續(xù)的手勢圖像序列做最終的手勢動作判別。
(2)對視頻圖像序列先進行手部骨架關鍵點定位,然后對提取到的手部關鍵點進行關聯(lián)計算,來對各種手勢進行識別判斷。
(3)采用目標檢測的思想,通過設計2D ConvNet,直接對圖像序列存在的手部檢測與手勢分類實現(xiàn)靜態(tài)手勢識別、連續(xù)多幀位置關系判斷,實現(xiàn)動態(tài)手勢識別。
從數(shù)據(jù)標注的周期、制作的難易程度以及算法最終需要移植到中低端算力有限的芯片上考慮,本文設計的算法主要采用目標檢測的方式實現(xiàn)手勢識別功能。
根據(jù)芯片的實際性能參數(shù),在設計算法模型時設定了以下原則:在設計網絡結構時,盡量采用芯片可以支持的算子;盡量采用輕量級的網絡結構,因為過深的網絡結構會導致芯片的處理速度變慢;謹慎使用分組卷積。
訓練數(shù)據(jù)集的手勢類別總共8類,即OK手勢、手槍手勢、拇指向上手勢、拇指向下手勢、拇指向左手勢、拇指向右手勢、拳頭手勢以及負樣本手勢(除上述以外的手勢)。數(shù)據(jù)場景主要是四個不同室內場景,包含不同距離(人離攝像頭距離)、不同高度(攝像頭距離地面高度)、不同光照以及不同人,數(shù)據(jù)格式包括視頻數(shù)據(jù)和靜態(tài)圖像數(shù)據(jù)。
2.4.1 YOLOv4-tiny檢測模型設計
YOLOv4-tiny主干網絡主要由CBL以及CSP網絡結構組成。CBL具體是由卷積層、BN層和激活層(LeakyRelu)組成。CSP是一個類似殘差結構,由若干個CBL塊組成。
考慮到算法移植和最終板端的速度問題,設計模型時主要做了如下幾個部分的改進。
(1)CBL模塊中l(wèi)eakyRelu激活函數(shù)改成relu激活函數(shù),板端實驗驗證leakyRelu激活函數(shù)耗時要比relu激活函數(shù)耗時多。
(2)原始基于最近鄰插值算法上采樣層改成轉置卷積層,原因是由于HI3516上不支持最近鄰插值算法的上采樣層。
(3)考慮到原始網絡輸入416×416相對于1 920×1 080這樣大的分辨率圖像而言,手部所占原始圖片相對比較小,網絡模型檢測手勢這種小目標難度有點大,故網絡輸入采用的是512×512大小。而網絡輸入的增大也會帶來計算量的增加,在板端就無法滿足速度需求。
2.4.2 YOLOv4-tiny網絡模型壓縮方法
具體融合方案如下。
(1)卷積層,進行卷積處理:
式中:x代表輸入數(shù)值,w代表權重,b代表偏差。
BN層,對數(shù)據(jù)做歸一化處理,作用是加快模型訓練時的收斂速度,使得模型訓練過程更加穩(wěn)定:
式中:γ,β代表可訓練參數(shù)。
為了加快運算速度,先對公式進行融合,將Conv層的公式代入BN層的公式得到:
融合后的新層的權重與偏差是:
2.4.3 瞄點框anchor設置
YOLOv4-tiny檢測網絡采用兩個檢測層,每個檢測層有3組瞄點框,總共有6組瞄點框。六組瞄點框是通過訓練集利用聚類算法聚類而來。本算法通過聚類得到的瞄點框大小是[9,25 10,33 13,28 14,38 19,45 19,18]。
本網絡模型算法主要用到的訓練策略包括數(shù)據(jù)預處理、數(shù)據(jù)增強、調整學習率下降策略以及修改loss損失函數(shù)。
(1)數(shù)據(jù)預處理。按照寬高縱橫比例進行縮放,將原始1 920×1 080的圖像縮放至512×512大小,這樣保證縮放后的圖像不會產生畸變。
(2)數(shù)據(jù)增強。為了提高模型的魯棒性以及模型的泛化能力,訓練過程采用了如下幾種方法:對圖像隨機添加噪聲以及模糊,對圖像隨機進行裁剪以及平移,對圖像隨機旋轉。
(3)loss損失函數(shù)的調整??紤]到數(shù)據(jù)集手勢數(shù)據(jù)樣本不平衡的問題,在設計類別損失函數(shù)時,將原有的交叉熵損失替換為focal loss損失。
(4)學習率下降策略的調整。固定的學習率往往讓模型訓練性能達不到最優(yōu)的效果,因此在設置學習時,采用等間隔調整學習率的策略,逐步減小學習率,提升訓練模型性能。
采用跟蹤算法對手勢賦予一個ID號,以判別所做手勢的先后順序,從而確定誰的手做出的手勢先控制電視完成相應的動作??紤]到移植到板端的速度,手勢跟蹤算法采用傳統(tǒng)的(sort)跟蹤算法。
上述手勢識別分為靜態(tài)手勢識別與動態(tài)手勢識別兩種,其中OK手勢、手槍手勢及拇指向上/下/左/右為靜態(tài)手勢識別,拳頭左滑、拳頭右滑為動態(tài)手勢識別。下面分別介紹兩種手勢識別的具體流程。
2.7.1 靜態(tài)手勢識別
靜態(tài)手勢主要是通過對一段手勢視頻序列進行手勢類別識別,統(tǒng)計這段視頻序列中分數(shù)最高的某種手勢,判定為這段視頻序列的最終手勢輸出。靜態(tài)手勢識別的具體流程如圖2所示。
圖2 靜態(tài)手勢識別流程圖
2.7.2 動態(tài)手勢識別
動態(tài)手勢識別主要通過檢測配合跟蹤的思想,通過前后幀的位置關系判斷上下左右方向,從而實現(xiàn)動態(tài)手勢識別,其流程如圖3所示。
圖3 動態(tài)手勢識別流程圖
本算法主要在HI3516DV300芯片上進行速度指標測試。預期結果是單人單任務速度不大于40 ms。實際檢測結果如表1所示。
表1 Yolov4-tiny算法在HI3516DV300芯片的測試結果
從表1的測試結果可以看出,板端推理速度滿足在40 ms內的目標。
本文介紹了一種視覺手勢識別算法的設計方案,目的是通過6個靜態(tài)手勢和2個動態(tài)手勢來實現(xiàn)確認、返回、上下左右移動和增減音量等基本的電視交互操作。從測試結果看,手勢識別速度在目標芯片上達到了設計目標,為視覺手勢操控在智能電視上的應用提供了一種可行方案。