抽煙識(shí)別冠軍方案|ECV 2022
作者丨咸菜配稀飯
編輯丨極市平臺(tái)
2022年5月-7月,我參加了極市平臺(tái)ECV2022計(jì)算機(jī)視覺開發(fā)者榜單大賽.獲得了抽煙識(shí)別賽道的冠軍,以下是我對(duì)本次比賽的總結(jié)和回顧.
賽題要求
在工廠、工地等場(chǎng)所,由于可能存在易燃易爆物,都嚴(yán)禁抽煙,在辦公區(qū)域、后廚、園區(qū)等一些公共場(chǎng)所,也禁止抽煙。鑒于此需求,本賽題希望開發(fā)者能夠基于工廠、后廚、辦公室、園區(qū)等多個(gè)場(chǎng)景,開發(fā)出算法以檢測(cè)是否有人在進(jìn)行抽煙。

賽題難點(diǎn)
香煙檢測(cè)屬于小目標(biāo)物體,檢測(cè)存在難度。
抽煙和打電話/摸耳朵等動(dòng)作很容易混淆,筆者之前參加過一個(gè)打手機(jī)識(shí)別的比賽,該比賽中很多打手機(jī)的負(fù)樣本就是拿抽煙做的,因?yàn)閮蓚€(gè)行為在攝像頭底下很容易被誤解,因此需要解決這兩個(gè)行為的區(qū)別,不能僅用目標(biāo)檢測(cè)來解決。
題目需要輸出:
頭部框位置并區(qū)分正臉 側(cè)臉 背臉
人臉 五個(gè)關(guān)鍵點(diǎn):左眼 右眼 鼻子 左嘴角 右嘴角
手部框位置
抽煙框位置
煙頭框位置
煙頭線位置
由于涉及隱私保護(hù)和數(shù)據(jù)保護(hù), 編碼環(huán)境里面的人臉都被打了馬賽克,如下圖:
這樣造成臉部幾個(gè)關(guān)鍵點(diǎn)和煙頭的關(guān)鍵點(diǎn)信息都被抹去了, 靠樣本數(shù)據(jù)無法在編程環(huán)境中訓(xùn)練一個(gè)簡(jiǎn)單關(guān)鍵點(diǎn)模型來調(diào)試;。
這樣會(huì)有些麻煩, 無法在編程環(huán)境中調(diào)試輸出 ,除非你之前就在極市平臺(tái)上面做過打榜的題目,熟悉題目要求,如果是像筆者一樣第一次做這個(gè)題目的話,需要很多時(shí)間去摸索,我花了很多積分和時(shí)間在這上面做調(diào)試。
因此也推薦大家沒事的時(shí)候也可以先到極市的打榜頻道鍛煉一下,據(jù)筆者觀察他們的很多比賽題目都是從榜單這里選的,事先熟悉一下極市的數(shù)據(jù)和要求,這樣在比賽開始后可以比別人快很多進(jìn)入主題。
數(shù)據(jù)分析
比賽數(shù)據(jù)集共包含31065張圖像 數(shù)據(jù)均為JPG格式,標(biāo)注類型為VOC+關(guān)鍵點(diǎn),標(biāo)注文件格式為XML,標(biāo)簽類型bounding box、polyline、point。
訓(xùn)練集分辨率:
'38402160': 14189'19201080': 8558'19201440': 3663'1280720': 2084'25601440': 412'1512848': 289'2560*1920': 109
做了下標(biāo)注的統(tǒng)計(jì),基本還是均衡的,符合實(shí)際的情況
模型選擇
選擇一個(gè)好的算法模型,往往要從以下幾點(diǎn)入手:
1、更快更強(qiáng)的Backbone架構(gòu);
2、更有效的Neck特征集成方法;
3、更準(zhǔn)確的檢測(cè)Head方法;
賽題思路
通常看到題目的對(duì)臉部幾個(gè)關(guān)鍵點(diǎn)的要求很容易想到這賽道需要一個(gè)臉部關(guān)鍵點(diǎn)檢測(cè)的算法來實(shí)現(xiàn)。
因此直覺就是選擇了retinaface 這個(gè)算法可以檢測(cè)人臉并輸出5個(gè)關(guān)鍵點(diǎn):剛好是賽題要求的幾個(gè)點(diǎn)。
最初的baseline 的流程如下圖所示:

利用兩個(gè)模型合并推理來實(shí)現(xiàn) ,一開始我就是這樣實(shí)現(xiàn),但是在這個(gè)比賽上速度跟不上。
出于推理性能考慮,加上筆者對(duì)于yolov5的網(wǎng)絡(luò)結(jié)構(gòu)比較熟悉,筆者選擇了另外一個(gè)模型yolo5face(其實(shí)retinaface也能改)
yolov5face是深圳神目科技推出的人臉檢測(cè)模型。
論文地址:https://arxiv.org/abs/2105.12931

通過上圖的表格我們可以看到相對(duì)于RetinaFace 和SCRFD ,Yolo5-Face在精度和計(jì)算量都要好一些.
Yolo5face算法把人臉檢測(cè)視為一般的目標(biāo)檢測(cè)任務(wù),以現(xiàn)在比較熱門的YOLOv5模型為基礎(chǔ),輔助以人臉特性,得到一個(gè)新的人臉檢測(cè)器。
主要特點(diǎn)是:
在YOLOv5網(wǎng)絡(luò)中添加五個(gè)人臉關(guān)鍵點(diǎn)回歸,回歸的損失函數(shù)用的是Wing loss。(類比MTCNN、RetinaFace) MTCNN中使用L2損失作為5個(gè)人臉關(guān)鍵點(diǎn)的回歸損失,但是L2對(duì)小的誤差并不敏感,為了克服這個(gè)問題,Wing-Loss出現(xiàn)了;
用Stem模塊替代網(wǎng)絡(luò)中原有的Focus模塊,提高了網(wǎng)絡(luò)的泛化能力,降低了計(jì)算復(fù)雜度,同時(shí)性能也沒有下降;
對(duì)SPP模塊進(jìn)行更新,使用更小的kernel,使yolov5更適用于人臉檢測(cè)并提高了檢測(cè)精度;
添加一個(gè)stride = 64的P6輸出塊,P6可以提高對(duì)大人臉的檢測(cè)性能;
發(fā)現(xiàn)一些目標(biāo)檢測(cè)的數(shù)據(jù)增廣方法并不適合用在人臉檢測(cè)中,包括上下翻轉(zhuǎn)和Mosaic數(shù)據(jù)增廣;
基于ShuffleNetv2設(shè)計(jì)了兩個(gè)輕量級(jí)模型,backbone和CSP網(wǎng)絡(luò)不同,模型非常小,可以在嵌入式設(shè)備和移動(dòng)設(shè)備達(dá)到SOTA。
該算法的網(wǎng)絡(luò)架構(gòu)圖如下所示

本方案最終的方案是修改yolo5face為從單一的人臉檢測(cè)修改為多類別的目標(biāo)檢測(cè)(關(guān)鍵點(diǎn))算法 ;
訓(xùn)練和推理
訓(xùn)練過程
首先是數(shù)據(jù)處理,需要將訓(xùn)練數(shù)據(jù)處理成yolov5所需要的格式;yolov5工程化做的比較好,各類比賽中使用的非常多,這里就不介紹這個(gè)VOC格式到y(tǒng)olov5格式轉(zhuǎn)換,如果有疑問可以其他人的比賽總結(jié)或者極市打榜經(jīng)驗(yàn)文章中均有提到;值得注意幾點(diǎn)是:
1.需要處理人臉關(guān)鍵點(diǎn)坐標(biāo),注意輸入輸出的關(guān)鍵點(diǎn)順序;
2.在本方案中,煙頭的兩個(gè)端點(diǎn)也作為關(guān)鍵點(diǎn)輸入訓(xùn)練;
3.所有的關(guān)鍵點(diǎn)數(shù)據(jù)都要?dú)w一化處理;
4.增加對(duì)樣本數(shù)據(jù)增強(qiáng)的處理: 比如高斯模糊, 隨機(jī)裁剪等等;
本方案由于改變了模型backbone ,并沒有使用任何預(yù)訓(xùn)練的權(quán)重,而是基于比賽數(shù)據(jù)從頭訓(xùn)練的;
推理過程
1.為了加快速度, 需要使用TensorRT來推理模型,因此需要將訓(xùn)練好的模型轉(zhuǎn)成tensorrt engine格式部署;
2.將圖像resize成合適的大小,輸入推理網(wǎng)絡(luò),這個(gè)需要做很多測(cè)試;
3.推理的前處理后處理盡量在放到GPU上面執(zhí)行,以加快推理速度;
工程部分總結(jié)
1.選擇一個(gè)能走通的方案作為base line ,在此基礎(chǔ)上面迭代改進(jìn)算法和流程;
2.修改算法backbone為你自己的方案,并且嘗試不同的方案組合,以提高精度;
3.改變圖像推理的尺寸大小,找到一個(gè)合適的大小作為輸入;
4.將模型轉(zhuǎn)到合適的部署方案,比如TensorRT/onnxruntime等;
5.將代碼精簡(jiǎn),理順流程,減少不必要的處理過程;
6.不斷調(diào)試,直到選擇到合適的超參數(shù);
最終效果
最終本方案獲得了榜上第一名的成績(jī);
筆者也嘗試了轉(zhuǎn)換openvino的測(cè)試,在CPU上面也能獲得較好的速度,如果沒有GPU的情況可以使用openvino來推理;
關(guān)于極市平臺(tái)的比賽
最后,筆者還想說一下極市比賽和其他比賽的不同。
極市比賽是非常偏向工程實(shí)際應(yīng)用的, 要求精度同時(shí)也對(duì)性能要求很高 , 因此很多其他比賽的技巧在這里可能都無法使用,比如偽標(biāo)簽, 多模型融合推理這些;反而一些工程方面的技巧應(yīng)用會(huì)上分更多.這些都是需要自己多去嘗試.