基於大尺寸圖像的小目標檢測競賽經驗總結

點擊上方AI算法與圖像處理”,選擇加"星標"或“置頂”

重磅乾貨,第一時間送達

僅作學術分享,不代表本公衆號立場,侵權聯繫刪除
轉載於: 作者丨清風明月@知乎(已授權)
來源丨https://zhuanlan.zhihu.com/p/345657476

目錄

  • 數據分析
  • 比賽思路
  • 模型
  • Tricks
  • 很好的參考資料
  • 總結

前言:作爲一個沒有計算資源,沒有接觸過目標檢測的渣碩第一次參加2021廣東工業大賽的比賽:

2021廣東工業智造創新大賽-智能算法賽-天池大賽-阿里雲天池

1、資源:租了一張2080ti(五百多租一週好貴啊,有資源的大佬可以一起組隊參加其他比賽啊);

2、成績:初賽 90/4432(進複賽啦),成績一般,受制於資源以及後期單打獨鬥參加比賽。

3、最終方案:Cascade R-CNN, Backbone: ResNet-50, 在線切圖策略訓練,測試時使用分水嶺算法去了一下黑邊(很簡單,很多tricks都沒嘗試,最簡單的模型融合也沒做,時間和資源都不夠用啊。)

4、悄悄告訴大家,在github中搜tianchi defect detection即可搜到很多開源的冠軍方案(我可真是個機靈鬼skr),同理,搜kaggle + 領域也能搜到很多方案。

https://github.com/search?q=tianchi+defect+detection

5、聲明:第一次寫文章以及接觸目標檢測,若有錯誤還請善意指正哈,感謝。

接下來講講思路以及分享我花了大量時間收集的資料(後面有XMIND總結,分享給大家),一句話概括這個任務:超大尺寸圖像的極小目標檢測

一、數據分析

數據集圖像的尺寸是8192*6000,而目標object則特別小(不知道大家能不能找到可視化出來的紅色bbox,注意:這張圖一共有三個bbox)

訓練集裏面的一張圖像以及其三個bbox

看不到就放大它吧

放大好幾倍,截圖出來的結果(還是那麼小啊)

並且每張圖的object特別少(即稀疏)

做一個統計:

每張圖的bbox的數量大部分集中在1-5個

看看bbox的面積大小吧:

面積都很小啊

EDA的代碼參考(ps,第一次看到EDA這三個字母我也是懵逼的,查了一下就是探索性數據分析(Exploratory Data Analysis,簡稱EDA),可能這樣看起來更牛):

https://github.com/Kouin/TianCHI_guangdong/blob/main/eda.ipynb?spm=5176.12282029.0.0.26b21aaa83A2vL&file=eda.ipynb

二、比賽思路

對於這種超大尺寸圖像的極小目標的檢測,第一時間想到衛星圖像中的目標檢測,查了一下相關資料

圖源《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

參考這篇論文的思路:將原輸入圖像切塊,分別輸入模型進行檢測,然後再融合結果。

具體切塊策略(記切圖的大小是1333*800):

1、離線切圖(先把訓練集切圖,然後再讓網絡訓練);2、在線切圖(訓練時使用RandomCrop等)

因爲就一塊2080ti,想要做到每天都可以有兩次結果提交,就先考慮的是離線切圖策略。

離線切圖的三種策略:

1.1、做滑動窗口切圖:bbox面積特別小,又很稀疏,因此注意排除沒有bbox的切圖(這會引入很多正常的樣本,注意這裏,是個坑,後面再講)。注意需要考慮是否做有overlap的滑動窗口切圖。

1.2、遍歷每個bbox,然後以該bbox作爲切圖中心座標,做中心切圖;如果其他bbox的座標滿足在該切圖範圍內,則加入該bbox。例如紅色切圖是以bbox#1作爲中心的,但是bbox#2在紅色切圖範圍內,則該紅色切圖則會有兩個bbox。

對於中心切圖策略,切圖個數應該等於bbox的個數(手殘黨畫的切圖框示意)

中心切圖可能存在的問題:對於bbox很密集的情況,有大量的幾乎相差不大的切圖(這個對於這個比賽影響不大)。

1.3、遍歷每個bbox然後隨機進行座標偏移:考慮到中心切圖引入了先驗信息,即每個切圖的中心一定會有一個bbox,因此引入隨機性。具體的:遍歷每個bbox,生成該bbox在切圖座標系中的隨機座標,例如生成的隨機座標是(0,0),該bbox則在切圖的左上角,隨機座標是(1333,800),則該bbox在切圖的右下角。注意:細節上還需要考慮該bbox的長寬,引入長寬後隨機座標會有一個進一步的約束(即切圖大小和bbox的長寬來共同限制隨機座標)。同樣的,對於隨機切圖策略,切圖個數應該等於bbox的個數。和中心切圖一樣會包含在切圖範圍內的所有bbox。

兩個細節需要考慮:1、切圖要不要避免把bbox一分爲幾。滑動窗口切圖策略加入overlap即可;其他兩種策略肯定會包括每個完整的bbox(只要bbox的大小不超過切圖設定的大小,即1333*800)。2、一般的backbone的下采樣率(stride)是32,也就是到最後的feature map的一個特徵點對應原圖的32*32的區域;而大多數bbox的area基本都在100左右,最小的bbox面積爲9。YOLT的做法是將stride變爲16。

對於隨機偏移的離線切圖,可以做多次即可得到多倍的數據。離線切圖的代碼比較簡單,我就不開源了,有需要私信我即可。

在線切圖(我用的是mmdetection,在線切圖的GPU利用率低啊,所以訓練起來就比較慢):

2.1、使用RandomCrop

2.2、使用RandomCenterCropPad

這兩個在線切圖策略的不同請自己看mmdet的官方實現,提醒一個細節,RandomCrop有參數允許切圖中不包括bbox,而RandomCenterCropPad不允許。我理解的是RandomCrop這種設置可以引入不包含bbox的負樣本,避免最終結果的誤檢較多。

總結:離線切圖相當於網絡模型只能看到你給的這些數據了,在線切圖每次都用random,數據更多樣吧。在線切圖的結果會比離線切圖的結果好,就是訓練慢了一點。

回覆上面提及到的那個坑:離線切圖均考慮的是切圖中必須包含bbox纔行,在線切圖的RandomCenterCropPad得到的切圖也是必須包括bbox。但是根據驗證集上的可視化結果來看,誤檢比較多。因此加入沒有bbox的切圖進行訓練是很有必要的。但是呢,細看官方實現RandomCenterCropPad和RandomCrop時(此時已經是比賽最後一天了),發現後者就只需要設置alllow__neg__positive = True即可,由於時間關係沒有嘗試該策略。

測試:因爲計算資源受限,使用原圖做inference顯存不夠啊(原圖大概需要19G,而2080ti就11G),那沒辦法啊,把測試集也切圖唄。比如切成3600*3600的,再把結果融合到原圖的座標系即可。

三、模型:

列出幾個重要的

  • 沒有速度要求的話,通用就是Cascade R-CNN + Big backbone + FPN (Bbox長寬比例極端的話考慮加入DCN以及修改 anchor的比例值,默認是0.5,1,2,比如可以修改爲[0.2, 0.5, 1, 2, 5]),有速度要求就可以嘗試YOLO系列(聽說YOLO v5在kaggle的小麥檢測上霸榜,可以看看他們的notebook),anchor的比例設置還是要多EDA分析得到一個合適的選擇。
  • 多尺度訓練和測試,參考這個關於多尺度的解釋

https://linzhenyuyuchen.github.io

https://posts.careerengine.us/p/5f94519f324fe34f723bcbed

  • fp16精度訓練可以減少訓練時間
  • 僞標籤策略(在kaggle小麥檢測上可以提三個點),請參考如下

https://www.kaggle.com/nvnnghia/yolov5-pseudo-labeling

https://www.kaggle.com/nvnnghia/fasterrcnn-pseudo-labeling

模型總結

Anchor的設置總結

四、Tricks:

列出幾個重要的:

  • WBF,TTA是漲點神器
  • 比賽中無腦降低score的閾值會提升mAP,會有較多誤檢
  • 兩個重要的數據增強策略:Mixup以及填鴨式,下面是一個簡單的實現

https://github.com/chuliuT/Tianchi_Fabric_defects_detection/blob/master/final_commit/Duck_inject.py

總結的一些tricks

很好的參考資料:

目標檢測比賽中的 trick | 極市高質量視覺算法開發者社區(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:目標檢測比賽中的tricks(已更新更多代碼解析)(https://zhuanlan.zhihu.com/p/102817180

目標檢測比賽提高mAP的方法 - 駿騰 - 博客園(https://www.cnblogs.com/zi-wang/p/12537034.html

最後:

1、參加比賽可以學到很多東西,尤其是在不懂該領域時。這會讓你去了解一些細節而不是單純看paper時的囫圇吞棗。但是呢,現在detection有很多集成得很好的庫了(例如mmdetection),很多細節也是隻需要改一些參數,配置一些configs即可。若想細緻的瞭解,還需要看具體的實現。

2、參加比賽很重要的一點是團隊。作爲隊長你想要取得什麼樣的成績,同時隊友也有致力於這個目標的自驅動力,即設置一個合理的目標。如何激發每個成員的主觀能動性是很重要的!作爲隊長,對於整個比賽的進度把控是很重要的,什麼時候出一個baseline,基於baseline結果的各種可能細分爲各種方向,每個成員在哪些方向進行探索(數據處理/模型等),定期的頭腦碰撞很重要。

3、實驗設置/結果記錄,實驗結果的管理也很重要,推薦使用一些共享文檔來記錄(例如騰訊文檔,石墨文檔)。學會利用身邊的一切資源(能找到有卡的隊友真是太幸福了),在比賽羣裏看到有同樣思路的其他隊伍積極交流啊(這個對我來說幫助很大),避免局部最優,閉門造車嘛。

4、自己的總結是參考了很多其他的博客以及知乎文章,因此有一些‘抄襲’吧。若原作者看見了請聯繫我,可以刪除或者加上你的文章鏈接。感謝!

5、知乎圖片應該會有壓縮,因此上傳一個Xmind源文件給大家,有需要的下載即可。裏面不僅有上面那些圖片的總結源文件,還有mmdetection的使用總結(因爲我是一個愛寫筆記的人,所以啥都總結),還有一些服務器的使用總結等等,關於Xmind中一些是我加工處理過的,信息傳遞會存在gap嘛甚至會存在錯誤,所以歡迎批評指正

end



   
      
      
      
個人微信(如果沒有備註不拉羣!
請註明: 地區+學校/企業+研究方向+暱稱



下載1:何愷明頂會分享


AI算法與圖像處理」公衆號後臺回覆:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經典工作的總結分析


下載2:終身受益的編程指南:Google編程風格指南


AI算法與圖像處理」公衆號後臺回覆:c++,即可下載。歷經十年考驗,最權威的編程規範!



 
    
    
    
下載3 CVPR2020

AI算法與圖像處公衆號後臺回覆: CVPR2020 即可下載1467篇CVPR 2020論文


覺得不錯就點亮在看吧


本文分享自微信公衆號 - AI算法與圖像處理(AI_study)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章