Kaggle實戰目標檢測奇淫技巧合集

2021-02-23 極市平臺

加入極市專業CV交流群,與6000+來自騰訊,華為,百度,北大,清華,中科院等名企名校視覺開發者互動交流!更有機會與李開復老師等大牛群內互動!

同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流點擊文末「閱讀原文」立刻申請入群~

本文來自52CV群友Spytensor參加Kaggle目標檢測比賽的總結,作者是位數據競賽愛好者,文章非常具有實戰意義。歡迎收藏~

原文連結:

http://spytensor.com/index.php/archives/53/

背景

國內的數據競賽真的缺乏交流,還是喜歡 kaggle 的 kernel 和討論區,真硬核!這裡分享一下我總結的一些目標檢測中會用到的 「奇淫技巧」,牽扯到代碼的我就直接拿 mmdetection[1] 來舉例了,修改起來比較簡單。

1. 模型選擇

近一年多以來目標檢測領域沒有太大的動靜,即使最近一段時間的 Anchor Free 和神經網絡搜索框架比較熱,但都沒有太大的革新,當前檢測競賽圈的通用配置還是 Cascade-R-CNN + ResNeXt/ResNet 系列 + FPN+DCN 2,畢竟二階段為王!然後就是一些根據實驗結果的調整了,由於商湯沒有開源 SeNet 系列的訓練模型,所以如果有卡的話可以自己搞。

2. 數據預處理

如果你 baseline 選的準,那麼基本上已經領先一大部分人了,但是如果在數據預處理過程中沒有搞好,那基本上就跟 TOP 系列無緣了,畢竟在數據處理上能夠領先的大佬,後面煉丹的技術也絕對不差。這裡分為以下幾個部分聊一聊數據這方面的策略:

2.1 數據擴充


如果說待檢測目標具有旋轉不變性,那這裡就可以對目標做上下翻轉、左右反轉、90°*3 旋轉等操作;如果目標中存在模糊的情況,在擴充的時候也可以適當做一些高斯模糊什麼的;對於顏色抖動、銳度變化、隨機縮放等這些操作,我實驗的過程中也很難界定他們的效果,而且跟隊友做相同實驗時,所起的作用也不一樣,總結來說,有的時候真的是隨機上分。

2.2 mixup

mixup 的意思就是將兩張圖按照一定的比例混合在一起,詳情移步論文:Bag of Freebies for Training Object Detection Neural Networks[4]。這裡要說的是如何 mixup,如何選擇 mixup 的對象。

在工業類缺陷檢測或者違禁物品檢測中,常常會給出一些不含有待檢測目標的正常圖像,可以將含有目標的圖像和隨機選取的正常圖像進行 mixup(隨機意味著更多的組合~),這樣數據量又上來了。還有一種是徐大哥用的比較騷的操作,就是跟 coco 的數據集進行 mixup,真是服氣。。。

2.3 填鴨式


這個肯定別人也這麼叫過,但是我們隊一開始想到的時候,就這麼稱呼了。所謂填鴨式,就是將一些目標(也可以是誤撿的)扣出來,放到沒有目標的圖上去,增加圖像的魯棒性。比如我們在鋼筋識別的時候,有一些小石子和吊機容易被誤判成鋼筋,索性就選了一些圖,把這些偽目標填充合理的位置上,效果就是沒有再誤判過了。

在津南 2 違禁物品的檢測中,我們一開始也測試了 mixup 的策略,但是效果一般,後來改用 「填鴨式」 處理,效果要好很多,應該說前排基本都用了這個方法吧(猜測)。這裡有一個要注意的就是「隨機」,要是能夠讓目標在正常圖像中的隨機位置填充並且隨機旋轉和縮放,那就完美了,無奈這個沒有實現好,如果有大佬實現了,求指導。。。。

3. 預訓練模型

數據處理完以後,基本上就是要衝擊前排了,這裡就是要考慮如何選用預訓練模型了,一般的檢測都是使用 ImageNet 預訓練的 backbone,這是基本配置,高級一點的就是針對數據集做一次預訓練,比如津南 2 的違禁物品檢測,可以將所有目標裁剪出來,然後訓練一個不錯的分類模型,這樣的初始化相比 ImageNet 就要好太多了。。。

再一點就是使用 coco 預訓練的完整檢測模型權重,這樣的效果就是模型收斂速度賊快,而且效果一般都比較好,也是大家最常用的方法,這裡給出 mmdetection 修改 coco 預訓練權重類別數的腳本:

# for cascade rcnnimport torchnum_classes = 21model_coco = torch.load("cascade_rcnn_x101_32x4d_fpn_2x_20181218-28f73c4c.pth")
# weightmodel_coco["state_dict"]["bbox_head.0.fc_cls.weight"].resize_(num_classes,1024)model_coco["state_dict"]["bbox_head.1.fc_cls.weight"].resize_(num_classes,1024)model_coco["state_dict"]["bbox_head.2.fc_cls.weight"].resize_(num_classes,1024)# biasmodel_coco["state_dict"]["bbox_head.0.fc_cls.bias"].resize_(num_classes)model_coco["state_dict"]["bbox_head.1.fc_cls.bias"].resize_(num_classes)model_coco["state_dict"]["bbox_head.2.fc_cls.bias"].resize_(num_classes)#save new modeltorch.save(model_coco,"coco_pretrained_weights_classes_%d.pth"%num_classes)

這裡再說一下 backbone 的選擇,因為要考慮到要使用 coco 預訓練權重的原因,暫時採用的都是官方給出的模型以及對應的 backbone。我自己也在 mmdetection 中實現了 SeNet 系列的 backbone,無奈沒卡,沒法訓一個 coco 出來。。。。

4. 訓練技巧

深度煉丹名不虛傳。。。。。

4.1 warmup lr


翻譯一下就是對學習率進行預熱,最開始是在 ResNet 的論文中提到的一種方法,原始是先在前幾個 epoch 或 iter 或目標達到一個水準之前以小於預設值得 lr 進行訓練,然後再恢復 lr 到初始值。後來 Facebook 提出了改良版本,詳情請移步論文: Gradual warmup[5],這也是當前檢測和分割中必不可少的環節,mmdetection 中默認是啟用了的:

lr_config = dict(    policy='step',    warmup='linear',    warmup_iters=500,    warmup_ratio=1.0 / 3,    step=[8, 11])


4.2 lr 如何計算


學習率的初始化設置一直是一個比較頭疼的問題,有的時候需要經常實驗才能得到一個比較好的值,我們在檢測任務中常用的計算方法是:lr = 0.02 / 8 x num_gpus x img_per_gpu / 2,一般情況都是這麼計算後設置。

4.3 多尺度訓練


檢測的兩大任務:分類和定位,定位需要模型能夠適應變化頻繁的尺度特徵,但是這恰恰是卷積神經網絡所不具備的,目前在網絡模型上通過 FPN 結構可以緩解一部分,另外就是多尺度訓練,在不同的 iter 下選擇不同的尺度進行訓練,注意尺寸最好時能夠被 32 整除,不過 mmdetection 會檢查這一點,幫你 pad 一下。

4.4 損失函數4.4.1 Focal Loss

這是 CV 中根據實驗結果調整損失函數最先考慮的一個,論文: Focal Loss for Dense Object Detection, 主要是針對模型擬合困難的樣例或者樣本不均衡的樣例,在圖像分類中常用作最終的損失函數,直接進行優化,而在目標檢測中卻有兩個選擇,一個是在 RPN 層使用 FocalLoss,這樣可以緩解由於目標佔比較少導致生成的 anchor 正負樣本比例失衡;另一種就是類似圖像分類一樣,在 bbox_head 中使用,mmdetection 中的相應配置 (如果要正確使用,需要做點改動,自行修改源碼吧,不難):

#1. rpn 處更改rpn_head=dict(    type='RPNHead',    in_channels=256,    feat_channels=256,    anchor_scales=[8],    anchor_ratios=[0.5, 1.0, 2.0],    anchor_strides=[4, 8, 16, 32, 64],    target_means=[.0, .0, .0, .0],    target_stds=[1.0, 1.0, 1.0, 1.0],    loss_cls=dict(        type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),    loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))
#2. bbox_head 處更改bbox_head=dict( type='SharedFCBBoxHead', num_fcs=2, in_channels=256, fc_out_channels=1024, roi_feat_size=7, num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, loss_cls=dict( type='CrossEntropyLoss', #在此處替換 use_sigmoid=False, loss_weight=1.0), loss_bbox=dict( type='SmoothL1Loss', beta=1.0, loss_weight=1.0)))


4.4.2 GIou Loss

Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression,之前曠世提出了 Iou Loss 收斂性較差,GIOU 的詳細介紹,我之前一篇博客介紹了,這裡不再贅述,詳情移步:Generalized Intersection over Union, 這裡只提一下,這種損失函數對增加框的回歸效果比較有效,如果你的任務要求 IOU > 0.8 或者更高,這個可以優先考慮。

4.4.3 其他損失函數

針對分類的損失函數可以試試如 GHM-C Loss,針對回歸的損失函數可以試試如 GHM-R Loss。

4.5 OHEM


OHEM(online hard example mining),翻譯過來就是在線難例挖掘,就是對所有的 ROI 的損失進行評估,選擇損失較大的來優化網絡。

5. infer 技巧5.1 TTA

檢測任務中使用比較多的就是多尺度預測,這個時間開銷有點高,但是效果也是不錯的。另外一個就是 CV 中最常用的 TTA 了(Test Time Augmentation),如果在訓練的過程中加入了旋轉和翻轉,那麼前向過程中也需要加上,即使訓練沒用的話,加上翻轉也會有提升。

5.2 Soft-NMS

Soft-NMS 改進了之前比較暴力的 NMS,當 IOU 超過某個閾值後,不再直接刪除該框,而是降低它的置信度 (得分),如果得分低到一個閾值,就會被排除;但是如果降低後仍然較高,就會被保留。實現細節移步:NMS 與 soft NMS

在 mmdetection 中的設置如下:

test_cfg = dict(    rpn=dict(        nms_across_levels=False,        nms_pre=1000,        nms_post=1000,        max_num=1000,        nms_thr=0.7,        min_bbox_size=0),    rcnn=dict(        score_thr=0.05, nms=dict(type='soft_nms', iou_thr=0.5), max_per_img=100),    keep_all_stages=False)

參考文獻

[1] : mmdetection
[2] : Cascade R-CNN: Delving into High Quality Object Detection
[3] : Deformable ConvNets v2: More Deformable, Better Results
[4] : Bag of Freebies for Training Object Detection Neural Networks
[5] : Gradual warmup

*延伸閱讀


點擊左下角閱讀原文」,即可申請加入極市目標跟蹤、目標檢測、工業檢測、人臉方向、視覺競賽等技術交流群,更有每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流,一起來讓思想之光照的更遠吧~

△長按關注極市平臺

覺得有用麻煩給個在看啦~  

相關焦點

  • 5萬餘首聖誕歌詞數據包+Kaggle數據科學家的腦洞=?(附數據包+代碼)
    之後,我們還可以一起看看,kaggle上的數據科學家用這個數據包分析出了的這些有趣的結論:與聖誕關係最密切的歌詞TOP20;聖誕歌產量最高的歌手我們的目標是對歌曲文本進行全面分析,幫助我們快速識別出聖誕歌曲。
  • 吳鋒的【管道漏水檢測定位實戰分享】
    吳鋒也是咱們行業少有的特別愛專研的一位,就像他給大家分享的這篇管道滲漏檢測的課題,不是特別愛專研特別心細的人是做不來這個事兒的。這一期,我就把吳總總結的精華部分拿出來給大家分享,讓你真正學到實戰、實效、實用的知識!大家好,我是吳峰。
  • 來自一位Kaggle比賽失敗者的含淚總結
    一位剛剛參加了kaggle孟加拉語手寫字位分類比賽的小哥就剛剛「陪跑」了一場,但是從這次的失敗經歷中,他總結了一套「失敗方法論」。文摘菌編譯了這篇文章,希望各位也能從這位Kaggle失敗者的經驗裡,就像梯度下降模型一樣,不斷從錯誤中學習如何更正。enjoy!
  • 2016合集目錄【程序化廣告實戰】
    廢話就不多說了,在此我僅以整理的《2016文章合集目錄》對各位一直關注「程序化廣告實戰」的同學們聊表的至誠謝意。希望大家可以通過這個《2016合集目錄》簡單快速地獲取您想要的內容。若還需要其他的什麼內容歡迎留言告知,我會盡我所能為大家整理。祝大家新春快樂,雞年吉吉利利、萬事如意、17年發發發發發發!
  • 實戰實操!國科大重慶仁濟醫院(重慶市第五人民醫院)應急核酸檢測...
    為全面應對冬春季可能發生的新冠肺炎疫情,快速高效做好各項防控工作,12月25日上午,國科大重慶仁濟醫院 (重慶市第五人民醫院)在醫院車庫花園內舉行大規模人群新冠肺炎病毒核酸檢測篩查演練。醫院黨委書記李元君、副院長楊明清、朱愛東參加。
  • 在全世界都在聊薛之謙的時候,讓我們來看看Kaggle
    Kaggle的目標則是試圖通過眾包的形式來解決這一難題,進而使數據科學成為一場運動。 簡單來說,Kaggle就是一個平臺,讓資本主義花錢僱傭你的數據智慧為他辦事。 Kaggle 通常會有怎麼樣的作用呢?或者說Kaggle上面會有怎麼樣的Project來給你做呢?
  • 做目標檢測,這6篇就夠了:CVPR 2020目標檢測論文盤點
    CVPR 2020 會議上,有哪些目標檢測論文值得關注?目標檢測是計算機視覺中的經典問題之一。憑藉大量可用數據、更快的 GPU 和更好的算法,現在我們可以輕鬆訓練計算機以高精度檢測出圖像中的多個對象。前不久結束的 CVPR 2020 會議在推動目標檢測領域發展方面做出了一些貢獻,本文就為大家推薦其中 6 篇有價值的目標檢測論文。
  • Python|運動目標檢測
    常用的運動目標檢測方法——幀差法幀差法將鄰近幀圖像相減濾除圖像中的靜止景物得到運動區域,其對環境的光線變化不敏感並可快速檢測出運動目標,但對於運動物體速度太慢的情況則產生不完整的「空洞」現象,太快又易於生成「拖尾」現象,其之後的補償處理比較複雜。
  • 無敵的二刀流劍聖 王者榮耀宮本武藏實戰技巧
    在實戰中,宮本武藏是後排脆皮英雄的噩夢,沒有英雄可以逃過他的追殺。今天就為大家介紹一下宮本武藏的實戰技巧,希望對大家有所幫助。大招【二天一流】:宮本武藏躍向空中,在短暫延遲後拔出鳴雷斬落,對目標周圍的區域造成物理傷害,同時將當前目標擊飛並減速;在接下來的12秒內宮本武藏進入二刀流狀態移動速度提升,所有普攻與技能都會附帶鳴雷的法術傷害,狩魔範圍提升,空明斬能夠短暫擊飛敵人,神速將獲得額外突進距離。
  • 圖像目標檢測算法——總結
    傳統目標檢測方法Selective SearchDeformable Part Model基於CNN 的目標檢測1.最開始的CNN 目標檢測就是兩階段的。R-CNNR-CNN 是最早利用CNN 實現目標檢測任務的方法,由rbg(Ross Girshick)等人提出。
  • 實戰形態——「釘子板買賣技巧」
    股票投資過程中買賣是需要一定的技巧性的,想要讓投資變得簡單,那麼掌握釘子板買賣技巧是非常有必要的。相信絕大部分的投資者對於這個股票買賣方法了解的並不多,今天為了幫助更多的投資者,在此為大家介紹一下釘子板買賣技巧的條件。釘子板買賣技巧在運用過程中,需要掌握兩個重要的要素,即釘子板與三指量。
  • 012 蜘蛛網動態模擬 水珠+爬行【我必有-實戰技巧100集】
    這裡是免費的【我必有-實戰技巧100集】的第012集,蜘蛛網的動態模擬因為很多同學在學習過程中遇到問題沒地方問,現在為實戰100集建了一個QQ學習交流群,有問題可以直接問我,也可以問同學們喲!QQ群:862305897  本節課工程也會上傳到QQ群點擊查看圖文版 往期課程【我必有-實戰技巧第1集】羽毛模擬 C4D自帶羽毛系統【我必有-實戰技巧第2集】羽毛渲染 Redshift渲染羽毛【我必有-實戰技巧第3集】 手機清空垃圾動畫【我必有-實戰技巧第4集】伸縮晾衣架綁定
  • 調戲男朋友的一些實戰技巧
    好多女生在問怎麼調戲男朋友其實,男生的挑逗更多需要的是視覺是感覺以下是汙友們的一些實戰技巧來一起取經吧!技巧?把活練好分分鐘調戲的他不要不要的!自強獨立不依賴他整個戀愛過程都像在調戲讓他找不到北
  • 《守望先鋒》重裝英雄實戰擋位技巧
    導 讀 守望先鋒重裝英雄實戰擋位有什麼技巧?這篇是關於守望先鋒重裝英雄實戰擋位技巧,希望可以幫助到你們。 什麼是身體阻擋? 分析師和解說們很看重坦克們創造空間和破壞敵方陣形的能力。D.Va利用推進器把對手...
  • Anchor Boxes——目標檢測質量的關鍵
    雷鋒網(公眾號:雷鋒網) AI 科技評論按:隨著計算機視覺技術逐年火熱,利用計算機圖像處理技術對目標進行實時跟蹤的研究越來越熱門那麼如何提高目標檢測的質量?Anders Christiansen 認為,正確地調整 Anchor Boxes 可以大大提高模型檢測某些未知大小和形狀的對象的能力。下面是他的觀點, 雷鋒網 AI 科技評論編譯整理。在學習用於目標檢測的卷積神經網絡時,Anchor Boxes 是最難掌握的概念之一。它還是你在提高數據集的性能的時候,能夠調優的最重要的參數之一。
  • 基於python+opencv的圖像目標區域自動提取
    檢測矩形並提取坐標需要對圖像進行預處理、邊緣檢測、提取輪廓、檢測凸包、角點檢測。閱讀過本文的人還看了以下文章:【全套視頻課】最全的目標檢測算法系列講解,通俗易懂!>《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch深度學習快速實戰入門《pytorch-handbook》【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow》《Python數據分析與挖掘實戰
  • 《全民超神》刺客型法師冥界之王使用技巧
    全民超神刺客型法師冥界之王有什麼技巧?全民超神刺客型法師冥界之王使用技巧。下面就和小編一起來看看吧。 全民超神刺客型法師冥界之王使用技巧,冥王操作難度相比其他英雄... 全民超神刺客型法師冥界之王怎麼使用?全民超神刺客型法師冥界之王有什麼技巧?全民超神刺客型法師冥界之王使用技巧。
  • 英雄聯盟手遊武器大師出裝、實戰技巧
    本期就給大家帶來LOL手遊武器大師的實戰攻略,包括出裝,以及對線技巧的介紹,下面一起來看看吧。 英雄聯盟手遊武器大師出裝、實戰技巧 ——————【裝備推薦】—————— 【三項】+【黑切】+【破敗】+【血手】+【藍盾】+【水銀系帶】 目前遊戲中由於沒有羊刀,所以武器大師的裝備選擇以三項黑切加破敗為輸出
  • 怎麼運營如何做好抖音漲粉引流短視頻新媒體直播電商帶貨營銷策劃變現推廣方案工作內容計劃書表新手乾貨玩法攻略技巧經驗心得分享合集
    企業品牌新媒體短視頻快手抖音小紅書微博公眾號內容種草運營策劃營銷推廣計劃宣傳方案如何從零怎麼學習技巧攻略乾貨按教程玩法新手合集MBA案例分析 | 從「發現全世界的好東西」到「標記我的生活」,你還依舊熱愛小紅書嗎?2021年頌缽工作坊 | 給你最具系統與科學的頌缽個案療愈新物種┃bosie:「無性別」服飾為啥爆火?
  • 縣防控指揮部開展大範圍核酸檢測採樣實戰演練
    為進一步提升我縣疫情防控應急處置能力,充分做好應對冬春季新冠肺炎疫情工作準備,22日上午,縣疫情防控指揮部在城東新區石震村開展大範圍核酸檢測採樣實戰演練。副縣長蔡暖心和相關單位、鎮區、衛生院負責人觀摩了演練。