梁思成, 徐志明, 宋 毅
(1 哈爾濱工業大學 計算機科學與技術學院, 哈爾濱 150001; 2 哈爾濱華德學院 電子與信息工程學院, 哈爾濱 150025)
中國作為基礎設施建設大國,數以百萬計的工人在工地工作,工地安全問題也存在是整個社會極為關注的一個問題,這關系著無數的家庭和生命。2018年,全國共發生房屋市政工程事故734起,死亡840人。其中高處墜落事故383起,占據整個事故數量的一半以上,每一起安全事故的發生都是對社會的警醒。安全帽作為施工場地的安全保證,準確高效的檢測是幫助施工單位降低事故率的保障。
對于傳統的檢測方法,依靠監督管理人員的主觀判斷,浪費人力資源、效率低下,且時效性差,無法實時監控。隨著機器學習的熱潮不斷上漲,目標檢測技術日新月異,在行人檢測和車輛識別方面得到廣泛的應用[1,2],另外,研究人員也開始了對安全帽佩戴檢測的研究。一些研究人員利用傳統的機器學習算法,進行了安全帽檢測的研究工作。馮國臣等利用機器視覺的相關方法,先判斷目標圖像是否屬于人體[3],再定位到人體頭部進行安全帽檢測;胡恬利用小波變換和BP神經網絡進行人臉檢測,有效地提高了安全帽檢測算法的穩定性和正確率[4];劉曉慧等利用膚色檢測的方法定位人臉區域[5], 再使用神經網絡和支持向量機(SVM)的算法進行安全帽檢測。但是,傳統的機器學習方法普遍存在著準確率偏低、對環境需求偏高的問題,難以保證檢測的速度。
近年來,關于目標檢測方向的深度學習得到更多注視,更多學者在此方面投入大量的研究時間,目標檢測算法的準確率也在不斷提高。基于深度學習的目標檢測算法有一步走(one-stage)和兩步走(two-stage)的兩種策略。在兩步走算法方面,2014年Ross Girshick提出了R-CNN(Region with CNN)網絡[6],該算法拋棄了人工選取特征與滑動窗口,利用選擇性搜索算法,首先生成候選區域,然后進行目標預測;2015年何凱明提出了SPP-Net算法[7],利用空間金字塔池化結構,對整張圖片一次提取,運算速度更快;Ross Girshick于2015年提出R-CNN的改進版Fast R-CNN[8],將算法的串行結構改為并行結構,顯著地提高檢測速度;Shaoqin Ren 等人基于Fast R-CNN算法做出改進,提出Faster R-CNN算法[9],該算法采用RPN網絡自行學習生成候選區域,再次減少了參數量和檢測所需時間;2017年何凱明等人提出了Mask R-CNN算法[10],加入了圖像的語義信息,同時進行目標檢測和語義分割的任務。
在一步走算法方面,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算法,進行安全帽檢測的研究工作。首先,利用閘機處情境照片作為原始數據集,采用LabelImg對原始照片進行安全帽區域的人工標注,確定邊界框(bounding box)的個數以及位置,建立了人工標注的安全帽檢測的訓練數據集和測試集;然后,利用上述的訓練數據集,訓練安全帽檢測算法,并開展了安全帽檢測的實驗。實驗結果顯示:本文的安全帽檢測算法的mAP值達到98%,檢測速率為20fps,該算法在取得了較高準確率的同時,也滿足了實時性的要求。
本文的YoloV3算法采用端到端的訓練方式,將特征提取、候選框預測、非極大抑制和目標識別等步驟連接在一起,目的是提升該算法的性能。首先,Darknet網絡結構對目標進行特征提取,得到3個不同維度的特征圖;其次,將輸入圖片劃分成S×S個網格,當一個網格中出現該物體的中心點,那么該網格就負責對該物體進行檢測,每個網格都會預測B個邊界框,每個邊界框會輸出5個對應的參數,即邊界框的中心坐標(x,y),寬高(w,h)以及置信度評分。置信度評分綜合反映了當前邊界框內存在目標的可能性和邊界框預測目標位置的準確性,即:交并比(IOU)。最后的特征圖包含兩個維度:(1)26×26的網格數。(2)B×(5+Y)的維度。其中B是每個網格邊界框的數量,Y是預測物體的類別數量,5則是邊界框的中心坐標(x,y),寬和高(w,h)以及該框的置信度評分。根據置信度評分,確定該框分類,并由中心坐標,寬和高確定邊界框繪制時所在圖片位置。
YoloV3算法改進了YoloV2算法的Darknet網絡,去掉了YoloV2算法所使用的池化層和全連接層,僅保留了一些卷積層(convolution layers)、激活層(leaky relu)、批標準化層(Batch Normalization)。卷積層通過卷積核對目標進行局部感知,提取標志性特征;批標準化層對卷積層輸出批量歸一化;激活層將批歸一化層的輸出進行非線性映射。通過改變卷積核的張量不斷改變張量尺寸,最終得到三層維度不同特征圖。
整個主干網絡中包含兩個組件:
(1)由全連接層、批標準化層、激活層構成的Darknet網絡的最小組件DBL;
(2)借鑒ResNet的殘差結構,以DBL為基礎組件得到的殘差結構。網絡中前74層中存在53個卷積層,其余為Res層。整體構成Darknet-53結構,網絡中使用一系列1×1和3×3大小卷積核的卷積層。從75層到105層是YoloV3的特征融合層,輸出得到3個尺度分別為13×13,26×26,52×52大小,每個尺度先得到各自尺度下的特征,在通過卷積核上采樣實現不同尺度特征圖的融合。yolo結構如圖1所示。
對于邊界框的選取,YoloV3算法采用K-means聚類方法,特征圖中的每一個網格都會預測3個邊界框。每個邊界框都存在3類預測:
(1)預測框的位置即坐標中心,以及預測框的高度和寬度;
(2)置信度;
(3)預先設定好的類別。
本文的目標檢測算法的類別設置為兩類。在實驗中,最后得到的三層輸出的輸出維度分別為13×13×21、26×26×21和52×52×21。每個網格單元都會預測3個邊界框,每個邊界框預測(x,y,w,h, confidence)。這5個參數分別代表邊界框坐標(x,y)、邊界框高度h、寬度w和置信度。三層輸出分別經由32倍下采樣、16倍下采樣和8倍下采樣時檢測。針對輸出下采樣倍數的不同,檢測到的感受野也不一樣,32倍下采樣檢測的感受野最大,適合檢測大的目標,16倍下采樣輸出次之,8倍下采樣最小。16倍下采樣得到的特征圖可以看成是淺層特征,在16倍下采樣所得到的數據基礎上,進行一次下采樣再上采樣得到深層特征。通過這種方式將16倍下采樣和8倍下采樣的特征相拼接,16下采樣和32倍下采樣的特征拼接之后,再進行卷積操作,得到3個不同維度的邊界框信息,可以同時學習淺層特征和深層特征,使得模型的表達效果更好。
YoloV3算法對每個邊界框邏輯回歸分析后,得到分類得分,依據分類得分決定所屬類別。在每一類得分中,邊界框與真實框越為吻合,得分為1,表示保留該邊界框,倘若與真實邊框相差太遠,低于所設定閾值,則得分置為0,表示忽略該邊界框。

圖1 yolo結構圖
YoloV3算法的損失函數為公式(1),由4部分組成:中心坐標誤差、寬高坐標誤差以及置信度誤差。
(1)

中心坐標誤差如公式(2)所示:
(2)
因為整個網絡輸出的一部分是中心點坐標x,y,使用該部分輸出通過sigmoid激活函數并乘以步長,就可以映射到原始大小416×416的圖片目標,因此中心坐標誤差的實際含義就是當第i個網絡的第j個錨框(anchor box) 負責當前目標,這個錨框產生的邊界框就和真實目標進行比較,計算得到中心坐標誤差。
寬高坐標誤差如公式(3)所示:
(3)
因為網絡輸出的一部分是邊界框的寬和高(w,h)。利用(w,h),計算寬高的誤差。同中心坐標誤差一樣,經過sigmoid激活函數再乘以步長,映射到416×416大小目標的圖片上來計算誤差。中心坐標誤差的本質就是第i個網格的第j個錨框負責的一個真實目標,錨框產生的邊界框和真實目標去比較,計算得到的誤差。
置信度誤差如公式(4)所示:

(4)
第一部分是存在待檢測物體的邊界框的置信度誤差,只有負責待檢測對象的邊界框,才會計算誤差;第二部分是不存在待檢測物體的邊界框的置信度誤差。因為不存在對象,則盡量減低這部分的置信度。如果產生較高置信度,會與真正預測的那個邊界框產生混淆。因此,正確對象概率設置為1,而其他對象概率設置為0。
分類誤差如公式(5)所示:
(5)
其中,分類誤差也選擇了交叉熵作為損失函數。當第i個網格的第j個錨框負責某一個目標待檢測對象時,這個錨框產生的邊界框才會計算分類損失函數。
在損失函數中,通過訓練網絡,最終可以獲得一張圖片目標邊界框的中心坐標(x,y)和邊界框的寬和高(w,h)、置信度(一般取1或0)和分類概率。當第i個網格負責一個真實目標,那么對這個錨框產生的邊界框,則求取中心坐標誤差、寬高誤差、置信度誤差、分類誤差。如果不對這個目標負責,只需要求取一個置信度誤差即可。
本文的實驗數據集來自于建筑工地閘機處攝像頭所拍攝的真實圖片,包含正臉、側臉和背影等不同的角度,拍攝時間包含不同的時間段,以及不同的光照條件。圖片以是否佩戴安全帽作為類別區分。其中,包含大量的單樣本圖片和少量的多樣本圖片。
利用LabelImg對這些原始圖片進行安全帽區域的人工標注。在標注過程中,對于多樣本圖片,以佩戴安全帽的人物的正臉和側臉為準,決定是否標注,對僅能看見后腦部分、沒有明顯人臉特征的不予標注;對于佩戴安全帽的人物,以是否有明顯人臉特征為準,決定是否標注,當安全帽完全覆蓋人臉時,不予標注。因拍攝問題出現人臉殘缺時,以露出的人臉部分為準,決定是否標注,露出左半邊人臉或者右半邊人臉都予以標注,僅露出眼部以下,而沒有明確的安全帽特征或者人物額頭部分的圖片不予標注,露出人臉且明顯包含安全帽特征時,給予標注。根據上述的標注標準,得到標注的xml文件。每一張圖片對應一份xml文件,xml文件中記錄了對應圖片的標注框的個數、邊界值以及類別。最終標記了17 309張圖片,每張圖片根據具體場景不同,具體包含人臉個數不同。對這些標注的數據集隨機抽取,訓練集和測試集的劃分比例為9:1,即訓練集樣本15 353張,測試集樣本為1 956張。
通過修改darknet在訓練coco訓練集的預訓練權重,輸出的訓練類別數目,以及對應的類別名稱,將安全帽的類別個數設定為2。將原weights模型轉換成h5模型以供訓練,訓練迭代次數為100次。訓練過程中保存好權重文件,根據loss值來優化調參并確定最優權重,最終在測試時使用loss值最小的迭代次數產生的文件作為最終測試權重文件。
YoloV3算法的評價方法,以mAP值作為精確率,表示測試集中識別正確的樣本在所有測試樣本中所占的比例,計算方式如公式(6);以召回率表示每一類識別正確的樣本在所在類別中的占比,計算方式如公式(7),TP(true positive),FP(false positive),FN(false negative)由IOU閾值來確定。IOU是邊界框與檢測框的交并比。
Precision=TP/ (TP+FP),
(6)
Recall=TP/ (TP+FN).
(7)
實驗中,對測試集中每一張圖片的每一個人物頭像進行精確率和召回率的計算,所有值按照置信度降序排列,其線下面積就是一類的AP值,如公式(8),實際計算中采用平滑處理,對PR曲線上每個點的精確值取右側最大值,如公式(9)。YoloV3的AP計算示意圖如圖2所示。當計算出所有類別的AP值,加和求平均,最后得到的就是mAP。

(8)
(9)

圖2 YoloV3的AP計算示意圖
實驗結果如圖3所示,每一張圖片都將所有的識別出的邊界框繪制出來,并以不同顏色加以區分,表示為不同分類。邊界框上寫出分類類別和所屬類別得分,方便使用者進行觀察。測試視頻來自于施工場地入口一個正面攝像頭的記錄數據,由于視頻角度和光照的緣故,入口處的人臉因為有遮擋導致測試效果不佳,其他位置安全帽佩戴測試效果可以滿足整個任務需求。測試視頻效果如圖4所示,輸出成視頻格式展現效果同圖片測試效果。

圖3 YoloV3圖片檢測效果圖

圖4 YoloV3視頻檢測效果圖
測試集的樣本數量見表1,共二類圖片1 956個文件。其中,戴安全帽的樣本為1 101個;不戴安全帽的樣本為1 352個。在檢測結果中,戴安全帽識別正確個數為1 078;不戴安全帽識別正確數量為1 338個,識別錯誤個數分別為62個和72個。在識別佩戴安全帽與不佩戴安全帽二類任務的準確率均達到98%以上,測試的平均均值精度(mAP)達到了98.22%。在測試速度方面,單GPU為GTX1080Ti的情況下,測試單張圖片約為50 ms,滿足了實時性要求。

表1 安全帽檢測結果
本文采用YoloV3算法進行施工場地的安全帽檢測。首先對施工現場閘機處拍攝的17 300余張圖片數據進行了人工的數據標注,按著9:1的劃分比例,分別建立了訓練集和測試集,開展了安全帽檢測的實驗。實驗結果表明,該算法在安全帽檢測的準確率和實時性方面均達到了實際應用的需求。