梁思成, 徐志明, 宋 毅
(1 哈爾濱工業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院, 哈爾濱 150001; 2 哈爾濱華德學(xué)院 電子與信息工程學(xué)院, 哈爾濱 150025)
中國作為基礎(chǔ)設(shè)施建設(shè)大國,數(shù)以百萬計的工人在工地工作,工地安全問題也存在是整個社會極為關(guān)注的一個問題,這關(guān)系著無數(shù)的家庭和生命。2018年,全國共發(fā)生房屋市政工程事故734起,死亡840人。其中高處墜落事故383起,占據(jù)整個事故數(shù)量的一半以上,每一起安全事故的發(fā)生都是對社會的警醒。安全帽作為施工場地的安全保證,準確高效的檢測是幫助施工單位降低事故率的保障。
對于傳統(tǒng)的檢測方法,依靠監(jiān)督管理人員的主觀判斷,浪費人力資源、效率低下,且時效性差,無法實時監(jiān)控。隨著機器學(xué)習(xí)的熱潮不斷上漲,目標檢測技術(shù)日新月異,在行人檢測和車輛識別方面得到廣泛的應(yīng)用[1,2],另外,研究人員也開始了對安全帽佩戴檢測的研究。一些研究人員利用傳統(tǒng)的機器學(xué)習(xí)算法,進行了安全帽檢測的研究工作。馮國臣等利用機器視覺的相關(guān)方法,先判斷目標圖像是否屬于人體[3],再定位到人體頭部進行安全帽檢測;胡恬利用小波變換和BP神經(jīng)網(wǎng)絡(luò)進行人臉檢測,有效地提高了安全帽檢測算法的穩(wěn)定性和正確率[4];劉曉慧等利用膚色檢測的方法定位人臉區(qū)域[5], 再使用神經(jīng)網(wǎng)絡(luò)和支持向量機(SVM)的算法進行安全帽檢測。但是,傳統(tǒng)的機器學(xué)習(xí)方法普遍存在著準確率偏低、對環(huán)境需求偏高的問題,難以保證檢測的速度。
近年來,關(guān)于目標檢測方向的深度學(xué)習(xí)得到更多注視,更多學(xué)者在此方面投入大量的研究時間,目標檢測算法的準確率也在不斷提高?;谏疃葘W(xué)習(xí)的目標檢測算法有一步走(one-stage)和兩步走(two-stage)的兩種策略。在兩步走算法方面,2014年Ross Girshick提出了R-CNN(Region with CNN)網(wǎng)絡(luò)[6],該算法拋棄了人工選取特征與滑動窗口,利用選擇性搜索算法,首先生成候選區(qū)域,然后進行目標預(yù)測;2015年何凱明提出了SPP-Net算法[7],利用空間金字塔池化結(jié)構(gòu),對整張圖片一次提取,運算速度更快;Ross Girshick于2015年提出R-CNN的改進版Fast R-CNN[8],將算法的串行結(jié)構(gòu)改為并行結(jié)構(gòu),顯著地提高檢測速度;Shaoqin Ren 等人基于Fast R-CNN算法做出改進,提出Faster R-CNN算法[9],該算法采用RPN網(wǎng)絡(luò)自行學(xué)習(xí)生成候選區(qū)域,再次減少了參數(shù)量和檢測所需時間;2017年何凱明等人提出了Mask R-CNN算法[10],加入了圖像的語義信息,同時進行目標檢測和語義分割的任務(wù)。
在一步走算法方面,2013年Yann Lecun等人提出OverFeat算法[11],利用多尺度滑動窗口來改善檢測效果;2015年 Joseph Redmon提出了Yolo算法[12],以回歸的方式輸出目標邊框與類別,相比于one-stage方法,顯著提升了檢測速度;2016年W Liu等人提出了SSD (Single Shot MultiBox Detector) 檢測算法[13],改善Yolo小目標檢測效果的問題,添加了Anchor的概念,并將不同分辨率的卷積層進行融合,使小物體的信息加入到高分辨率的特征圖,提升同一圖片中的小物體識別準確率;Joseph Redmon在2016年和2018年分別提出了改進的Yolo算法:YoloV2和YoloV3[14-15]。這兩次的算法改進,使得檢測算法的mAP值達到了RetinaNet的水平,同時獲得了更好的檢測速度。
本文采用目標檢測算法中的YoloV3算法,進行安全帽檢測的研究工作。首先,利用閘機處情境照片作為原始數(shù)據(jù)集,采用LabelImg對原始照片進行安全帽區(qū)域的人工標注,確定邊界框(bounding box)的個數(shù)以及位置,建立了人工標注的安全帽檢測的訓(xùn)練數(shù)據(jù)集和測試集;然后,利用上述的訓(xùn)練數(shù)據(jù)集,訓(xùn)練安全帽檢測算法,并開展了安全帽檢測的實驗。實驗結(jié)果顯示:本文的安全帽檢測算法的mAP值達到98%,檢測速率為20fps,該算法在取得了較高準確率的同時,也滿足了實時性的要求。
本文的YoloV3算法采用端到端的訓(xùn)練方式,將特征提取、候選框預(yù)測、非極大抑制和目標識別等步驟連接在一起,目的是提升該算法的性能。首先,Darknet網(wǎng)絡(luò)結(jié)構(gòu)對目標進行特征提取,得到3個不同維度的特征圖;其次,將輸入圖片劃分成S×S個網(wǎng)格,當(dāng)一個網(wǎng)格中出現(xiàn)該物體的中心點,那么該網(wǎng)格就負責(zé)對該物體進行檢測,每個網(wǎng)格都會預(yù)測B個邊界框,每個邊界框會輸出5個對應(yīng)的參數(shù),即邊界框的中心坐標(x,y),寬高(w,h)以及置信度評分。置信度評分綜合反映了當(dāng)前邊界框內(nèi)存在目標的可能性和邊界框預(yù)測目標位置的準確性,即:交并比(IOU)。最后的特征圖包含兩個維度:(1)26×26的網(wǎng)格數(shù)。(2)B×(5+Y)的維度。其中B是每個網(wǎng)格邊界框的數(shù)量,Y是預(yù)測物體的類別數(shù)量,5則是邊界框的中心坐標(x,y),寬和高(w,h)以及該框的置信度評分。根據(jù)置信度評分,確定該框分類,并由中心坐標,寬和高確定邊界框繪制時所在圖片位置。
YoloV3算法改進了YoloV2算法的Darknet網(wǎng)絡(luò),去掉了YoloV2算法所使用的池化層和全連接層,僅保留了一些卷積層(convolution layers)、激活層(leaky relu)、批標準化層(Batch Normalization)。卷積層通過卷積核對目標進行局部感知,提取標志性特征;批標準化層對卷積層輸出批量歸一化;激活層將批歸一化層的輸出進行非線性映射。通過改變卷積核的張量不斷改變張量尺寸,最終得到三層維度不同特征圖。
整個主干網(wǎng)絡(luò)中包含兩個組件:
(1)由全連接層、批標準化層、激活層構(gòu)成的Darknet網(wǎng)絡(luò)的最小組件DBL;
(2)借鑒ResNet的殘差結(jié)構(gòu),以DBL為基礎(chǔ)組件得到的殘差結(jié)構(gòu)。網(wǎng)絡(luò)中前74層中存在53個卷積層,其余為Res層。整體構(gòu)成Darknet-53結(jié)構(gòu),網(wǎng)絡(luò)中使用一系列1×1和3×3大小卷積核的卷積層。從75層到105層是YoloV3的特征融合層,輸出得到3個尺度分別為13×13,26×26,52×52大小,每個尺度先得到各自尺度下的特征,在通過卷積核上采樣實現(xiàn)不同尺度特征圖的融合。yolo結(jié)構(gòu)如圖1所示。
對于邊界框的選取,YoloV3算法采用K-means聚類方法,特征圖中的每一個網(wǎng)格都會預(yù)測3個邊界框。每個邊界框都存在3類預(yù)測:
(1)預(yù)測框的位置即坐標中心,以及預(yù)測框的高度和寬度;
(2)置信度;
(3)預(yù)先設(shè)定好的類別。
本文的目標檢測算法的類別設(shè)置為兩類。在實驗中,最后得到的三層輸出的輸出維度分別為13×13×21、26×26×21和52×52×21。每個網(wǎng)格單元都會預(yù)測3個邊界框,每個邊界框預(yù)測(x,y,w,h, confidence)。這5個參數(shù)分別代表邊界框坐標(x,y)、邊界框高度h、寬度w和置信度。三層輸出分別經(jīng)由32倍下采樣、16倍下采樣和8倍下采樣時檢測。針對輸出下采樣倍數(shù)的不同,檢測到的感受野也不一樣,32倍下采樣檢測的感受野最大,適合檢測大的目標,16倍下采樣輸出次之,8倍下采樣最小。16倍下采樣得到的特征圖可以看成是淺層特征,在16倍下采樣所得到的數(shù)據(jù)基礎(chǔ)上,進行一次下采樣再上采樣得到深層特征。通過這種方式將16倍下采樣和8倍下采樣的特征相拼接,16下采樣和32倍下采樣的特征拼接之后,再進行卷積操作,得到3個不同維度的邊界框信息,可以同時學(xué)習(xí)淺層特征和深層特征,使得模型的表達效果更好。
YoloV3算法對每個邊界框邏輯回歸分析后,得到分類得分,依據(jù)分類得分決定所屬類別。在每一類得分中,邊界框與真實框越為吻合,得分為1,表示保留該邊界框,倘若與真實邊框相差太遠,低于所設(shè)定閾值,則得分置為0,表示忽略該邊界框。
圖1 yolo結(jié)構(gòu)圖
YoloV3算法的損失函數(shù)為公式(1),由4部分組成:中心坐標誤差、寬高坐標誤差以及置信度誤差。
(1)
中心坐標誤差如公式(2)所示:
(2)
因為整個網(wǎng)絡(luò)輸出的一部分是中心點坐標x,y,使用該部分輸出通過sigmoid激活函數(shù)并乘以步長,就可以映射到原始大小416×416的圖片目標,因此中心坐標誤差的實際含義就是當(dāng)?shù)趇個網(wǎng)絡(luò)的第j個錨框(anchor box) 負責(zé)當(dāng)前目標,這個錨框產(chǎn)生的邊界框就和真實目標進行比較,計算得到中心坐標誤差。
寬高坐標誤差如公式(3)所示:
(3)
因為網(wǎng)絡(luò)輸出的一部分是邊界框的寬和高(w,h)。利用(w,h),計算寬高的誤差。同中心坐標誤差一樣,經(jīng)過sigmoid激活函數(shù)再乘以步長,映射到416×416大小目標的圖片上來計算誤差。中心坐標誤差的本質(zhì)就是第i個網(wǎng)格的第j個錨框負責(zé)的一個真實目標,錨框產(chǎn)生的邊界框和真實目標去比較,計算得到的誤差。
置信度誤差如公式(4)所示:
(4)
第一部分是存在待檢測物體的邊界框的置信度誤差,只有負責(zé)待檢測對象的邊界框,才會計算誤差;第二部分是不存在待檢測物體的邊界框的置信度誤差。因為不存在對象,則盡量減低這部分的置信度。如果產(chǎn)生較高置信度,會與真正預(yù)測的那個邊界框產(chǎn)生混淆。因此,正確對象概率設(shè)置為1,而其他對象概率設(shè)置為0。
分類誤差如公式(5)所示:
(5)
其中,分類誤差也選擇了交叉熵作為損失函數(shù)。當(dāng)?shù)趇個網(wǎng)格的第j個錨框負責(zé)某一個目標待檢測對象時,這個錨框產(chǎn)生的邊界框才會計算分類損失函數(shù)。
在損失函數(shù)中,通過訓(xùn)練網(wǎng)絡(luò),最終可以獲得一張圖片目標邊界框的中心坐標(x,y)和邊界框的寬和高(w,h)、置信度(一般取1或0)和分類概率。當(dāng)?shù)趇個網(wǎng)格負責(zé)一個真實目標,那么對這個錨框產(chǎn)生的邊界框,則求取中心坐標誤差、寬高誤差、置信度誤差、分類誤差。如果不對這個目標負責(zé),只需要求取一個置信度誤差即可。
本文的實驗數(shù)據(jù)集來自于建筑工地閘機處攝像頭所拍攝的真實圖片,包含正臉、側(cè)臉和背影等不同的角度,拍攝時間包含不同的時間段,以及不同的光照條件。圖片以是否佩戴安全帽作為類別區(qū)分。其中,包含大量的單樣本圖片和少量的多樣本圖片。
利用LabelImg對這些原始圖片進行安全帽區(qū)域的人工標注。在標注過程中,對于多樣本圖片,以佩戴安全帽的人物的正臉和側(cè)臉為準,決定是否標注,對僅能看見后腦部分、沒有明顯人臉特征的不予標注;對于佩戴安全帽的人物,以是否有明顯人臉特征為準,決定是否標注,當(dāng)安全帽完全覆蓋人臉時,不予標注。因拍攝問題出現(xiàn)人臉殘缺時,以露出的人臉部分為準,決定是否標注,露出左半邊人臉或者右半邊人臉都予以標注,僅露出眼部以下,而沒有明確的安全帽特征或者人物額頭部分的圖片不予標注,露出人臉且明顯包含安全帽特征時,給予標注。根據(jù)上述的標注標準,得到標注的xml文件。每一張圖片對應(yīng)一份xml文件,xml文件中記錄了對應(yīng)圖片的標注框的個數(shù)、邊界值以及類別。最終標記了17 309張圖片,每張圖片根據(jù)具體場景不同,具體包含人臉個數(shù)不同。對這些標注的數(shù)據(jù)集隨機抽取,訓(xùn)練集和測試集的劃分比例為9:1,即訓(xùn)練集樣本15 353張,測試集樣本為1 956張。
通過修改darknet在訓(xùn)練coco訓(xùn)練集的預(yù)訓(xùn)練權(quán)重,輸出的訓(xùn)練類別數(shù)目,以及對應(yīng)的類別名稱,將安全帽的類別個數(shù)設(shè)定為2。將原weights模型轉(zhuǎn)換成h5模型以供訓(xùn)練,訓(xùn)練迭代次數(shù)為100次。訓(xùn)練過程中保存好權(quán)重文件,根據(jù)loss值來優(yōu)化調(diào)參并確定最優(yōu)權(quán)重,最終在測試時使用loss值最小的迭代次數(shù)產(chǎn)生的文件作為最終測試權(quán)重文件。
YoloV3算法的評價方法,以mAP值作為精確率,表示測試集中識別正確的樣本在所有測試樣本中所占的比例,計算方式如公式(6);以召回率表示每一類識別正確的樣本在所在類別中的占比,計算方式如公式(7),TP(true positive),F(xiàn)P(false positive),F(xiàn)N(false negative)由IOU閾值來確定。IOU是邊界框與檢測框的交并比。
Precision=TP/ (TP+FP),
(6)
Recall=TP/ (TP+FN).
(7)
實驗中,對測試集中每一張圖片的每一個人物頭像進行精確率和召回率的計算,所有值按照置信度降序排列,其線下面積就是一類的AP值,如公式(8),實際計算中采用平滑處理,對PR曲線上每個點的精確值取右側(cè)最大值,如公式(9)。YoloV3的AP計算示意圖如圖2所示。當(dāng)計算出所有類別的AP值,加和求平均,最后得到的就是mAP。
(8)
(9)
圖2 YoloV3的AP計算示意圖
實驗結(jié)果如圖3所示,每一張圖片都將所有的識別出的邊界框繪制出來,并以不同顏色加以區(qū)分,表示為不同分類。邊界框上寫出分類類別和所屬類別得分,方便使用者進行觀察。測試視頻來自于施工場地入口一個正面攝像頭的記錄數(shù)據(jù),由于視頻角度和光照的緣故,入口處的人臉因為有遮擋導(dǎo)致測試效果不佳,其他位置安全帽佩戴測試效果可以滿足整個任務(wù)需求。測試視頻效果如圖4所示,輸出成視頻格式展現(xiàn)效果同圖片測試效果。
圖3 YoloV3圖片檢測效果圖
圖4 YoloV3視頻檢測效果圖
測試集的樣本數(shù)量見表1,共二類圖片1 956個文件。其中,戴安全帽的樣本為1 101個;不戴安全帽的樣本為1 352個。在檢測結(jié)果中,戴安全帽識別正確個數(shù)為1 078;不戴安全帽識別正確數(shù)量為1 338個,識別錯誤個數(shù)分別為62個和72個。在識別佩戴安全帽與不佩戴安全帽二類任務(wù)的準確率均達到98%以上,測試的平均均值精度(mAP)達到了98.22%。在測試速度方面,單GPU為GTX1080Ti的情況下,測試單張圖片約為50 ms,滿足了實時性要求。
表1 安全帽檢測結(jié)果
本文采用YoloV3算法進行施工場地的安全帽檢測。首先對施工現(xiàn)場閘機處拍攝的17 300余張圖片數(shù)據(jù)進行了人工的數(shù)據(jù)標注,按著9:1的劃分比例,分別建立了訓(xùn)練集和測試集,開展了安全帽檢測的實驗。實驗結(jié)果表明,該算法在安全帽檢測的準確率和實時性方面均達到了實際應(yīng)用的需求。