馬天祥
(安徽理工大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,安徽 淮南 232001)
計(jì)算機(jī)軟硬件的更新迭代,推動(dòng)了無人駕駛技術(shù)的蓬勃發(fā)展。但隨著無人駕駛車輛的不斷增加以及現(xiàn)實(shí)道路復(fù)雜化的加深,僅僅依靠紅綠燈來指揮川流不息的車輛,在一些特殊時(shí)刻可能會(huì)導(dǎo)致交通事故的發(fā)生,因此交警的現(xiàn)場指揮不可或缺。若無人駕駛車輛在路口處僅遵循交通信號(hào)燈的指導(dǎo),而不能對交警的手勢進(jìn)行捕獲和解析,那么可能會(huì)帶來不必要的損失。在駕駛輔助領(lǐng)域,駕駛?cè)藛T也可能會(huì)因一些突發(fā)事件而無法及時(shí)觀察到交警的指揮手勢,或者無法有效判斷出交警手勢的含義,同樣會(huì)導(dǎo)致交通事故的發(fā)生。
現(xiàn)行的交警指揮手勢包括:直行、左轉(zhuǎn)彎、變道、減速慢行、右轉(zhuǎn)彎、左轉(zhuǎn)彎等待、停止、示意靠邊停車等八種手勢[1]。在交警手勢識(shí)別方面國內(nèi)外已有相關(guān)研究,如Yuan等[2]通過讓交警使用可穿戴設(shè)備,便于駕駛員捕獲并分析交警手勢,該方法雖然準(zhǔn)確率很高,但無法將識(shí)別到的數(shù)據(jù)分享到車輛上用以輔助駕駛。張備偉[3]等使用Kinect 捕獲人體關(guān)鍵點(diǎn),經(jīng)處理后將其交給DTW 算法進(jìn)行手勢識(shí)別,該方法雖然有著不錯(cuò)的效果,但Kinect 設(shè)備成本較高且設(shè)備體積較大,不便于部署。常津津等[4]提出的將c3d 和convLSTM集合的交警手勢識(shí)別方法,同樣具有可觀的識(shí)別效果,但由于c3d 的參數(shù)量巨大,難以保證識(shí)別的實(shí)時(shí)性。
鑒于上述所提方法的不足之處,本人提出一種基于YOLOv5s 和FastDTW 的交警手勢識(shí)別方法。通過該方法,可實(shí)現(xiàn)在眾多人物中定位到交警,并可實(shí)時(shí)地對其動(dòng)作進(jìn)行分析,避免了目標(biāo)人物識(shí)別錯(cuò)誤,而導(dǎo)致手勢識(shí)別不準(zhǔn)確情況的發(fā)生。
目標(biāo)檢測算法大致可分為兩個(gè)類別:一種是兩階段目標(biāo)檢測,代表算法有R-CNN、Faster R-CNN 等;另一種是單階段目標(biāo)檢測,代表算法有SSD 和YOLO 系列等[5]。相較于前者,后者的檢測精度略有下降,但它的速度更快、實(shí)時(shí)性更好。因此本文為保障檢測的實(shí)時(shí)性,選擇YOLOv5 系列作為目標(biāo)提取網(wǎng)絡(luò)。
YOLOv5 是一種單階段目標(biāo)檢測算法。通過該算法可以從輸入的圖片或視頻中框選出感興趣的目標(biāo)并推理出其分類的準(zhǔn)確度,同時(shí)該算法有著較高的檢測速率,是實(shí)現(xiàn)交警和行人目標(biāo)分離任務(wù)的首選。
YOLOv5 結(jié)構(gòu)如圖1所示,主要由四部分構(gòu)成:輸入端、Backbone、Neck、和Prediction。
圖1 YOLOv5 系列結(jié)構(gòu)圖
在輸入端,該算法使用Mosaic 進(jìn)行數(shù)據(jù)增強(qiáng),對輸入的四張圖片進(jìn)行裁剪、拼接、填充等操作,加強(qiáng)輸入圖片的多樣性。
Backbone 層包含以下結(jié)構(gòu):Focus、CSP 和SPP。Focus結(jié)構(gòu)是YOLOv5 新增的,該結(jié)構(gòu)會(huì)對輸入的圖片進(jìn)行切片操作,將所輸入原始圖片的分辨率降至原來的四分之一,將通道數(shù)增加到原來的四倍,如原始圖片的輸入?yún)?shù)是640×640×3,經(jīng)過Focus 結(jié)構(gòu)處理后會(huì)變成320×320×12的特征圖。CSP 結(jié)構(gòu)是一系列殘差塊的堆疊,同時(shí)存在一個(gè)大的殘差邊,經(jīng)些許處理后直接連在網(wǎng)絡(luò)末端。SPP 全稱為空間金字塔池化,該模塊對網(wǎng)絡(luò)最后輸出的特征層進(jìn)行最大池化處理(池化核的大小分別為5×5、9×9 和13×13),然后再對池化后的特征圖進(jìn)行融合以增大感受野。
Neck 結(jié)構(gòu)由FPN 和PAN 兩部分組成,該結(jié)構(gòu)會(huì)對特征層進(jìn)行上采樣,并結(jié)合上一級(jí)輸出到Neck 結(jié)構(gòu)的特征圖進(jìn)行特征融合,使得最后生成的特征圖能夠保存更多的細(xì)節(jié)。
在輸出端即Prediction 層,使用CIoU_Loss 作為損失函數(shù)幫助回歸BoundingBox,使用NMS 非極大值抑制,使得每種物體最后只由一個(gè)檢測框框定。
YOLOv5 所包含的四種模型分別是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x。這四種模型在網(wǎng)絡(luò)的配置文件上幾乎完全相同,最大的區(qū)別就是depth_multiple和width_multiple 兩個(gè)參數(shù)。改變這兩個(gè)值的大小會(huì)影響到主干網(wǎng)絡(luò)的復(fù)雜程度,進(jìn)而影響最終訓(xùn)練模型的準(zhǔn)確度和識(shí)別速率。由于本文的分類數(shù)目較少,對于網(wǎng)絡(luò)的復(fù)雜程度要求較低,故使用YOLOv5s 對交警和行人進(jìn)行分類和定位[6]。
Mediapipe 是由谷歌提出的集姿態(tài)估計(jì)、目標(biāo)檢測等為一體的多媒體框架,該框架底層由c++編寫,最突出的優(yōu)勢是在CPU 上運(yùn)行時(shí)依然有著不錯(cuò)的檢測速度,同時(shí)其檢測的精確度也十分可觀[7]。該框架可生成身體33 個(gè)關(guān)鍵點(diǎn)、手部21 個(gè)關(guān)鍵點(diǎn)以及面部的468 個(gè)關(guān)鍵點(diǎn)組成的面網(wǎng)。由于對交警手勢動(dòng)作的評估更加看重人體的姿態(tài),因此本文選取該框架產(chǎn)生的軀干和四肢部分33 個(gè)關(guān)鍵點(diǎn)供后期處理時(shí)使用。該框架檢測出的人體關(guān)鍵點(diǎn)效果如圖2所示。
圖2 Mediapipe 的檢測效果
DTW 算法又稱動(dòng)態(tài)時(shí)間規(guī)整算法,是一種彈性度量方法,相較于鎖步度量方法如常見的歐氏距離(Euclidean Distance,ED),其只能對等長的序列進(jìn)行距離的計(jì)算,而DTW 算法打破了這一限制,可對不等長的序列進(jìn)行距離的計(jì)算,且不需要進(jìn)行訓(xùn)練,序列匹配的精度也十分可觀,該算法通常應(yīng)用于金融預(yù)測、語音識(shí)別、動(dòng)態(tài)手勢識(shí)別等領(lǐng)域[8]。
DTW 算法的原理為:以兩個(gè)不等長的一維序列a{1,2,6,4,8}和b{1,3,4,7,8,9}為例,其長度分別為M和N。首先構(gòu)造一個(gè)累加距離矩陣,其維度為M×N,之后按照如下算法對其進(jìn)行填充。矩陣填充的詳細(xì)步驟為:對于自左向右的第一列,首先使用某一種兩點(diǎn)間距離計(jì)算公式得到兩點(diǎn)之間的距離,以歐氏距離為例,計(jì)算公式為d=ED(I,j)+ED(I,j-1)。同理對于從下到上的第一行,可用公式d=ED(I,j)+ED(i-1,j)求得各點(diǎn)的累加距離。對于其余點(diǎn)的距離,可用公式d=ED(I,j)+min(ED(i-1,j-1),ED(I,j-1),ED(i-1,j))求得,至此累加距離矩陣構(gòu)造完成。
為保障點(diǎn)的對應(yīng)關(guān)系按照序列順序進(jìn)行推進(jìn),DTW 算法有如下幾個(gè)約束條件:
(1)兩條序列的首尾必須匹配。
(2)在累加矩陣的其余點(diǎn)中找尋最優(yōu)路徑時(shí),不得進(jìn)行跨越連接,即只能在相鄰的上下左右或者對角線上相鄰的點(diǎn)上找尋下一個(gè)連接點(diǎn)。若從左下到右上進(jìn)行匹配時(shí),下一個(gè)點(diǎn)在((i+1,j),(I,j+1),(i+1,j+1))中尋找;若從右上到左下進(jìn)行匹配時(shí),下一個(gè)點(diǎn)在((i-1,j),(I,j-1),(i-1,j-1))中尋找。完成搜尋后即可得到一條最優(yōu)路徑,計(jì)算這條路徑上的值即可得到兩條序列間的距離。累加距離矩陣以及在該矩陣中尋找到的最優(yōu)路徑如圖3所示。
圖3 DTW 算法生成的累加矩陣和最優(yōu)路徑
FastDTW 算法是DTW 的改進(jìn)版,其在原始DTW 算法的基礎(chǔ)上進(jìn)行了改進(jìn),使用粗粒度化、投影和細(xì)粒度化的方式實(shí)現(xiàn)序列匹配的加速[9]。該算法相較原算法的改進(jìn)之處是將搜索區(qū)域限制和數(shù)據(jù)抽象相結(jié)合,具體步驟如下:
(1)粗粒度化。該過程會(huì)從原始序列中抽象出新的序列,經(jīng)過數(shù)次的迭代后,每個(gè)粗粒度的數(shù)據(jù)對應(yīng)著原始序列中多個(gè)數(shù)據(jù)的均值。
(2)投影。使用原始的DTW 求解策略,在粗粒度化后的序列中找尋到最優(yōu)路徑。
(3)細(xì)粒度化。對粗粒度化的序列進(jìn)行更加細(xì)粒度化的操作,再將得到的最優(yōu)路徑映射到新的更加細(xì)粒度化的序列上,之后對最優(yōu)路徑周圍的搜索區(qū)域進(jìn)行擴(kuò)充,擴(kuò)充范圍為縱橫斜向擴(kuò)充1~2 個(gè)單位。然后使用DTW 的求解策略更新最優(yōu)路徑,如此迭代往復(fù),直至得到原始序列下的最優(yōu)路徑。FastDTW 算法的迭代效果如圖4所示。
圖4 FastDTW 算法的迭代流程
2.1.1 圖片爬取
由于網(wǎng)絡(luò)上不存在公開的交警和行人數(shù)據(jù)集,故本人編寫爬蟲分別從百度圖片、搜狗圖片、360 圖片等三大主流圖片搜索網(wǎng)站爬取所需的圖片[10],從每個(gè)網(wǎng)站爬取800 張圖片。由于所爬取的圖片中包含不符合要求的圖片,經(jīng)過篩選后得到2 200 張合格圖片,將其中的2 000 張圖片用于訓(xùn)練,200張圖片用于測試。數(shù)據(jù)集爬取和制作流程如圖5所示,首先在瀏覽器端打開圖片搜索引擎進(jìn)行搜索操作,之后檢測ajax請求,通過requests 庫解析后端返回的json 格式數(shù)據(jù)即可得到要爬取的圖片地址,將其下載到本地。
圖5 網(wǎng)絡(luò)爬蟲爬取交警和行人圖片數(shù)據(jù)
在目標(biāo)框的標(biāo)注上,本文使用的是一款在線數(shù)據(jù)集標(biāo)注工具M(jìn)akesense,該工具可生成多種格式的數(shù)據(jù)集標(biāo)簽,本文使用txt 格式的YOLOv5s 支持的標(biāo)簽文件格式。
2.1.2 自定義錨框的生成
由于本文使用自定義數(shù)據(jù)集對YOLOv5s 進(jìn)行訓(xùn)練,因此在預(yù)定義錨框的選擇上,本文使用K-means 算法重新對自定義數(shù)據(jù)集邊界框進(jìn)行聚類,得到新的不同下采樣倍數(shù)特征層上的預(yù)定義錨框。新舊預(yù)定義錨框數(shù)據(jù)如表1所示。
表1 新舊預(yù)定義錨框數(shù)值對比
本文自行構(gòu)建交警手勢數(shù)據(jù)集,首先編寫腳本調(diào)用筆記本電腦攝像頭,同時(shí)使用Mediapipe 進(jìn)行人體關(guān)鍵點(diǎn)檢測。錄制時(shí)本人在現(xiàn)有的八種交警手勢中添加一個(gè)“無手勢”類別,用來匹配交警沒有做出指揮手勢時(shí)的姿態(tài)。為便于在目標(biāo)檢測算法中對交警區(qū)域進(jìn)行裁切,錄制時(shí)約定好做手勢人員在視頻畫面中的位置。具體流程為:首先規(guī)定做手勢的人員雙手向上舉起時(shí)保證豎直方向上的人體區(qū)域邊界接近視頻畫面的邊緣;其次令做手勢的人員雙手平舉得到臂展范圍(效果如圖6中的第二幅圖片所示);最后將Mediapipe 生成的相對原視頻畫面的坐標(biāo)值,轉(zhuǎn)化為新生成邊界框中的相對坐標(biāo)值。
圖6 關(guān)鍵點(diǎn)相對坐標(biāo)區(qū)域的變換
為防止采集到的關(guān)鍵點(diǎn)出現(xiàn)波動(dòng),降低因關(guān)鍵點(diǎn)匹配不準(zhǔn)確而出現(xiàn)的偏差。本文對九種手勢中的每一種動(dòng)作均采集十次,每個(gè)動(dòng)作的片段由30 幀的關(guān)鍵點(diǎn)坐標(biāo)構(gòu)成。
針對包含“無手勢”在內(nèi)的九種交警動(dòng)作類別,本節(jié)使用五種策略制作手勢特征模板。首先將經(jīng)過噪聲處理的關(guān)鍵點(diǎn)數(shù)據(jù),按照每種手勢包含10 個(gè)動(dòng)作片段的方式進(jìn)行組合,其中每個(gè)片段包含30 幀的關(guān)鍵點(diǎn)信息;其次將每種手勢中的10 個(gè)片段關(guān)鍵點(diǎn)坐標(biāo)平均值作為該手勢的最終關(guān)鍵點(diǎn)數(shù)據(jù);最后按照以下5 種策略對每種手勢對應(yīng)的關(guān)鍵點(diǎn)數(shù)據(jù)進(jìn)行組織得到手勢模板。
5 種策略為:
(1)將手臂12 個(gè)關(guān)鍵點(diǎn)的坐標(biāo)作為特征組織為模板。
(2)將全身33個(gè)關(guān)鍵點(diǎn)的坐標(biāo)作為特征組織為手勢模板。
(3)將手臂處的4 個(gè)關(guān)節(jié)角度變化數(shù)據(jù)組織為手勢模板。
(4)將手臂12 個(gè)關(guān)鍵點(diǎn)和4 個(gè)關(guān)節(jié)角度變化數(shù)據(jù)組織為手勢模板。
(5)將全身33 個(gè)關(guān)鍵點(diǎn)坐標(biāo)和4 個(gè)關(guān)節(jié)角度變化數(shù)據(jù)組織為模板。
圖7為策略五生成的手勢模板。由于策略一到策略四生成的手勢模板均可看作是從策略五所得序列中截取部分坐標(biāo)點(diǎn)繪制而成的,故不作展示。
圖7 由33 個(gè)關(guān)鍵點(diǎn)坐標(biāo)及4 個(gè)關(guān)節(jié)角度變化數(shù)據(jù)構(gòu)成的序列模板
本文所提方法的整體流程如圖8所示。
圖8 整體流程框架
本實(shí)驗(yàn)所用設(shè)備為筆記本電腦,其為Windows 10 操作系統(tǒng),所搭載的CPU 為英特爾酷睿I5-9300H,顯卡為移動(dòng)端GTX1660TI,使用的集成開發(fā)環(huán)境是Pycharm,開發(fā)語言為Python 3.6.3。在測試階段,使用公開的中國交警手勢數(shù)據(jù)集[11]并搭配自行錄制的交警手勢動(dòng)作,對本文所提方法的有效性進(jìn)行驗(yàn)證。
在訓(xùn)練YOLOv5s 網(wǎng)絡(luò)方面,本文使用2 000 張包含行人和交警的圖片作為訓(xùn)練集,將200 張圖片作為測試集,在YOLOv5s 的預(yù)訓(xùn)練權(quán)重基礎(chǔ)上接著訓(xùn)練300 個(gè)輪次,最終得到的訓(xùn)練結(jié)果如圖9所示,其中包含訓(xùn)練精度、邊界框損失、分類損失及置信度損失。
圖9 YOLOv5s 訓(xùn)練過程曲線
YOLOv5s 模型經(jīng)過邊界框變換得到的輸出結(jié)果如圖10所示,從左到右分別為原視頻幀、原輸出區(qū)域、經(jīng)過變換的輸出區(qū)域。輸出的交警區(qū)域畫面會(huì)暫存在圖片隊(duì)列中,供手勢識(shí)別模塊的調(diào)用。
圖10 經(jīng)坐標(biāo)變換得到的目標(biāo)區(qū)域
對圖片隊(duì)列中的交警區(qū)域畫面進(jìn)行關(guān)鍵點(diǎn)的檢測和手勢序列的匹配。本節(jié)使用制定手勢模板時(shí)規(guī)定的五種策略對交警手勢匹配效果進(jìn)行測試。每種策略中各手勢均進(jìn)行100 次的匹配測試,對一種策略進(jìn)行測試共需要900 次的對比,最終得到的測試結(jié)果如表2所示。
表2 五種手勢模板策略的測試結(jié)果
策略一到策略五對每種手勢的平均檢測時(shí)間分別為0.005 024 秒、0.042 922 秒、0.000 997 秒、0.008 972 秒和0.043 883 秒。通過觀察測試結(jié)果可以發(fā)現(xiàn),在識(shí)別直行和右轉(zhuǎn)手勢的時(shí)候,五種策略均存在較為明顯的誤差。經(jīng)分析,該結(jié)果是在關(guān)鍵點(diǎn)提取階段直行手勢和右轉(zhuǎn)手勢的關(guān)鍵點(diǎn)變化在運(yùn)動(dòng)過程中存在一定的相似性以及關(guān)鍵點(diǎn)發(fā)生輕微偏移所致。經(jīng)過對比使用策略四(手臂關(guān)鍵點(diǎn)坐標(biāo)及四個(gè)關(guān)節(jié)處角度變化的序列)可兼獲手勢識(shí)別的準(zhǔn)確性和實(shí)時(shí)性,但在關(guān)鍵點(diǎn)捕捉和相似手勢判斷上仍需加強(qiáng)。在整體測試中因受限于YOLOv5s 和Mediapipe 的檢測速度和磁盤IO 的速度,實(shí)際運(yùn)行時(shí)的幀率維持在15~20 幀。
針對當(dāng)前交警手勢識(shí)別過程中交警所處畫面區(qū)域以及距離較為固定,且在現(xiàn)實(shí)道路中無法精確定位交警位置的問題,本文提出一種基于YOLOv5s和FastDTW算法相結(jié)合的方法,使得在交警手勢識(shí)別過程中能夠在人群中定位到交警,對其指揮手勢進(jìn)行分析,避免了畫面中包含多個(gè)人物時(shí)出現(xiàn)的手勢誤識(shí)別問題。在手勢特征提取上本文使用谷歌的Mediapipe 作為人體關(guān)鍵點(diǎn)生成框架,其可以在CPU 上實(shí)現(xiàn)實(shí)時(shí)的效果。同時(shí)搭配運(yùn)行在GPU 端的目標(biāo)檢測算法實(shí)現(xiàn)對交警區(qū)域的截取,兩者相互協(xié)調(diào)充分利用計(jì)算機(jī)資源,使得本文方法在實(shí)際運(yùn)行過程中可以達(dá)到接近20 幀的識(shí)別效果。雖然本文方法在畫面中有多個(gè)人物時(shí)可實(shí)現(xiàn)對某一交警的定位與識(shí)別,但當(dāng)畫面中存在多個(gè)交警時(shí),精確捕捉并識(shí)別某一交警的手勢則有待進(jìn)一步的優(yōu)化,這也是我們今后的研究重心。