ECV2023|安全帶規(guī)范佩戴檢測(cè)冠軍方案分享
作者丨山東大學(xué)萬有引力
編輯丨極市平臺(tái)
賽題分析:題目解讀
項(xiàng)目背景:安全帶規(guī)范佩戴檢測(cè)算法主要用在建筑工地等施工現(xiàn)場(chǎng),檢測(cè)施工人員是否佩戴了安全帶,從而提升施工區(qū)域內(nèi)的管控工作效率,保證施工人員的人身安全。
訓(xùn)練集:訓(xùn)練數(shù)據(jù)包含9000張圖片;測(cè)試集包含1000張圖片;
評(píng)價(jià)指標(biāo):模型榜和算法榜都采用準(zhǔn)確率、算法性能絕對(duì)值綜合得分的形式,其中IoU為0.5. Score=算法精度 * 0. 95 + 算法性能值 * 0.05
從賽題中可以得到如下的重要信息:
目標(biāo)檢測(cè)類問題
類別種類共三類:belt,belt_person,no_belt_person
通過上面的分析,我們有了一個(gè)簡單的猜測(cè):
安全帶類別相比于其他兩個(gè)類別,屬于是“小目標(biāo)”,如下面兩個(gè)圖所示,我們認(rèn)為可能是影響最終排名的決定性因素。


2.賽題分析:模型選擇
一個(gè)合適的模型將直接決定最終的結(jié)果,我們以賽題提供的代碼作為baseline(極市目標(biāo)檢測(cè)開發(fā)套件)先熟悉極視平臺(tái)訓(xùn)練流程(我們是第一次參加極市的比賽);然后跑通baseline;
極市開發(fā)套件包含了三個(gè)模型的運(yùn)行腳本:yolov5,yolox,yolov7。這里我們選擇了yolov5:
YOLOv5的部署比較完善,推理速度快。
參數(shù)量也比較合適
3. 算法流程及實(shí)現(xiàn)
3.1 劃分訓(xùn)練集和測(cè)試集

我們首先調(diào)整的參數(shù)是,提高訓(xùn)練集和驗(yàn)證集的比例:8:2 —> 9:1
進(jìn)行這個(gè)參數(shù)的特征,主要有如下兩點(diǎn)考慮:
訓(xùn)練數(shù)據(jù)一共有9000張圖片,總體比較少;
希望模型能接觸到更多訓(xùn)練數(shù)據(jù);
使用更多的訓(xùn)練數(shù)據(jù)進(jìn)行模型的訓(xùn)練,也有可能帶來一定的危害,如測(cè)試集合過少,驗(yàn)證出的最優(yōu)模型可能在測(cè)試集上并不是最優(yōu)的,也就是驗(yàn)證集過少,可能不能驗(yàn)證模型的真實(shí)性能,但是值得一試。
具體的實(shí)現(xiàn)方式:采用隨機(jī)劃分
實(shí)驗(yàn)表明,我們的修改是正確的,提高了模型的f-score
3.2 標(biāo)簽平滑

為了更好的性能,我們使用了標(biāo)簽平滑的技術(shù),標(biāo)簽平滑是一種正則化的策略,通過soft label來加入噪聲,減少真實(shí)樣本的類別在計(jì)算損失時(shí)的權(quán)重,起到抑制過擬合的效果。除此之外,該方法還可以提高模型的泛化能力。
我們的平滑參數(shù)設(shè)置:??=0.1,獲得了模型榜第一名
3.3數(shù)據(jù)增強(qiáng)
數(shù)據(jù)增強(qiáng)有多種方式,這里我們幾乎能用的數(shù)據(jù)增強(qiáng)方式都用到了:
隨機(jī)旋轉(zhuǎn)、隨機(jī)裁剪、隨機(jī)觀察角度
隨機(jī)模糊、隨機(jī)灰度化、降低圖像質(zhì)量
在HSV顏色空間上進(jìn)行數(shù)據(jù)增強(qiáng),像素級(jí)別數(shù)據(jù)增強(qiáng)
Mosaic:一張主圖和隨機(jī)三張圖片平成一張圖片
MixUp:將原圖和隨機(jī)選取的圖片進(jìn)行混合
數(shù)據(jù)增強(qiáng)對(duì)于提高模型的泛化能力和提高模型識(shí)別的準(zhǔn)確率非常重要。
4 測(cè)試結(jié)果分析

采用上面的方法改進(jìn)后,我們對(duì)模型進(jìn)行了訓(xùn)練和測(cè)試,結(jié)果如上圖所示,可以看到,模型的f-score是0.9565,已經(jīng)是比較高的了。這說明訓(xùn)練和測(cè)試的數(shù)據(jù)并不復(fù)雜,簡單的yolov5s模型就可以學(xué)習(xí)到比較好的特征。
然后我們還分析了每個(gè)類別的精確率和召回率,我們發(fā)現(xiàn),belt和belt_person兩個(gè)類別無論是精確率還是召回率都非常高,no_belt_person反而是最低的。

這和我們最初的猜測(cè)是相違背的,我們猜測(cè),可能是因?yàn)椋?/p>
belt和belt_person兩個(gè)類別是有關(guān)聯(lián)的,模型可學(xué)習(xí)到了這種關(guān)聯(lián),因此belt的識(shí)別率并不低,而no_belt_person需要分別出沒有帶belt,反而性能降低了;
belt和belt_person是“相容”的,而no_belt_person與之不“相容”;
5 其他模型嘗試
除了yolov5s之外,我們也嘗試了yolov7和yolox。
在精度方面:yolov7精度表現(xiàn)和yolov5s基本相同,而yolox精度則要低一些。
在性能方面:yolov5s的性能幾乎是他們的兩倍。
綜上,我們考慮使用yolov5s作為最終的檢測(cè)框架。
6 模型測(cè)試階段調(diào)試

在查看測(cè)試結(jié)果的時(shí)候,我們發(fā)現(xiàn)每個(gè)類型的精確率都是低于召回率的。考量模型性能的一個(gè)指標(biāo)是f-score,而f-score是精確率和召回率的調(diào)和平均值,如下面公式所示:
可以通過簡單的數(shù)據(jù)分析可以知道,f-score的值只有在Precision和Recall都很高的情況下才會(huì)變得高。目前我們是召回率很高,通過提高置信度的閾值,由原來的0.2提高到0.45,損失一點(diǎn)召回率,提高了模型的精確率,最終提高f-score也是非常值得的。實(shí)驗(yàn)的結(jié)果也證明了我們的想法。
7 模型部署
起初,我們使用了極市平臺(tái)提供的C++部署套件,并按照賽題的要求,修改其中的業(yè)務(wù)邏輯,并使用tensorRT進(jìn)行加速。但是最終的測(cè)試性能,卻遠(yuǎn)沒有我們預(yù)想的那么快,可能是出現(xiàn)了bug。后期,因?yàn)槠脚_(tái)也支持python,所以我們最終采用python代碼來進(jìn)行測(cè)試,先將pytorch模型轉(zhuǎn)換成onnx模型,然后再使用tensorRT進(jìn)行優(yōu)化。

配置好一切的環(huán)境后,在部署榜上的性能結(jié)果基本上接近模型榜的上的性能。
8. 總結(jié)及可能的改進(jìn)
總結(jié):
數(shù)據(jù)并不復(fù)雜,不需要特別大的模型
使用多個(gè)數(shù)據(jù)增強(qiáng),提高模型的泛化能力
可以增加正則損失,避免模型過擬合
要根據(jù)訓(xùn)練結(jié)果調(diào)整訓(xùn)練參數(shù),置信度閾值等等參數(shù)
推理性能,使用TensorRT進(jìn)行推理優(yōu)化。
可能的改進(jìn):
嘗試使用半精度推理,進(jìn)一步提高模型的性能
嘗試模型融合,多個(gè)模型的結(jié)果進(jìn)行合并,進(jìn)一步提高f-score
采用交叉驗(yàn)證方式,選擇更好的模型參數(shù)