孫家豪,李丹
(四川大學(xué)錦城學(xué)院,四川成都,611371)
據(jù)應(yīng)急管理部消防救援局統(tǒng)計2020年全國共接報火災(zāi)25.2萬起,死亡1183人,受傷775人,直接財產(chǎn)損失40.09億元[1]。8.12天津濱海新區(qū)爆炸造成165人死亡,近兩年四川涼山州曾發(fā)生兩次森林大火分別造成19人和31人遇難。這些生命的逝去讓我們痛惜,同時讓我們思考有沒有更好的方法預(yù)防火災(zāi)的發(fā)生,我們需要通過高科技的手段科學(xué)有效的預(yù)防火災(zāi)。隨著近幾年機器學(xué)習(xí)和計算機硬件技術(shù)的飛速發(fā)展,在火災(zāi)產(chǎn)生初期,火災(zāi)不易被發(fā)現(xiàn)從而造成更大的生命財產(chǎn)損失的情況可以得到極為有效的改善。我們開發(fā)的YOLOX火災(zāi)報警系統(tǒng)可以部署在各種環(huán)境下,如森林、草原、樓道等等,在火災(zāi)發(fā)生初期迅速地提醒人們,避免更大的損失。本文通過介紹YOLOX的算法結(jié)構(gòu)、YOLOX的改進、識別結(jié)果的正確率,以及最終在實際環(huán)境中的火災(zāi)識別表現(xiàn),說明YOLOX的火災(zāi)報警系統(tǒng)。
YOLO(You Only Look Once)系列是目標(biāo)檢測算法的重要組成,其中的YOLO V3[2]在現(xiàn)實生活中的應(yīng)用是最為廣泛的,最新版本YOLOX在2021年被曠視科技公司提出。相比于以前的YOLO系列,YOLOX的檢測速度更快,檢測精確度更高,端對端部署更加靈活。
這里我們主要介紹YOLOX-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)圖。下面的圖1是YOLOX-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)圖。我們將其分解為四個板塊,分別是輸入端、Backbone骨 干 網(wǎng) 絡(luò)、Neck、Prediction。
圖1 YOLOX-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)圖
(1)輸入端:YOLOX采用了以前YOLO版本使用的Mosaic、Mixup兩種數(shù)據(jù)增強技術(shù)。
(2)Backbone骨干網(wǎng)絡(luò):采用了Darket-53網(wǎng)絡(luò)。它一共有53層卷積網(wǎng)絡(luò),最后一層為全連接層,其實是通過1x1卷積實現(xiàn)的??偣?2個卷積用于當(dāng)做主體網(wǎng)絡(luò)。
(3)Neck:采用了FPN的結(jié)構(gòu)進行融合。FPN可以巧妙的將金字塔高層特征和低層特征利用,即高層高語義的特征和低層圖片高分辨率的特征,這樣更有利于提升模型的性能和小目標(biāo)的檢測能力。
(4)Prediction:采用了解耦頭(Decoupled Head)、Anchor-free檢測器、標(biāo)簽分配策略SimOTA(Simplified Optimal Transport Assignment)、Loss計算。
雖然YOLO系列是十分優(yōu)秀的目標(biāo)檢測模型,但是這個系列的模型沒有吸收最近幾年在目標(biāo)檢測領(lǐng)域出現(xiàn)的Anchor-free檢測器、更為優(yōu)秀的LabelAssignment技巧、端到端檢測器(NMS-free),YOLOX針對這些問題進行了優(yōu)化,它主要提出了以下三個方法:
(1)將YOLO檢測器和無錨框(Anchor-free)檢測器結(jié)合;(2)加入解耦頭(Decoupled Head);(3)加入標(biāo)簽分配策略SimOTA(Simplified Optimal Transport Assignment)。
1.3.1 無錨框(Anchor-free)檢測器
YOLO系列中的舊版本均未搭載Anchor-free檢測器,它們都搭載了Anchor-based檢測器,而YOLOX搭載了Anchor-free檢測器。相比于Anchor-free檢測器,Anchor-based檢測器存在一些問題。第一,在檢測前,為了實現(xiàn)最佳性能,我們需要分析最優(yōu)錨框,這些錨框只能用于特定區(qū)域,通用性很差。第二,錨框增加了模型的復(fù)雜性和圖片的預(yù)測數(shù)量。
經(jīng)過這幾年的發(fā)展,Anchor-free的檢測速度和精度已經(jīng)和Anchor-based差不多,其次Anchor-free檢測器在訓(xùn)練和解碼階段變得十分簡單。
作者將YOLO變成一個無錨方式。將每個位置的預(yù)測數(shù)量從3減少到1,并使它們直接預(yù)測4個參數(shù),也就是網(wǎng)格左上角的兩個偏置,即預(yù)測框的高和寬。作者分配每個物體的中心點為正樣本并預(yù)先標(biāo)定一個比例范圍,這樣便于指定每個物體的FPN級。這樣的修改減少了參數(shù)和檢測器的GFLOPs,使它更檢測速度快,而且準(zhǔn)確率更高。
1.3.2 解耦頭(Decoupled Head)
解耦頭是目標(biāo)識別領(lǐng)域是十分常見的,主要是人們目標(biāo)檢測中,分類和回歸會產(chǎn)生沖突的問題。個人認(rèn)為原因是分類和回歸的特征不一樣,分類問題需要考慮每一個樣本的差異,而回歸問題更多的考慮是物體圖像輪廓邊界特征。隨著YOLO系列的骨干網(wǎng)和特征金字塔不斷地發(fā)展,它們的檢測頭會產(chǎn)生耦合的問題。
作者通過實驗分析耦合的檢測頭對性能會產(chǎn)生不利影響。作者的做法是:(1)將YOLO的頭用一個解耦替代,提高了模型的收斂速度。(2)解耦頭對端到端版本的YOLO會有極其重要的影響。具體來說就是作者將YOLO檢測頭用一個輕量解耦頭替代。這個解耦頭包含一個1×1卷積層,通過這個卷積層減少通道維度,卷積層后面接著兩個帶有兩層3×3 卷積層的并行分支。
1.3.3 標(biāo)簽分配策略SimOTA(Simplified Optimal Transport Assignment)
要理解SimOTA必須要了解OTA[3]。OTA[3]解決的問題是anchorassignment問題,一般我們在分配正負樣本的時候是根據(jù)gt的iou與anchor進行分配,作者認(rèn)為檢測目標(biāo)在不同的遮擋情況、不同的大小、不同的形狀正樣本和負樣本的分界線是不同的,同時正負樣本的分配需要考慮全局。所以我們通常把anchor assignment當(dāng)成一個線性規(guī)劃中的優(yōu)化傳輸問題(Optimal Transport)來處理,核心思想是建立一個代價矩陣,假設(shè)有M個gt與N個anchor,那么代價矩陣的大小就是M×N,矩陣中的每個元素就是該gt與anchor的loss值,loss越大則說明選取這對gt和anchor的代價越大,優(yōu)化傳輸?shù)哪康氖侨ミx取gt與anchor的匹配對,使總體代價最小。YOLOX的作者發(fā)現(xiàn)用Sinkhorn-Knopp算法解決優(yōu)化傳輸問題會額外花費25%的訓(xùn)練時間。所以作者省去了Sinkhorn-Knopp算法過程,簡稱為動態(tài)top-k策略。
如圖2所示是我們的YOLOX火災(zāi)報警系統(tǒng)的框架圖。這三個層面負責(zé)人機界面交互和實時的發(fā)出警報,分別是實體層、識別層和現(xiàn)實層。
圖2 YOLOX火災(zāi)報警系統(tǒng)框架圖
實體層:我們可以將攝像頭放置在易發(fā)生火災(zāi)的地方。攝像頭負責(zé)采集圖像資料,然后將圖像資料儲存在系統(tǒng)中,并將圖像實時的傳輸給模型。
識別層:識別層就是我們的圖像處理層。它負責(zé)將系統(tǒng)中的圖像進行處理,通過我們訓(xùn)練的YOLOX網(wǎng)絡(luò)模型對攝像頭所處環(huán)境是否發(fā)生火災(zāi)進行識別,如果識別有火災(zāi)發(fā)生,就將警報發(fā)送給消防人員。
現(xiàn)實層:消防人員趕到模型識別有火災(zāi)發(fā)生的地方,進行撲滅。這樣在火災(zāi)初期就可以進行有效的應(yīng)對,避免更大的損失。
我們使用了網(wǎng)上的火災(zāi)數(shù)據(jù)集,數(shù)據(jù)集的下載地址為fire-smoke-detect-yolov4/README_EN.md at master · gengyanlei/fire-smoke-detect-yolov4 · GitHub。此數(shù)據(jù)集一共有2058張圖片,包含了各種場景下的火災(zāi),如家庭起火、商場起火、森林起火、車輛起火等等情況,這樣的好處是使得我們的YOLOX模型可以識別各種場景下的火災(zāi),適應(yīng)性更好。訓(xùn)練環(huán)境是CUDA 11.1 nvidia-smi 460.73.01,Python3.7.10,顯卡NVDIA Tesla P40 24GB。
第一,在配置環(huán)境的時候,程序會報錯,我們發(fā)現(xiàn)是因為pytorch安裝的1.9版本,cuda張量無法安裝,換成1.8版本可以運行。第二,我們將數(shù)據(jù)集轉(zhuǎn)換成COCO格式,但是模型無法讀取數(shù)據(jù)。經(jīng)過我們研究發(fā)現(xiàn)是轉(zhuǎn)換過程中沒有嚴(yán)格按照格式進行轉(zhuǎn)換。第三,出現(xiàn)了顯存溢出的問題,我們將默認(rèn)訓(xùn)練的300 epoches改為200 epoches。
我們采用的是YOLOX-S模型,這個模型更加著重于模型的推理速度。因為火災(zāi)的發(fā)展速度是刻不容緩的,需要選用識別速度更快的模型。圖3是我們通過調(diào)參訓(xùn)練獲得到的loss下降圖。cls_loss表示模型的目標(biāo)分類損失,conf_loss表示模型的置信度損失,iou_loss表示模型的邊框回歸損失,這里的iou_loss用的是GIOULoss,lr表示模型的學(xué)習(xí)率,優(yōu)化器采用的是SGD優(yōu)化器,優(yōu)化策略用的是帶有 warmup 策略的余弦調(diào)度策略。COCOAP50和COCOAP50_95:驗證用的是COCO的map的計算方式,其中AP指的是準(zhǔn)確率(Precision)和召回率(Recall)作為X,Y軸作圖圍成的面積,50指的是iou設(shè)置為0.5時的AP值, 50_95指的是iou設(shè)置為0.5~0.95,以0.05為步長計算AP的平均值。
圖3 loss下降圖
我們的訓(xùn)練過程主要修改的是num_classes根據(jù)任務(wù)改為1, 采用fine-tune訓(xùn)練,epoch數(shù)設(shè)置為200,batch-size設(shè)置為32,input-size默認(rèn)的[640,640],關(guān)閉flip數(shù)據(jù)增強,降低mosaic和mixup數(shù)據(jù)增強,其他均采用默認(rèn)。
我們的YOLOX經(jīng)過訓(xùn)練后對火災(zāi)的識別是十分不錯的。識別結(jié)果如圖4所示,無論是汽車起火(圖四左側(cè))、住宅起火(圖四居中)還是森林起火(圖四右側(cè)),YOLOX模型都可以得到一個很高的識別率,其中對于較小火焰(圖四居中圖片左側(cè))也有不錯的識別率。
圖4 訓(xùn)練結(jié)果
火災(zāi)一直是人類社會發(fā)展的心腹大患,人們在使用火的同時一直在總結(jié)火災(zāi)發(fā)生的規(guī)律,然而我們?nèi)詿o法避免火災(zāi)的發(fā)生,火災(zāi)無時無刻的威脅著社會發(fā)展和人們的生命財產(chǎn)安全。美國、歐洲和中國都曾經(jīng)發(fā)生過大火災(zāi),面對火災(zāi),一方面我們的消防安全意識仍然急需加強,另一方面我們需要利用高科技的手段去應(yīng)對火災(zāi),如本文所應(yīng)用的YOLOX目標(biāo)檢測算法,它的優(yōu)點是識別速度快、可以布置在各種環(huán)境中,可以全時段、全天候地檢測火災(zāi)的發(fā)生。在這次研究中我們對計算機視覺有了更加深入的認(rèn)識。此次研究工作也有很多不足,例如數(shù)據(jù)集不夠豐富,我們期待未來有更多性能超越Y(jié)OLOX的針對火災(zāi)的檢測算法。