基于大尺寸圖像的小目標(biāo)檢測競賽經(jīng)驗(yàn)總結(jié)

極市導(dǎo)讀
?本文為作者參加目標(biāo)檢測比賽總結(jié)的數(shù)據(jù)分析,比賽思路、模型、Tricks以及分享的一些相關(guān)資料。附有詳細(xì)的模型總結(jié)以及anchor的設(shè)置總結(jié)圖。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿
目錄
數(shù)據(jù)分析 比賽思路 模型 Tricks 很好的參考資料 總結(jié)
前言:作為一個(gè)沒有計(jì)算資源,沒有接觸過目標(biāo)檢測的渣碩第一次參加2021廣東工業(yè)大賽的比賽:
2021廣東工業(yè)智造創(chuàng)新大賽-智能算法賽-天池大賽-阿里云天池
1、資源:租了一張2080ti(五百多租一周好貴啊,有資源的大佬可以一起組隊(duì)參加其他比賽啊);
2、成績:初賽 90/4432(進(jìn)復(fù)賽啦),成績一般,受制于資源以及后期單打獨(dú)斗參加比賽。
3、最終方案:Cascade R-CNN, Backbone: ResNet-50, 在線切圖策略訓(xùn)練,測試時(shí)使用分水嶺算法去了一下黑邊(很簡單,很多tricks都沒嘗試,最簡單的模型融合也沒做,時(shí)間和資源都不夠用啊。)
4、悄悄告訴大家,在github中搜tianchi defect detection即可搜到很多開源的冠軍方案(我可真是個(gè)機(jī)靈鬼skr),同理,搜kaggle + 領(lǐng)域也能搜到很多方案。
https://github.com/search?q=tianchi+defect+detection
5、聲明:第一次寫文章以及接觸目標(biāo)檢測,若有錯(cuò)誤還請善意指正哈,感謝。
接下來講講思路以及分享我花了大量時(shí)間收集的資料(后面有XMIND總結(jié),分享給大家),一句話概括這個(gè)任務(wù):超大尺寸圖像的極小目標(biāo)檢測
一、數(shù)據(jù)分析
數(shù)據(jù)集圖像的尺寸是8192*6000,而目標(biāo)object則特別小(不知道大家能不能找到可視化出來的紅色bbox,注意:這張圖一共有三個(gè)bbox)

訓(xùn)練集里面的一張圖像以及其三個(gè)bbox
看不到就放大它吧

放大好幾倍,截圖出來的結(jié)果(還是那么小啊)
并且每張圖的object特別少(即稀疏)
做一個(gè)統(tǒng)計(jì):

每張圖的bbox的數(shù)量大部分集中在1-5個(gè)
看看bbox的面積大小吧:

面積都很小啊
EDA的代碼參考(ps,第一次看到EDA這三個(gè)字母我也是懵逼的,查了一下就是探索性數(shù)據(jù)分析(Exploratory Data Analysis,簡稱EDA),可能這樣看起來更牛):
https://github.com/Kouin/TianCHI_guangdong/blob/main/eda.ipynb?spm=5176.12282029.0.0.26b21aaa83A2vL&file=eda.ipynb
二、比賽思路
對于這種超大尺寸圖像的極小目標(biāo)的檢測,第一時(shí)間想到衛(wèi)星圖像中的目標(biāo)檢測,查了一下相關(guān)資料

圖源《You Only Look Twice: Rapid Multi-Scale Object Detection InSatellite Imagery》,該論文以YOLT代稱。
https://arxiv.org/pdf/1805.09512v1.pdf
YOLT算法筆記_AI之路-CSDN博客:
https://blog.csdn.net/u014380165/article/details/81556805
參考這篇論文的思路:將原輸入圖像切塊,分別輸入模型進(jìn)行檢測,然后再融合結(jié)果。
具體切塊策略(記切圖的大小是1333*800):
1、離線切圖(先把訓(xùn)練集切圖,然后再讓網(wǎng)絡(luò)訓(xùn)練);2、在線切圖(訓(xùn)練時(shí)使用RandomCrop等)
因?yàn)榫鸵粔K2080ti,想要做到每天都可以有兩次結(jié)果提交,就先考慮的是離線切圖策略。
離線切圖的三種策略:
1.1、做滑動窗口切圖:bbox面積特別小,又很稀疏,因此注意排除沒有bbox的切圖(這會引入很多正常的樣本,注意這里,是個(gè)坑,后面再講)。注意需要考慮是否做有overlap的滑動窗口切圖。
1.2、遍歷每個(gè)bbox,然后以該bbox作為切圖中心坐標(biāo),做中心切圖;如果其他bbox的坐標(biāo)滿足在該切圖范圍內(nèi),則加入該bbox。例如紅色切圖是以bbox#1作為中心的,但是bbox#2在紅色切圖范圍內(nèi),則該紅色切圖則會有兩個(gè)bbox。

對于中心切圖策略,切圖個(gè)數(shù)應(yīng)該等于bbox的個(gè)數(shù)(手殘黨畫的切圖框示意)
中心切圖可能存在的問題:對于bbox很密集的情況,有大量的幾乎相差不大的切圖(這個(gè)對于這個(gè)比賽影響不大)。
1.3、遍歷每個(gè)bbox然后隨機(jī)進(jìn)行坐標(biāo)偏移:考慮到中心切圖引入了先驗(yàn)信息,即每個(gè)切圖的中心一定會有一個(gè)bbox,因此引入隨機(jī)性。具體的:遍歷每個(gè)bbox,生成該bbox在切圖坐標(biāo)系中的隨機(jī)坐標(biāo),例如生成的隨機(jī)坐標(biāo)是(0,0),該bbox則在切圖的左上角,隨機(jī)坐標(biāo)是(1333,800),則該bbox在切圖的右下角。注意:細(xì)節(jié)上還需要考慮該bbox的長寬,引入長寬后隨機(jī)坐標(biāo)會有一個(gè)進(jìn)一步的約束(即切圖大小和bbox的長寬來共同限制隨機(jī)坐標(biāo))。同樣的,對于隨機(jī)切圖策略,切圖個(gè)數(shù)應(yīng)該等于bbox的個(gè)數(shù)。和中心切圖一樣會包含在切圖范圍內(nèi)的所有bbox。
兩個(gè)細(xì)節(jié)需要考慮:1、切圖要不要避免把bbox一分為幾。滑動窗口切圖策略加入overlap即可;其他兩種策略肯定會包括每個(gè)完整的bbox(只要bbox的大小不超過切圖設(shè)定的大小,即1333*800)。2、一般的backbone的下采樣率(stride)是32,也就是到最后的feature map的一個(gè)特征點(diǎn)對應(yīng)原圖的32*32的區(qū)域;而大多數(shù)bbox的area基本都在100左右,最小的bbox面積為9。YOLT的做法是將stride變?yōu)?6。
對于隨機(jī)偏移的離線切圖,可以做多次即可得到多倍的數(shù)據(jù)。離線切圖的代碼比較簡單,我就不開源了,有需要私信我即可。
在線切圖(我用的是mmdetection,在線切圖的GPU利用率低啊,所以訓(xùn)練起來就比較慢):
2.1、使用RandomCrop
2.2、使用RandomCenterCropPad
這兩個(gè)在線切圖策略的不同請自己看mmdet的官方實(shí)現(xiàn),提醒一個(gè)細(xì)節(jié),RandomCrop有參數(shù)允許切圖中不包括bbox,而RandomCenterCropPad不允許。我理解的是RandomCrop這種設(shè)置可以引入不包含bbox的負(fù)樣本,避免最終結(jié)果的誤檢較多。
總結(jié):離線切圖相當(dāng)于網(wǎng)絡(luò)模型只能看到你給的這些數(shù)據(jù)了,在線切圖每次都用random,數(shù)據(jù)更多樣吧。在線切圖的結(jié)果會比離線切圖的結(jié)果好,就是訓(xùn)練慢了一點(diǎn)。
回復(fù)上面提及到的那個(gè)坑:離線切圖均考慮的是切圖中必須包含bbox才行,在線切圖的RandomCenterCropPad得到的切圖也是必須包括bbox。但是根據(jù)驗(yàn)證集上的可視化結(jié)果來看,誤檢比較多。因此加入沒有bbox的切圖進(jìn)行訓(xùn)練是很有必要的。但是呢,細(xì)看官方實(shí)現(xiàn)RandomCenterCropPad和RandomCrop時(shí)(此時(shí)已經(jīng)是比賽最后一天了),發(fā)現(xiàn)后者就只需要設(shè)置alllow__neg__positive = True即可,由于時(shí)間關(guān)系沒有嘗試該策略。
測試:因?yàn)橛?jì)算資源受限,使用原圖做inference顯存不夠啊(原圖大概需要19G,而2080ti就11G),那沒辦法啊,把測試集也切圖唄。比如切成3600*3600的,再把結(jié)果融合到原圖的坐標(biāo)系即可。
三、模型:
列出幾個(gè)重要的
沒有速度要求的話,通用就是Cascade R-CNN + Big backbone + FPN (Bbox長寬比例極端的話考慮加入DCN以及修改anchor的比例值,默認(rèn)是0.5,1,2,比如可以修改為[0.2, 0.5, 1, 2, 5]),有速度要求就可以嘗試YOLO系列(聽說YOLO v5在kaggle的小麥檢測上霸榜,可以看看他們的notebook),anchor的比例設(shè)置還是要多EDA分析得到一個(gè)合適的選擇。 多尺度訓(xùn)練和測試,參考這個(gè)關(guān)于多尺度的解釋
https://linzhenyuyuchen.github.io
https://posts.careerengine.us/p/5f94519f324fe34f723bcbed
fp16精度訓(xùn)練可以減少訓(xùn)練時(shí)間 偽標(biāo)簽策略(在kaggle小麥檢測上可以提三個(gè)點(diǎn)),請參考如下
https://www.kaggle.com/nvnnghia/yolov5-pseudo-labeling
https://www.kaggle.com/nvnnghia/fasterrcnn-pseudo-labeling

模型總結(jié)

Anchor的設(shè)置總結(jié)
四、Tricks:
列出幾個(gè)重要的:
WBF,TTA是漲點(diǎn)神器 比賽中無腦降低score的閾值會提升mAP,會有較多誤檢 兩個(gè)重要的數(shù)據(jù)增強(qiáng)策略:Mixup以及填鴨式,下面是一個(gè)簡單的實(shí)現(xiàn)
https://github.com/chuliuT/Tianchi_Fabric_defects_detection/blob/master/final_commit/Duck_inject.py

總結(jié)的一些tricks
很好的參考資料:
目標(biāo)檢測比賽中的 trick | 極市高質(zhì)量視覺算法開發(fā)者社區(qū)(https://bbs.cvmart.net/topics/1500)
https://cloud.tencent.com/developer/article/1486440
http://spytensor.com/index.php/archives/53/?aazqne=u9pzg2&lktala=z15jb3
初識CV:目標(biāo)檢測比賽中的tricks(已更新更多代碼解析)(https://zhuanlan.zhihu.com/p/102817180)
目標(biāo)檢測比賽提高mAP的方法 - 駿騰 - 博客園(https://www.cnblogs.com/zi-wang/p/12537034.html)
最后:
1、參加比賽可以學(xué)到很多東西,尤其是在不懂該領(lǐng)域時(shí)。這會讓你去了解一些細(xì)節(jié)而不是單純看paper時(shí)的囫圇吞棗。但是呢,現(xiàn)在detection有很多集成得很好的庫了(例如mmdetection),很多細(xì)節(jié)也是只需要改一些參數(shù),配置一些configs即可。若想細(xì)致的了解,還需要看具體的實(shí)現(xiàn)。
2、參加比賽很重要的一點(diǎn)是團(tuán)隊(duì)。作為隊(duì)長你想要取得什么樣的成績,同時(shí)隊(duì)友也有致力于這個(gè)目標(biāo)的自驅(qū)動力,即設(shè)置一個(gè)合理的目標(biāo)。如何激發(fā)每個(gè)成員的主觀能動性是很重要的!作為隊(duì)長,對于整個(gè)比賽的進(jìn)度把控是很重要的,什么時(shí)候出一個(gè)baseline,基于baseline結(jié)果的各種可能細(xì)分為各種方向,每個(gè)成員在哪些方向進(jìn)行探索(數(shù)據(jù)處理/模型等),定期的頭腦碰撞很重要。
3、實(shí)驗(yàn)設(shè)置/結(jié)果記錄,實(shí)驗(yàn)結(jié)果的管理也很重要,推薦使用一些共享文檔來記錄(例如騰訊文檔,石墨文檔)。學(xué)會利用身邊的一切資源(能找到有卡的隊(duì)友真是太幸福了),在比賽群里看到有同樣思路的其他隊(duì)伍積極交流啊(這個(gè)對我來說幫助很大),避免局部最優(yōu),閉門造車嘛。
4、自己的總結(jié)是參考了很多其他的博客以及知乎文章,因此有一些‘抄襲’吧。若原作者看見了請聯(lián)系我,可以刪除或者加上你的文章鏈接。感謝!
5、知乎圖片應(yīng)該會有壓縮,因此上傳一個(gè)Xmind源文件給大家,有需要的下載即可。里面不僅有上面那些圖片的總結(jié)源文件,還有mmdetection的使用總結(jié)(因?yàn)槲沂且粋€(gè)愛寫筆記的人,所以啥都總結(jié)),還有一些服務(wù)器的使用總結(jié)等等,關(guān)于Xmind中一些是我加工處理過的,信息傳遞會存在gap嘛甚至?xí)嬖阱e(cuò)誤,所以歡迎批評指正
XMIND源文件可在極市平臺回復(fù)關(guān)鍵詞“目標(biāo)檢測競賽”獲得。
覺得有用可以點(diǎn)個(gè)贊呀,謝謝,比心。

推薦閱讀

