賀文濤, 黃學宇, 李 瑤
(空軍工程大學防空反導學院, 西安, 710051)
隨著模式識別和圖像處理技術的快速發展,人體分析作為該領域一個分支近來也受到了科研人員和工業應用的廣泛關注,但當前的大多數分析算法僅將人體自身作為研究點,通過對人體的全身姿態或動作捕捉來進行相關應用,少有針對某一特定身體部位進行的分析研究,對人體與物體的關聯研究也比較少。
現有的人體分析算法可按實現方式大致分為兩類,自上而下(top-down)和自下而上(bottom-up)。自上而下的方式指的是在每次的檢測中首先使用人物檢測器識別圖片中的人員,然后在此基礎上進行分析,如Newell[1],WEI[2]等使用的姿態估計方法。這種方式的缺點是需要很高的前期人員識別準確率保證,一旦無法識別人物,姿態估計就會失效;另外,由于對每個人都要使用一個檢測器,隨著圖片中人物數量的增加,其計算成本會隨之成倍增加。相較之下,自下而上的方式則可以彌補這些缺點,其首先在全局進行關節熱點圖的提取,然后根據向量關系進行連通,從而為前期保證提供了高可靠性。但早期的自下而上方法,如Pishchulin[3],Insafutdinov[4]等提出的方法,由于最終的解析仍需要復雜的全局推斷,因此并未提高效率。文獻[5]用貪心算法將關鍵點連接起來,大大提升了效率,使得實時的人體分析成為現實。
當前的目標檢測器通常由三部分組成:第一部分是在擁有海量的圖片集如ImageNet上經過預訓練的主干網絡(backbone);第二部分是用于預測類別和物體方框位置的頭(head),主要可分為二階檢測器(R-CNN[6-10]系列)和單階檢測器(YOLO[11-14],SSD[15]和RetinaNet[16]等);第三部分是Neck網絡,指的是在backbone和head之間插入的連接層,用于連接不同階段的特征圖。
近年來,手持物體分析正受到越來越多的關注和應用,但大多應用通常有著嚴格的條件和區域限制。如文獻[17]中駕駛員手持通話檢測,首先攝像頭需要正對駕駛員,然后進行人臉檢測,估算耳部位置劃出感興趣區域,再根據區域內手部存在時間加上唇部張合狀態來綜合判斷手持通話狀態,步驟相當繁瑣且需要很高的前期識別準確保證。
為補充專用于手持物體分析算法的缺失,以及更為準確穩定的識別結果,本文提出了一種可全局分析的手持物體行為分析算法。
Openpose[5]是由卡耐基梅隆大學(CMU)感知實驗室發布的一種實時多人姿態估計方法。該方法采用一種非參數的表達方式,即局部親和矢量場(part affinity fields,PAF),來學習將各個身體部位與圖片中的各個人體相關聯。其體系結構通過對全局的內容進行編碼,從而自下而上地用貪心算法進行解析,無論圖片中有多少人,都能在保持高精度的同時保證實時性。其網絡結構主要是通過一個連續的預測過程的兩個分支來同時學習關鍵點的定位以及它們之間的關聯。
Openpose的網絡結構圖如圖1所示。

圖1 多階段的雙支路網絡結構圖
圖1中F是由經過微調的VGG-19卷積網絡的前10層通過對輸入圖片的分析后生成的特征圖集合,然后將F作為兩個分支第一階段(Stage 1)的輸入,其中分支一(Branch 1)用于預測置信圖St,分支二(Branch 2)用于預測PAFs-Lt。在每個階段之后,兩個分支的預測結果會被合并作為下一個階段的輸入,并重復上一階段的操作。
通過上述重復操作,即可預測關鍵點位置及其置信圖。最后,通過貪心算法將這些關鍵點連接起來即可獲得人體的骨架圖。如圖2所示。

圖2 Openpose檢測結果
其中,兩個相鄰關鍵點dj1和dj2的關聯性的評估是通過計算相應矢量場中向量間的線積分來實現的:
(1)
式中:P(u)表示dj1和dj2之間的點。
P(u)=(1-u)dj1+udj2
(2)
Yolov4是由Alexey Bochkovskiy[14]等人于2020年4月發布的目標檢測算法。通過將時下最為先進的網絡調優方法,如加權殘差連接(WRC)、跨階段部分連接(CSP)、跨小批量歸一化(CmBN)、自對抗訓練(SAT)、Mish激活函數、馬賽克數據增強、DropBlock正則化、CIoU Loss等,在Yolov3的基礎上進行對比改進實驗,最終獲得了檢測速度與檢測精度的最佳平衡的目標檢測器——Yolov4。
圖3為Yolov4與當前其他最先進方法在COCO數據集上的檢測速度、精度對比圖。

圖3 Yolov4檢測效果對比[11]
由圖3可知,檢測速度差不多時Yolov4的檢測精度更高;檢測精度差不多時,Yolov4則更快。最終其結構如下:
backbone:CSPDarknet53[18]
neck:SPP[19],PAN[20]
head:Yolov3[13]
此外,網絡結構針對單GPU訓練做了優化,不需要額外的訓練成本即可復現其優良性能,因此本文選擇Yolov4作為物體檢測器的基礎框架,在其基礎上搭建本文算法。
本文的算法流程如圖4,以右手為例進行說明。

圖4 算法流程圖
輸入圖片首先經過Openpose處理后,提取出圖片中的人員骨架關節點,其輸出如下(Body_25模型),見圖5。

圖5 BODY_25輸出關節圖
Body_25檢測模型下與關節點的對應關系如表1所示,共有25個關節點,每個節點位置輸出(x,y,score),分別為關節點橫坐標、關節點縱坐標以及置信度。

表1 輸出編號對應關節
同時,輸入圖片經Yolo處理,檢測出圖片中感興趣物體的類別與位置,畫出方框。其輸出包含(Xtop_left,Ytop_left,w,h),obj_id等,分別為方框左上角橫-縱坐標,方框寬-高以及物體類別對應ID。
經過上述處理,融合兩部分輸出信息,使用IOU算法進行處理,最后進入手持物體行為分析算法的邏輯執行部分。實際手持場景中,不同尺寸大小的物體對手持位置與邏輯判定關系均有不同影響。按手持物體的尺寸大小分為小型物體和中、大型物體兩類。
小型物體的邊長小于手的長度(15 cm),特點是尺寸較小,形狀較規則,寬高比較小,手持時通常握在物體中心,如手機、小刀等,因此當手腕節點與感興趣物體中心(Xcenter,Ycenter)的距離小于手的長度即可認為該物體被手持。
如圖6所示,通過Openpose獲得右手腕(x4,y4),右手肘(x3,y3)的位置信息,取右手腕到右手肘距離的一半作為手的長度Lhand(由于手指的關節數量眾多,直接提取其關節位置信息會大大增加計算成本,增加算法復雜度),可得:

圖6 手持物體邏輯判斷圖
(3)
使用Yolo獲得感興趣物體的類別和位置并畫出方框,輸出方框左上角點坐標(Xtop_left,Ytop_left),方框寬w,方框高h,可得物體中心點坐標為:
(4)
(5)
由式(3~5)可得手持小型物體的邏輯判斷條件為:
(6)
當滿足式(6)時,可認為當前人員手持物體。
中、大型物體指邊長分別大于手的1倍(15 cm)和3倍(45 cm)以上,特點是尺寸較大,形狀不規則,寬高比變化多,手持中心位置浮動較大,如書本、晾衣桿等。此時小型物體的邏輯判斷法則不再完全適用。如出現圖7手持狀態時,手腕位置與物體中心距離遠大于Lhand,按照小物體邏輯判斷法則(6),此時圖7是未手持狀態,因此出現漏檢。因此,需要對小物體邏輯判斷法則進行擴充。令手腕到物體中心的距離小于物體檢測框最長邊長的一半,即:

圖7 手持中、大型物體情況1
(7)
根據式(7),雖然提高了圖7情況手持物體的識別準確率,但對圖8所示情況的誤檢(未手持卻檢出手持)會增多。為解決圖8所示誤檢情況,需要對物體與手之間的關聯性進行約束,因此參考圖像檢測中的交并比(IOU)算法進行補充。

圖8 手持中、大型物體情況2
交并比(intersection over union)是用于目標檢測任務中計算圖像重疊比例的算法,主要用于生成候選框的置信度排序。在本文的算法中,利用交并比來判斷手與感興趣物體的關聯性大小。
如圖9所示,A為Yolo檢測物體后生成的矩形框,B為以右手腕關節點(x4,y4)為中心,以手長的兩倍2Lhand為邊長繪制的矩形,藍色部分C為A與B的交叉部分。

圖9 交并比法則
設A左上與右下坐標為(X11,Y11),(X12,Y12),設B左上與右下坐標為(X21,Y21),(X22,Y22),則有:
X11=Xtop_left
(8)
Y11=Ytop_left
(9)
X12=Xtop_left+w
(10)
Y12=Ytop_left+h
(11)
X21=X4-Lhand
(12)
Y21=Y4-Lhand
(13)
X22=X4+Lhand
(14)
Y22=Y4+Lhand
(15)
可得:
xA=Max(X11,X21)
(16)
yA=Max(Y11,Y21)
(17)
xB=Max(X12,X22)
(18)
yB=Max(Y12,Y22)
(19)
式中:xA,yA,xB,yB分別為交叉部分左上角與右下角點,故有矩形A、矩形B、交叉部分Intersection的各部分面積分別為:
SA=(X12-X11)(Y12-Y11)
(20)
SB=(X22-X21)(Y22-Y21)
(21)
Sinter=Max(xB-xA,0)Max(yB-yA,0)
(22)
則交并比為:
(23)
由式(6)~(7)和式(23)得到算法的最終邏輯判斷法則為:
(24)
其中Limit為自定義的IOU閾值。
通過手持狀態判定結果結合物體類別識別結果即可輸出手持物體類別結果。
首先對Yolo進行訓練。按照小型、中型和大型3種不同的尺寸大小,包括小刀、手機、水杯、書本、掃帚、晾衣撐共6種類別,包含了危險品和日常家庭使用的各種物品,分辨率為1 280×720,采集了共計1 489張圖片制成數據集。具體組成如表2,圖片數據輸入網絡前統一縮放成512×512的尺寸大小,將訓練集與測試集按照4∶1的比列分配。

表2 數據采集類別及數量
為了提高網絡的魯棒性,對訓練數據使用了隨機旋轉,隨機縮放,改變色相、對比度、曝光度和馬賽克數據增強等方法。其中馬賽克數據增強是一種新的數據增強方法,將4張圖片數據按隨機比例拼成一張,這樣就能將4張圖片的內容混合,使得在目標檢測時能超出原有的內容范圍。圖10為馬賽克數據增強效果圖。通過這一方法與未使用該方法相比,最終物體檢出率提高了大約0.3%。

圖10 馬賽克數據增強
本文的實驗環境配置為:硬件:CPU為Inter Core i5-10600KF@4.10 GHz,GPU為NVIDIA GeForce RTX3070(8G),16 GB內存,軟件:Windows 10操作系統,安裝CUDA 11.1,CUDNN 8.0.5,使用Visual Studio 2019作為編輯器,OPENCV 4.2.0用于結果顯示。
為適應手持物體的特點,加快算法運行速度以及方便后期將算法移植到輕型計算設備,對網絡作出適應性調整。將Yolov4-tiny的基于Resnet的預訓練模型yolov4-tiny.conv.29替換成了基于EfficientNet-B0的enetb0-coco.conv.132,稱為Effinet-Yolo;同時在訓練時將輸入網絡尺寸設置為416×416,在檢測時放大至512×512,以提高小目標物體檢出率。分別使用原生的Yolov4,Yolov4-tiny,以及調整過的Effinet-Yolo進行訓練,預設迭代次數為12 000次,初始學習率分別設置為0.001 3,0.002 6,0.002 6,學習策略為step。當average loss降到0.05至3.0以內,或者經過多次迭代后average loss不再下降時,停止訓練。
在本文實驗中迭代至6 000次時損失函數即不再下降,停止訓練。分別用3種模型對驗證數據集進行測試,其結果如表3所示。

表3 模型訓練結果對比
由表3可知Yolov4擁有最高的準確率和召回率,但由于其網絡層數最深導致其網絡權重也最大,運行速度最慢;Yolov4-tiny由于削減了主干網絡,運行速度最快,但準確率最低,而準確率較低的主要原因是小型物體的檢出率不足。Effinet-Yolo在替換了backbone后,使得網絡權重相對于Yolov4-tiny減少了4.8 MB,從而降低了算法的復雜度;另外通過在訓練時減小網絡輸入尺寸、在檢測時增大網絡尺寸的方式,使得小型物體的檢出率有所提高,相較于Yolov4-tiny準確率提高了3.5%左右。因此,在滿足檢測性能的前提下,最終選用權重最小最易部署的Effinet-Yolo網絡模型作為本文算法的物體檢測器。
然后對Openpose的關節點輸出進行篩選,僅保留手腕和手肘的關節信息。使用C++ API進行Openpose和Yolo的坐標信息融合,并用IOU算法進行處理,最后進行識別結果驗證。將Yolo封裝成動態鏈接庫使用,并在VS上進行本文算法的代碼運行。分別使用表中所示模型搭配以及傳統的方法,均采集手持不同種類的物體,交替左右手,采用單手或雙手,改變身體位姿等視頻數據集進行驗證結果對比實驗。
不同模型搭配本文算法結果如表4。由第一組結果可知,Yolov4與body_25的組合,雖然準確率最高,但是運行速率只有6 fps,無法滿足實時性要求;由第二組與第三組結果對照可知,body_25模型運行速度更快,這是因為相較于coco模型雖然提取更多的關節點,但是其參數量少,并且由于使用了CUDA技術進行加速,因此其運行速度更快。另外,由于本文算法需要依賴于物體檢測器Yolo和關節提取器Openpose的準確率,且二者同時運行,而Openpose運行相對較慢,因此限制了算法的運行速率。另外,相較于表中第4組傳統方法即文獻[20]模型,本文算法的準確率有所提高,且本文所提算法不需要劃定感興趣區域,可直接對全局進行分析,表現出更好的泛用性。由表4綜合考量,Effinet-Yolo和body_25組合為最優搭配。

表4 檢測結果對比
算法運行效果如圖11,最終在圖片上輸出人體骨架及節點,物體檢測框以及左上角的手持狀態以及左右手的手持物體類別,由圖11(a)可知算法對前文所提手持小、中、大型物體均有較好識別效果,且能區分左右手,非手持狀態也能準確識別;圖11(b)在雙手持物、背面以及部分遮擋重疊時也能保持較高準確率,驗證了算法的魯棒性。

圖11 算法運行效果圖
本文算法潛在應用場景如下:在工地中,可識別工人是否佩戴安全手套;在家庭的安全監察中,可對兒童拿起刀具等危險品的行為進行識別警告;可用于手持危險品行為檢測,如在地鐵站或者火車站等閘口用監控視頻進行危險行為檢測以補充安全檢測遺漏;在戰場中可通過是否手持武器來區分敵我。
綜上,Effinet-Yolo和Body_25組合的模型組合結合算法的判定法則,可使正確識別手持狀態同時識別出手持物體類別的準確率達到91.2%,運行速度可達13 fps,并且總參數量最少,僅有118.1 MB。因此將其作為本文的實時手持物體行為分析算法的最終框架。相較于傳統手持物體識別的思路,以姿態估計和目標檢測為基礎進行手持物體識別具有更高的準確度和泛用性,手持定位更為準確,同時本文算法不需要嚴格的前期人員識別保證,不需要劃定感興趣區域即可進行全局分析。
本文針對當前人體分析算法很少以某一特定部位作為研究點的問題,提出了專用于手部的全局實時手持物體識別算法。通過使用Openpose和Yolo對圖片做預處理,然后使用C++ API進行二者的坐標信息融合。根據手持物體的尺寸大小分為小型,中型和大型兩類情況進行分類,參考交并比(IOU)算法進行處理并作為手持物體狀態的輔助判斷,最終分別設計出了判斷法則,實現了手持物體行為分析算法,并以提高運行速率和方便部署為目的做了適應性調整。在采集的手持物體視頻流數據集上,最終識別手持狀態的同時準確識別手持物體類別的準確率可達到91.2%,通過插幀等方式基本可達到實時運行的要求。相較于傳統思路方法,本文所提以姿態估計和目標檢測為基礎的算法定位更為精準,識別準確率更高,算法在民用以及軍用等多種場景均具有良好的潛在應用價值。
下一步的工作是使用多線程調度機制等方法,進一步提高算法的運行效率,同時將算法分析的范圍擴展到腳部、頭部等其他身體部位,形成一套完整的人-物交互分析系統,最終將其應用到無人機監查、智能監控等工程應用中。