【深度学习】短袖短裤识别算法冠军方案总结
??作者丨tourist? ??編輯丨極市平臺
導讀
?本文為短褲短袖識別算法的冠軍tourist,總結了他當時參珠港澳人工智能算法大賽和最近參與打榜的一些技術細節和經驗,希望能夠給后續參加的朋友們一些參考,取得更好的成績。
前言
短袖短褲識別最早是 2020首屆珠港澳人工智能算法大賽 的一個賽題,而如今又在極市平臺后來推出的“算法打榜”專欄中再次上線,目的在于持續激勵開發者創造更好的成績。同時本文也為了方便大家更好地了解這個題目,總結了當時競賽和最近打榜的一些技術細節和經驗,希望能幫助后來參與打榜和類似競賽的大家取得更好的分數。
任務介紹
短褲短袖識別算法可以視為一個目標檢測類型的算法,主要應用背景為建筑工地及工廠等作業區域,對進入作業區域的人員進行自動識別:若檢測到人員穿著短褲短袖,可立即報警,報警信號同步推送至管理人員。該算法極大地提升了作業區域的管控效率,保障了作業人安全。
本算法打榜地址:https://cvmart.net/topList/10015?tab=RealTime&dbType=1-1-1&hasMT=1&hasBT=0
本榜和其他類型的目標檢測打榜任務一樣,最終得分采取準確率、算法性能絕對值綜合得分的形式,具體如下:
| 算法精度分 | F1 Score |
| 算法性能分 | FPS / 100,如果 FPS > 100則按100計算 |
| 總分 | Score = 算法精度分 * 0.9 + 算法性能分 * 0.1 |
補充說明:
總分為本項目排行榜上的 Score,排名:總分值越高,排名越靠前;
算法性能指的賽道標準值是 100 FPS, 如果所得性能值 FPS > 100,則賽道標準值 FPS 按 100 計算;
評審標準:參賽者需要獲得算法精度和算法性能值的成績,且算法精度 >= 0.1,算法性能值 FPS >= 10,才能進入獲獎評選.
值得注意的是算法性能分只占了總分一成的權重而算法的精度則占了總分的九成,常規的思想是需要優先保證算法模型的精度的同時進一步提升模型的速度,而這里算法性能這項指標只要算法在 GPU (NVIDIA T4)上平均推理速度快達 100 幀每秒(10ms 處理一張圖像)則可以獲取該項指標的滿分,這并不難做到,所以后續模型選型考慮從一個足夠快的小模型入手,在保持性能分剛好滿分的前提下,優化模型的精度性能。
本榜也和其他類型打榜一樣提供了豐厚的獎勵:
打榜獎勵而目前本榜的上榜人數較少(截止 2022 年 3 月初只有 6 人上榜),相信下文提供的技術細節和經驗會助力大家提分和上榜~
短袖短褲打榜解決方案
1.數據分析
本榜提供的短袖短褲檢測數據集(https://cvmart.net/dataSets/detail?detailTab=introduce&id=146&tabType=0)主要為監控設備在商場、道路、工地場景拍攝采集,多數為特寫,小部分為遠景。主要針對圖像畫面中出現的行人進行標注,標注其區域位置,并對其上下著裝進行打標簽。標簽有 “短袖”("s_sleeve")、“長袖”("l_sleeve")、“短褲”("shorts")、“長褲”("trousers") 四種,每個行人最多只有兩個標簽(即目標的標簽數不固定)。一共 14614 張圖片,樣本數量為 17170。其中 10207 張圖片用于開發者訓練,4407 張用于模型測試。圖像數據均為 JPG 格式,標注類型為 CVAT,標注文件格式為 XML,標簽類型 bounding box。
標注樣例訓練集中圖片主要的分辨率大小有 312*796、500*750、1596*898、1728*1080、 1920*1080 等,其中 “瘦高” (寬 < 高)的圖片為商城監控(有裁剪)、街拍的圖像,行人相對于圖像的占比較大,這類的數量為 8087 張,并且每張圖像中普遍只有 1 個人;而 “矮胖” (寬 > 高)的圖片為工廠監控攝像頭的原圖像,行人相對于原圖像的占比較小,數量為 2120 張,圖像中普遍不止 1 個人。由此不由地想到可以用一個輸入尺度較小的網絡模型用預處理 “瘦高” 類型的圖像,而用一個輸入尺度大的網絡處理 “矮胖” 的圖像,前者計算量較小,后者計算量大但對于小目標檢測較友好,綜合下來,速度和精度能得到進一步的權衡。
| “瘦高” 類型 | 79.2% |
| “矮胖” 類型 | 20.8% |
另外如果將任務從多標簽圖像分類的角度思考,可以統計訓練集中目標的標簽內容及數量如下:
多標簽統計當然也可以將該任務直接當做多目標檢測問題,也即行人的不同穿戴狀態視為不同的目標,那么總共的目標類型有:['短袖'、'短褲']、['短袖'、'長褲']、['長袖'、'短褲']、['長袖'、'長褲']、['短袖']、['長袖']、['短褲']、['長褲'] 八種,統計各種目標數量如下:
多目標數統計從上面兩個條形統計圖可見,將該任務視為一個行人檢測 + 多標簽分類(mult-label classification),即檢測圖像中的行人位置并給出該行人的屬性標簽,該屬性標簽在 ['短袖'、'長袖'、'短褲'、'長褲'] 中進行選擇,樣本的數量相對于多目標檢測的方式會顯得更均勻和聚攏一些,模型的召回率應該也會優于多目標檢測的方式。
不過還有另外一種思路,就是將任務轉為 行人檢測 + 兩組圖像分類,兩組分類指的是將行人的上衣屬性視為一組分類,而褲子屬性視為一組分類。這種方式相對直接多目標檢測的方式樣本的類別也會更聚攏一些,樣本的分布也會更好一些,兩個分類器相互獨立,有利于提升模型的精確率。筆者采用的是這種方法,下面將圍繞這種方法具體講述。
兩組分類數據統計打榜技巧:雖然平臺中開發者可自由預覽的數據只有 100 張,但是我們可以通過發起一次 “空訓練”,編寫相應的代碼,對數據集中的某些關鍵參數進行統計和記錄,為后續模型選型和設計提供參考。
2.模型選取與訓練
基于 YOLOv5 目標檢測框架:為了兼顧速度和性能,這里選擇的也是開源社區內頗為流行的 YOLOv5 作為目標檢測框架。在此基礎上,主要修改 YOLOv5 的網絡模型輸出部分、loss 部分和訓練數據的標簽解析部分。
why yolov5YOLOv5(https://github.com/ultralytics/yolov5) 代碼主要修改細節:
訓練集標簽轉換和讀入:原訓練集中的標簽為 XML 格式,此處可以編寫相應的代碼將標簽轉換為 YOLOv5 的輸入格式(https://roboflow.com/formats/yolov5-pytorch-txt?ref=ultralytics),但是為了加入上衣和褲子的類別情況,需要在 YOLOv5 的數據格式基礎上再次改動。筆者使用的數據格式為
class_id1 和 class_id2 分別用來標識上衣的['短袖']、['長袖']、['無'] 三種類別和褲子的['短褲']、['長褲']、['無'] 三種類別
網絡類別輸出可以設置為 6,但實際前三位表示上衣的三種類別預測值,后三位表示褲子的三種類別與測試
loss 部分的代碼改動:
https://github.com/ultralytics/yolov5/blob/3752807c0b8af03d42de478fbcbf338ec4546a6c/utils/loss.py#L145-L149
FPS 超過 100 的同時 backbone 盡可能大:在 GPU 環境下很多輕量級、小模型的推理速度很容易達到 100 FPS,大于 100 FPS 即為性能分滿分,但我們不需要追求更快的模型,應該兼顧模型的識別精度,所以還需要權衡模型的網絡大小,此處選取的是足夠大的 YOLOv5 Large 級別的模型,結合部署端的代碼優化,可以剛好實現性能分滿分。
打榜技巧:TensorRT 目前是公認的在 NVIDIA 顯卡上深度學習模型推理速度最快的框架,測試時推薦使用 TensorRT 部署模型,可以收益更高的性能分。
YOLOv5 網絡大小選擇模型的訓練:模型的訓練沿用 YOLOv5 的默認配置即可,模型輸入設定為 640。
3.推理部署
模型的推理用到了數據分析環節里關于 “瘦高” 和 “矮胖” 尺度圖片的分析,將訓練好的模型初始化為兩個不同輸入大小的模型,即 480 的輸入用于處理目標數少且目標大的 “瘦高” 尺度圖片,640 的輸入用于處理目標數多且目標較小的 “矮胖” 尺度圖片。最終部署階段采用 TensorRT 框架進行部署加速
YOLOv5 的 TensorRT C++ 部署代碼推薦參看 https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5
4.結果展示
| YOLOv5s(Python) + 14class | 0.6723 | 0.9968 | 0.803 | 85.97 |
| YOLOv5s(Python) + 8class(兩組分類) | 0.78 | 0.9767 | 0.8686 | 85.25 |
| YOLOv5l(TensorRT C++) + 8class | 0.8546 | 0.9467 | 0.8983 | 93.21 |
| YOLOv5l(TensorRT C++) + 8class + (640 + 480) | 0.8735 | 0.9547 | 0.9123 | 108.5 |
注:此處的結果是筆者所在團隊在 2020首屆珠港澳人工智能算法大賽 短袖短褲識別競賽中使用本文的方法測試記錄的部分結果,因為競賽中的數據標簽還有一類 unsure 的情況,而打榜中的數據集去除了 unsure 的情況,故此處的 14class 對應本文中直接用多目標檢測的方法中的 8 個類別數的情況,8class 對應的是本文中分為兩組分類的目標檢測方法,這里附上的結果僅供參考。
討論與總結
短袖短褲識別任務和其他榜單的目標檢測任務稍有不同,在于每個目標的標簽數是可變的,而本文的方法依然基于傳統目標檢測的思想,只不過在目標的分類階段,劃分了兩個獨立的分類器依次對上衣和褲子的類別進行識別,取得了較好的性能。另外在部署階段,使用兩個不同輸入大小的模型,針對性地處理兩種尺度的圖像,進一步優化了整體的推理速度,在其他的打榜過程中也值得思考和使用。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【深度学习】短袖短裤识别算法冠军方案总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置response.setConten
- 下一篇: 【效率】推荐一款Markdown神器 !