郭 爍,柴曉輝,洪 悅
(沈陽化工大學(xué) 信息工程學(xué)院,遼寧 沈陽 110142)
目前大多數(shù)公共安全事件的威脅來自持刀及持槍人員。在造成人員傷亡前檢測到危險,并提前預(yù)警具有重大意義。目標(biāo)檢測技術(shù)的發(fā)展使監(jiān)控視頻和靜止幀中自動識別威脅成為可能,在學(xué)校、車站和醫(yī)院等公共場合中發(fā)揮著預(yù)防犯罪的重要作用[1]。近年來,隨著深度學(xué)習(xí)技術(shù)的發(fā)展,圖像分類、目標(biāo)檢測以及圖像分割等技術(shù)也得到了快速的發(fā)展[2-4]。圖像分類任務(wù)就是給定一個圖像,然后正確給出該圖像所屬的類別,圖像分類更適用于圖像中待分類的是單一物體的情況。目標(biāo)檢測任務(wù)就是定位某一類語義對象(如人、建筑物或汽車)的實例,不僅適用于單目標(biāo),也適用于多目標(biāo)的定位。圖像分割任務(wù)就是將數(shù)字圖像細(xì)分為多個圖像子區(qū)域(像素的集合,也被稱作超像素)的過程。公共場所由于包含多個對象,目標(biāo)檢測技術(shù)更適合檢測刀具、手槍等危險物品。
目前常被人們使用的目標(biāo)檢測技術(shù)分為2種類型:1種是one-stage方法,不需要先選定候選區(qū)域并對其分類,而是直接產(chǎn)生物體的類別概率和位置坐標(biāo)值,經(jīng)過單次檢測就可以直接得到檢測結(jié)果,檢測速度更快;另1種是two-stage方法,顧名思義需要2步進(jìn)行檢測,第1步先選定候選區(qū)域,第2步在候選區(qū)域的基礎(chǔ)上利用網(wǎng)絡(luò)對其進(jìn)行分類,檢測精度更高。常見的one-stage代表算法有YOLO系列和SSD[5]系列,而two-stage代表算法有RCNN、Faster-RCNN[6]。YOLO算法首先由Redmon等[7]在2016年提出,在2018年更新到Y(jié)OLOv3[8]后原作者停止更新YOLO系列,后由Bochkovskiy[9]在2020年提出YOLOv4算法,不久Ultralytics公司又提出了YOLOv5算法。
由于YOLOv5算法更快,鑒于在公共場合檢測刀具和手槍威脅的實時性要求,本文采用YOLOv5算法作為基準(zhǔn)模型進(jìn)行目標(biāo)檢測。雖然YOLOv5檢測速度更快、更具有實時性,但相應(yīng)的檢測精度會有所下降,為了進(jìn)一步提高YOLOv5算法的檢測精度以及檢測速度,首先引入了多頭自我注意力機制,在提升檢測精度的同時,降低了模型的參數(shù)量,提高了檢測的速度;然后將GIoU損失函數(shù)替換成EIoU損失函數(shù),提升了檢測的精度;最后增加了常見干擾選項使模型能夠有效識別過濾干擾,增強了模型的實用性。
YOLOv5算法由于其模塊化的設(shè)計方案,在改變自身網(wǎng)絡(luò)寬度和深度的基礎(chǔ)上又發(fā)布了4個模型,分別為YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x,這4個模型精度越來越高,同時模型大小也在增加,為滿足本文對檢測速度的需求,選擇YOLOv5s作為基準(zhǔn)模型,在v5.0版本的基礎(chǔ)上對YOLOv5s網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行更改[10]。YOLOv5可以看成由輸入端、backbone、neck、prediction等4部分組成。
輸入端采用了Mosaic數(shù)據(jù)增強,通過隨機縮放、隨機裁剪、隨機排布的方式將4張圖片進(jìn)行拼接。經(jīng)過Mosaic數(shù)據(jù)增強后可以起到豐富數(shù)據(jù)集的作用,也增加了小目標(biāo)數(shù)量,經(jīng)過數(shù)據(jù)增強后的數(shù)據(jù)集如圖1所示。
圖1 Mosaic數(shù)據(jù)增強Fig.1 Mosaic data enhancement
圖2 切片操作Fig.2 Slice operation
backbone中采用Focus結(jié)構(gòu)代替YOLOv3中backbone的前3層,起到了下采樣的作用,其中最重要的是切片操作,如圖2所示,以YOLOv5s的網(wǎng)絡(luò)結(jié)構(gòu)為例子,原始尺寸640×640、通道為3的圖片,經(jīng)過切片操作以后變成320×320×12的特征圖,再經(jīng)過3×3的卷積操作輸出通道為32,最終變成320×320×32的特征圖,在盡量減少影響mAP的基礎(chǔ)上,起到了減少layers(層數(shù))、減少parameters(參數(shù)量)、減少FLOPs(計算量)、減少CUDA內(nèi)存占用以及提高前向傳播和后向傳播速度的作用。
在v5.0版本中,由原先的BottleneckCSP模塊改進(jìn)成C3模塊,BottleneckCSP模塊參照CSPnet[11]結(jié)構(gòu)設(shè)計,YOLOv5的BottleneckCSP模塊根據(jù)有無殘差結(jié)構(gòu)又分為2種形式,YOLOv5將無參差結(jié)構(gòu)的BottleneckCSP模塊也應(yīng)用到了Neck部分中加強網(wǎng)絡(luò)特征融合的能力,而C3模塊和BottleneckCSP模塊類似,區(qū)別就是減少了1個卷積模塊,減少卷積模塊后的C3模塊參數(shù)量減少,整體網(wǎng)絡(luò)模型變小,推理速度也變得更快,相應(yīng)的精度卻沒有大幅下降。
YOLOv5在backbone部分的C3模塊后加入了SPP模塊,SPP模塊參照SPP-Net[12]中的SPP模塊由4個并行分支組成,這4個分支分別是內(nèi)核大小為1×1、5×5、9×9、13×13的最大池化層,再將不同尺度的特征圖進(jìn)行Concat操作,SPP模塊能夠極大地增加感受野,分離出最顯著的上下文特征,豐富了特征圖的表達(dá)能力,有利于待檢測圖像中目標(biāo)大小差異較大的情況,使得檢測精度有所提升。
neck部分借鑒PANet[13]網(wǎng)絡(luò),在FPN[14]的基礎(chǔ)上添加了自下而上(bottom-up)的增強路徑,用于縮短信息路徑,利用低層特征中存儲的精確定位信號,提升特征金字塔架構(gòu),即FPN層自頂向下傳達(dá)強語義特征,而特征金字塔則自底向上傳達(dá)強定位特征,從不同的主干層對不同的檢測層進(jìn)行參數(shù)聚合,進(jìn)一步提高特征提取的能力。
prediction部分回歸損失函數(shù)采用GIoU Loss[15],GIoU Loss是在IoU Loss[16]的基礎(chǔ)上進(jìn)行改進(jìn)的損失函數(shù),改進(jìn)后在IoU Loss的基礎(chǔ)上,解決了邊界框不重合時的問題,公式如下:
式中:I為IoU值;G為GIoU值;LIoU為IoU Loss函數(shù);LGIoU為GIoU Loss函數(shù);A為目標(biāo)框和預(yù)測框的交集;B為目標(biāo)框和預(yù)測框的并集;C為目標(biāo)框和預(yù)測框的最小外接矩形。
BoTNet[17]由UC Berkeley和谷歌在2021年初提出,它可以被看作一個簡單又高效的backbone,可以將它應(yīng)用于圖像分類、目標(biāo)檢測以及實例分割等計算機視覺領(lǐng)域帶來性能提升。雖然卷積運算可以有效地捕獲局部信息,但視覺任務(wù)(如目標(biāo)檢測、實例分割、關(guān)鍵點檢測)需要建模長距離依賴關(guān)系,因此基于卷積的網(wǎng)絡(luò)需要堆疊多層。大量卷積網(wǎng)絡(luò)的堆疊可以提高這些backbone的效果,也相應(yīng)地增加了更多的參數(shù)量,與此同時網(wǎng)絡(luò)模型也變得越來越龐大。
圖3 ResNet Bottleneck塊和Bottleneck Transformer塊
建模全局依賴關(guān)系可能是一個更好的解決方法,讓模型學(xué)會專注,把注意力集中在重要的信息上而忽視不重要的信息是計算機視覺中注意力機制的基本思想。大多數(shù)深度學(xué)習(xí)與注意力機制結(jié)合的研究工作是使用掩碼(mask)來形成注意力機制,通過另一層新的權(quán)重是掩碼的原理所在,將圖片數(shù)據(jù)中關(guān)鍵的特征標(biāo)識出來,通過學(xué)習(xí)訓(xùn)練,讓深度神經(jīng)網(wǎng)絡(luò)學(xué)到每1張新圖片中需要關(guān)注的區(qū)域,也就形成了注意力。self-attention(自我注意力)機制[18]為獲取全局信息帶來了新的思路,使用自我注意力機制會使模型的參數(shù)降低,避免了卷積神經(jīng)網(wǎng)絡(luò)參數(shù)堆疊造成的模型臃腫現(xiàn)象,自我注意力機制在減少參數(shù)量的基礎(chǔ)上也會增加一定的精度,在機器視覺領(lǐng)域中使用自我注意力的一種簡單方法是用Transformer[18]中提出的多頭自我注意(MHSA)層替換空間卷積層。BoTNet就是在ResNet[19]基礎(chǔ)上引入self-attention機制,用multi-head self-attention(MHSA,多頭自注意力)替換掉ResNet中最后一個stage(C5)中3個Bottleneck的3×3 卷積。ResNet Bottleneck塊和Bottleneck Transformer塊的區(qū)別如圖3所示。
由于目標(biāo)檢測任務(wù)輸入圖片較大,這使得傳統(tǒng)的self-attention對計算機的內(nèi)存以及GPU性能要求較高,為解決這些問題,BoTNet采用與卷積結(jié)合的方式,先由卷積提取有效的局部特征降低分辨率,再由全局(all2all)self-attention去處理和聚合特征圖中的信息。與傳統(tǒng)的Transformer不同,在歸一化方面,BoT采用批量歸一化而Transformer采用層歸一化,在FFN塊,ResNet結(jié)構(gòu)允許BoT塊使用3個非線性而Transformer只能用1個,BoTNet使用SGD而Transformer使用Adam優(yōu)化器。
由于注意力不僅考慮了內(nèi)容信息,還考慮了不同位置特征之間的相對距離,為了更好地將對象之間的信息與位置感知關(guān)聯(lián)起來,BoT中的MHSA采用相對位置編碼。
文獻(xiàn)[17]由于引入了Transformer中的多頭自注意力機制,將ResNet Bottleneck塊改進(jìn)成了Bottleneck Transformer塊,使得ResNet得到了性能上的提升進(jìn)而形成了BoTNet。這種性能提升可以應(yīng)用到backbone中,提升檢測的精度同時減少參數(shù)的數(shù)量。所以本文將Bottleneck Transformer塊引入到Y(jié)OLOv5的backbone中,在原有的C3模塊基礎(chǔ)上用Bottleneck Transformer塊替換掉原來的Bottleneck塊改進(jìn)成BTRC3模塊??紤]到自我注意力對計算機內(nèi)存以及GPU性能的要求,BTRC3模塊如果替換掉所有的C3模塊則會帶來巨大的時間消耗,故只替換掉backbone中特征圖分辨率最低的一層C3,也就是替換掉最后一層C3,替換后的網(wǎng)絡(luò)模型改善了精度也減少了參數(shù)量。本文改進(jìn)后的YOLOv5的網(wǎng)絡(luò)整體結(jié)構(gòu)如表1所示。
表1 改進(jìn)的YOLOv5網(wǎng)絡(luò)整體結(jié)構(gòu)Table 1 Overall structure of improved YOLOv5 network
表1中From列的-1指輸入來自上一層輸出,Params列代表參數(shù)量,Module為模塊名稱,Arguments列的值分別代表該模塊的輸入通道數(shù)、輸出通道數(shù)、卷積核大小和步長信息。
原始的YOLOv5使用GIoU Loss,GIoU Loss使用最小外接矩形的方法既可以計算非重疊區(qū)域的比例,又可以計算重疊區(qū)域的面積,能夠更好地反應(yīng)預(yù)測框和目標(biāo)框的遠(yuǎn)近距離和重合程度。但GIoU Loss也存在一些問題,例如當(dāng)預(yù)測框在目標(biāo)框內(nèi)部時,計算得到的GIoU等于IoU值,使得GIoU Loss退化成了IoU Loss,這時候GIoU Loss就不能很好地計算相對位置之間的關(guān)系,當(dāng)預(yù)測框在水平或者在垂直方向時就會變得收斂速度慢,優(yōu)化也比較困難。針對GIoU Loss出現(xiàn)的問題,又提出了DIoU Loss[20],DIoU Loss引入了目標(biāo)框與預(yù)測框2個中心點的歐氏距離以及最小外接矩形框的對角線距離,解決了預(yù)測框在目標(biāo)框內(nèi)部時退化成IoU Loss等問題,收斂速度變快。DIoU Loss公式如下:
式中:D為DIoU值;LDIoU為DIoU Loss函數(shù);ρ2代表求2個點的歐氏距離;b和bgt分別代表目標(biāo)框和預(yù)測框中心點坐標(biāo);d為目標(biāo)框與預(yù)測框2中心點的歐氏距離,c為最小外接矩形框的對角線距離。DIoU Loss雖然考慮了重疊面積和中心點距離幾何因素對目標(biāo)回歸框損失函數(shù)的影響,但沒有考慮到寬高比,于是當(dāng)預(yù)測框和目標(biāo)框中心點的距離相同、中心點的位置一樣時,DIoU Loss的值就等于GIoU Loss和IoU Loss的值,為解決這種問題,文獻(xiàn)[20]在此基礎(chǔ)上又提出了CIoU Loss。CIoU Loss在DIoU Loss基礎(chǔ)上,引入了一個影響因子,在考慮到重疊面積和中心點距離對損失函數(shù)影響的基礎(chǔ)上,也同時照顧到了預(yù)測框和目標(biāo)框的寬高比對損失函數(shù)的影響。CIoU Loss公式如下:
式中:LEIoU為EIoU Loss函數(shù);Cw和Ch分別代表目標(biāo)框和預(yù)測框的最小外接矩形的寬度和高度。由于EIoU Loss可以帶來性能提升,因此本文將EIoU Loss作為YOLOv5模型的損失函數(shù)。
表2 數(shù)據(jù)集各部分?jǐn)?shù)量Table 2 Number of each part of dataset 單位:張
本次實驗使用的數(shù)據(jù)集在網(wǎng)上收集,包括手槍、刀具、錢包、信用卡、手機和紙幣等6類物品,除手槍、刀具外的其余4類作為干擾選項。數(shù)據(jù)集共5 859張圖像,其中5 002張作為訓(xùn)練數(shù)據(jù)集,857張作為測試集,使用Colabeler工具對圖像進(jìn)行標(biāo)注,標(biāo)注后的數(shù)據(jù)集格式為pascal-voc格式,由于YOLOv5需要使用YOLO格式的txt文件,則需要對pascal-voc格式的數(shù)據(jù)集標(biāo)簽進(jìn)行轉(zhuǎn)換成txt文件,轉(zhuǎn)換后txt文件包含的內(nèi)容為(id,x,y,w,h),其中id為標(biāo)注框的類別,采用整數(shù)表示,x、y代表標(biāo)注框中心點的坐標(biāo),w、h代表標(biāo)注框的寬度和高度。數(shù)據(jù)集部分圖像如圖4所示,數(shù)據(jù)集各部分?jǐn)?shù)量劃分如表2所示。
圖4 部分?jǐn)?shù)據(jù)集圖像Fig.4 Images of partial dataset
本次實驗的機器操作系統(tǒng)是Ubuntu 18.04,CPU型號為Intel (R) Xeon (R) CPU E5-2678 v3 @ 2.50GHz,內(nèi)存大小為64GB,GPU型號為NVIDIA GeForce RTX 2080 Ti,顯卡內(nèi)存大小為11GB,深度學(xué)習(xí)框架選擇Pytorch版本號為1.7.1,并使用cuda11.0,cuDNN8.0為GPU訓(xùn)練加速。
本次實驗將圖片輸入大小設(shè)置成640×640像素,由于數(shù)據(jù)訓(xùn)練受到GPU顯存大小的影響,經(jīng)過多次訓(xùn)練觀察bachsize大小對GPU內(nèi)存利用率的影響,選擇性能釋放最合理時的batchsize大小,故將batchsize設(shè)置成24,epoch設(shè)置成100,在訓(xùn)練過程中,選擇合適的錨框可以加速邊界框的回歸,在錨框選擇上采用YOLOv5中自適應(yīng)錨框的方式選擇合適的錨框,對數(shù)據(jù)集中標(biāo)注的位置信息計算相對于默認(rèn)錨框的best possible recall(BPR,最佳召回率),當(dāng)BPR大于或等于0.98,則采用YOLOv5中默認(rèn)的錨框大小;如果BPR小于0.98,則需要利用kmeans算法和遺傳學(xué)習(xí)算法重新計算符合此數(shù)據(jù)集的錨框。由于本次實驗的BPR為1,所以使用YOLOv5中默認(rèn)的錨框大小,[10,13,16,30,33,23]、[30,61,62,45,59,119]和[116,90,156,198,373,326]。
采用mAP@0.5、mAP@0.5∶0.95、Recall(召回率)、Precision(準(zhǔn)確率)作為本次實驗的評價標(biāo)準(zhǔn),mAP@0.5是指IoU設(shè)置成0.5時的平均AP值(AP),mAP@0.5∶0.95代表在不同IoU閾值(從0.50到0.95,步長0.05)上的平均AP。TP代表真陽性即樣本的真實類別是正例,并且模型預(yù)測的結(jié)果也是正例;TN代表真陰性即樣本的真實類別是負(fù)例,并且模型將其預(yù)測成為負(fù)例;FP代表假陽性即樣本的真實類別是負(fù)例,但是模型將其預(yù)測成為正例;FN代表假陰性即樣本的真實類別是正例,但是模型將其預(yù)測成為負(fù)例。Precision表示被分為正例的示例中實際為正例的比例,Recall是覆蓋面的度量表示有多少個正例被分為正例,AP為P-R曲線面積。具體公式如下:
通過采用消融實驗的方式來證明修改YOLOv5s網(wǎng)絡(luò)所帶來的性能變化,首先是測試原始的各項性能,緊接著測試修改backbone中的C3模塊為BTRC3帶來的性能變化,最后在第2步的基礎(chǔ)上將GIoU Loss修改成EIoU Loss來進(jìn)行性能測試。為方便起見本文將第2種網(wǎng)絡(luò)稱為YOLOv5s-BTRC3,將第3種網(wǎng)絡(luò)稱為YOLOv5s-BTRC3-EIoU。各網(wǎng)絡(luò)的訓(xùn)練過程及結(jié)果用曲線的方式進(jìn)行比較,分別用橙色、藍(lán)色和紅色表示YOLOv5s、YOLOv5s-BTRC3和YOLOv5s-BTRC3-EIoU,具體結(jié)果如圖5所示(見封2)。
圖5 各模型的訓(xùn)練過程Fig.5 Training process of each model
將backbone中的最后1個C3模塊修改為BTRC3模塊以后,由于Bottleneck Transformer的獨特性,在替換后參數(shù)量減少,訓(xùn)練時間也相應(yīng)地變短了,由表3可以看出,所有類的mAP@0.5由75.4%提高到76.3%,mAP@0.5∶0.95由49.0%提高到49.4%,刀具和手槍的mAP@0.5和mAP@0.5∶0.95均有部分提升。
表3 不同模型性能對比Table 3 Performance comparison of different models
將GIoU Loss修改成EIoU Loss以后,可以由表3看出,所有類的mAP@0.5由76.3%提高到77.5%,增加了1.2%,mAP@0.5∶0.95也由49.4%提高到53.2%,提高了0.8%,刀具類的mAP@0.5提高了1.4%,手槍類的mAP@0.5也達(dá)到了90%以上,通過表中數(shù)據(jù)可以充分證明改進(jìn)后的YOLOv5s網(wǎng)絡(luò)結(jié)構(gòu)帶來了顯著的性能提升,可以有效檢測刀具和手槍,部分檢測結(jié)果如圖6所示。
圖6 部分檢測結(jié)果Fig.6 Partial test results
為了更好地證明經(jīng)過本文修改后網(wǎng)絡(luò)模型的有效性,將修改后的網(wǎng)絡(luò)模型與Faster R-CNN、SSD、RetinaNet等主流目標(biāo)檢測網(wǎng)絡(luò)進(jìn)行對比實驗,在實驗環(huán)境相同的情況下使用相同的數(shù)據(jù)集進(jìn)行訓(xùn)練和測試。采用mAP@0.5、mAP@0.5∶0.95、FPS(幀率)等評價標(biāo)準(zhǔn)對訓(xùn)練以及測試結(jié)果進(jìn)行定量分析。
通過表4對比結(jié)果可以得出在本文所用數(shù)據(jù)集上,修改后的YOLOv5s網(wǎng)絡(luò)模型在目標(biāo)檢測的準(zhǔn)確度上優(yōu)于主流的目標(biāo)檢測網(wǎng)絡(luò),在同等的測試環(huán)境下修改后的YOLOv5s網(wǎng)絡(luò)模型推理時間更短、FPS更高,目標(biāo)檢測速度上的表現(xiàn)優(yōu)于主流的目標(biāo)檢測網(wǎng)絡(luò)。
表4 主流目標(biāo)檢測網(wǎng)絡(luò)測試結(jié)果對比Table 4 Comparison of mainstream object detection networks
本文通過參照Bottleneck Transformer將多頭自注意力機制引入到Y(jié)OLOv5的backbone中,在原有的C3模塊基礎(chǔ)上用Bottleneck Transforme塊替換掉原來的Bottleneck塊改進(jìn)成BTRC3模塊,在減少參數(shù)量的基礎(chǔ)上提高了檢測精度和檢測速度。將GIoU損失函數(shù)改進(jìn)成EIoU損失函數(shù)后進(jìn)一步帶來了檢測精度的提升。各種實驗結(jié)果證明了2種修改方式的有效性,修改后的模型推理速度更快,模型精度也得到了提升,在實驗環(huán)境下可以調(diào)用攝像頭實時檢測,理論上可以在一定程度上減輕人工安檢的壓力,提高公共場所的安全性。為了更好地更快地應(yīng)用到公共場所領(lǐng)域,在今后的工作中打算加入更多的危險物品作為數(shù)據(jù)集,在進(jìn)一步減少網(wǎng)絡(luò)參數(shù)量和提高檢測速度的基礎(chǔ)上增加檢測精度,嘗試將模型部署到云服務(wù)器供網(wǎng)絡(luò)攝像頭調(diào)用。