YOLO v3實戰之鋼筋智能識別改進方案分享(二)

最後本方案線上取得的最高F1 score爲0.98336,做爲one-stage算法來講算是還能夠,因爲不少參數只是粗調,預計還能有千分位的提升,感興趣的讀者能夠自行嘗試,接下來分享一下我在這個場景下關於YOLO v3的改進方案。node

先上分數(排名僅是復活賽排名,無實際意義):git

代碼已上傳至:https://github.com/cristianoc20/Rebar_Detection,歡迎各位給個stargithub

目錄

  • 評判標準
  • 提升精度
  • 提升速度

評判標準

  • 本次比賽採起的評分方式就是常規的F1 score,但其中有一點不同,咱們來看:
  • 本次結果要求 IOU要>0.7纔算是檢測正確,這對於自己檢測精度就沒那麼高的YOLO提出了更高的要求,其次的話就是要把握好召回率和準確率之間的平衡,能夠說解決YOLO定位精度不高和召回率不足的問題是此次的關鍵。

提升精度

  • 這部分主要從 數據、先驗框(anchor box)、模型三方面入手改進。

數據改進

幾何數據加強

  • 咱們知道此次的訓練數據只有250張,因此數據加強是必定要的,看了一下測試集以後以爲用普通的幾何加強手段足以,具體用了 隨機水平翻轉,隨機裁剪,隨機旋轉這些方式就很少說了。

mix-up加強

  • 這裏要提一點就是後期分析錯誤的時候發現了某些困難樣本很難識別,嘗試了mix-up加強的方法從數據入手改善,mix-up簡單來講就是 圖片的加權和,能夠看下圖:
  • 可是在本場景使用mix-up後由於整個場景背景較爲複雜, 兩個複雜圖片的疊加使得不少有效信息得不到很好的表達,模型的表現沒有獲得提升

填鴨式加強

  • 這個叫法是以前看各類kaggle大佬分享方案的時候看到的,具體的原理就是 將一些目標(特別是後期分析檢測效果差的)扣出來,放到沒有目標的圖上去,增長圖像的魯棒性。後面分析錯誤的時候我發現有一些在鋼筋上的石頭就被誤判成鋼筋,以爲使用填鴨式加強應該能夠改善這個問題,但由於時間問題以及這個方法感受太過手動就沒有嘗試,感受應該是有效的。

先驗框(anchor box)改進

  • 咱們知道YOLO是基於anchor box來預測偏移,那anchor box的size就很重要,咱們先可視化一下鋼筋框的長寬(歸一化後):
  • 咱們能夠看到基本上是1:1,咱們再看看YOLO v3的anchor box:

10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326web

  • 既有1:1也有1:2,但這是否意味着咱們就不須要1:2?因而我一開始把他們稍微都改爲1:1(手動),發現通常的鋼筋檢測效果確實變好了,可是不少遮擋的鋼筋(非1:1比例)檢測效果就變差了,因此手動修改比例是不可行的。
  • 那若是咱們使用 kmeans來聚類生成咱們的anchor box呢?咱們來可視化一下(這裏和原版同樣也選擇了9個聚類中心):
  • 感受9個聚類確實有點強行,可是同時mean iou能夠達到0.8793,實際上可能6個聚類中心甚至3個聚類中心就已經足夠,可是在試驗中發現使用聚類以後的anchor box效果卻比原版在coco上聚類獲得的anchor box效果要差,這裏猜想跟muti_scale多尺度訓練有關係,不過因爲原本框的檢測效果也不錯,因此就放棄了修改anchor box的想法,若是有懂的朋友還但願指點一二。

模型改進

FPN(feature pyramid networks)

FPN
  • 咱們知道 FPN(特徵金字塔能夠經過 特徵圖的跨層concat這樣的操做,來使得每一層預測所用的feature map都融合了不一樣深度的語義特徵,加強檢測效果。在YOLO v3中只是使用相鄰兩層的特徵層進行融合,我發現不少邊緣的鋼筋沒有獲得很好的檢測,個人其中一個猜想是特徵融合得不夠好,因此我將 52×52的預測分支(三個預測分支中對應檢測小物體的分支)進行了特徵大融合,手動將其改爲3個預測分支的融合,試驗後發現效果有提高,可是總體不穩定,在後面就把代碼改回來了,可是後面發現那一次提交的結果就是最高的==
  • 這裏還有一點就是在本場景下只是對多目標單類別的檢測,做爲僅有的一個類別鋼筋並不具備很強的語義信息,因此我以爲可能並不須要像YOLO同樣用那麼深FPN,這裏能夠考慮 把最深的FPN換成一個更淺的FPN進行融合,效果應該有提高。

空洞卷積

  • 前面有提到不少處於圖片較邊緣的鋼筋沒有獲得很好的檢測,後面總結的時候以爲和 從darknet輸出的感覺野(ROI)比較小有關,以爲能夠在darknet最後一層加一個空洞卷積來擴大感覺野,空洞卷積簡單來講就是經過增長計算的範圍來增長感覺野,這個後面會寫篇文章介紹,這個由於是比較後面想到的就沒有嘗試,讀者感興趣能夠試試。

多尺度訓練

  • 模型的訓練咱們採用多尺度圖片輸入進行訓練,來使得模型具備尺度的魯棒性,這裏要提一點,若是是經過每次輸入圖片的時候來隨機選擇尺度方式輸入(即YunYang代碼中的方式)來多尺度訓練,訓練中的loss容易出現nan,爲了不這個問題能夠在每一個batch之間隨機選擇尺度而不是每一個batch內來隨機選擇尺度。

背景錯檢

  • 測試樣本中出現了許多背景樣本錯撿的問題,咱們天然而然會想到 Focal loss,咱們知道Focal loss有兩個參數 ,其中 固定爲2不用調,主要是調整 ,但在試驗中我發現不管怎麼調這個參數,最後訓練的時候雖然收斂的速度加快許多,可是檢測的效果都沒有變好,這和YOLO論文中做者說加了Focal loss不work同樣,後面想了好久才明白:咱們知道YOLO對物體的判斷有三種:正例,負例和忽視,與ground truth的iou超過0.5就會被認爲ignore,咱們用YOLO v1的一張圖來講明:
  • 咱們知道整個紅色框都是這隻狗, 但在紅色框內的網格並不都與這隻狗的gound truth的IOU超過0.5,這就讓一些原本應該忽視的樣本變成了負例,加入了咱們Focal Loss的「困難樣本集」,形成了label noise,讓使用了Focal loss以後模型的表現變差。要解決這一點很簡單,將ignore的閾值從0.5調至0.1或0.2,表現立刻就提高了。(減小了不少背景錯撿,但由於閾值調低的緣由多了不少框,這個能夠經過後期對分數閾值的控制來消除,由於那些框基本都是低分框)

soft-nms

  • 不少人看到此次這麼密集的目標檢測確定會想到使用soft-nms替代nms,這個在以前講解YOLO v3的文章也有提到,具體來講就是不要直接刪除全部IoU大於閾值的框,由於在密集物體的檢測中會出現誤刪的狀況,而是下降其置信度。算法

  • 我使用高斯加權方式的soft-nms替代普通的nms,但把其中的參數 從0.1試0.7,效果都很是很差,咱們具體來看效果圖:微信



  • 咱們本來的預期是會多出不少框,而後咱們能夠經過 置信度的方式篩選掉他們,可是結果確是一些很是高置信度周圍的框就算使用最高的懲罰比例(即 取到很大)他們被懲罰後的置信度仍然不算低,有些甚至還有0.6左右和自己低分但正確的框有一樣的置信度,這讓本來打算經過置信度來篩選框的辦法失去意義,不知道是我使用方式有誤仍是怎麼的,嘗試事後就放棄了soft-nms。

超參數調整

  1. max_bbox_per_scale:這個參數表明每一個尺寸容許預測多少個box,初步估計每一個圖平均會有兩百左右個Box,YunYang中只容許每一個尺寸預測150個box,將這個參數適當調大後有萬分位的提高,但參數過大以後性能反而下降,這個就本身衡量了。
  2. score_threshold:這個參數用於篩選低置信度的框,這裏要注意的是不要每次都用肉眼判斷效果,不要肉眼看到邊緣錯撿少了就效果好,還應該輸出一下總檢驗框數,以此次的測試集爲例,25300到25600之間纔是一個正常範圍。
  3. iou_threshold:這裏即指的是nms中的iou_threshold也指ignore的閾值,要注意的事項和第二點同樣,就很少贅述了。
  4. warmup學習率,遷移學習這些基本操做這裏也很少說了,你們知道就行。

提升速度

  • 這兩週一直在專一精度的提高,因此速度這裏就單純提一些方案供你們參考,後面可能會出一些相關文章。

更換backbone

  • 咱們知道YOLO v3的backbone是darknet53,雖然darknet53計算速度比ResNet-152和ResNet-101快,精度也不差,但在一些追求輕量級的工業場景咱們能夠將其替換爲例如Mobilenetv2這樣的輕量級backbone。

模型剪枝、量化、知識蒸餾

  • 模型的剪枝、量化甚至知識蒸餾都是常規的壓縮模型的手段,若是對速度有追求的話均可以嘗試。


本文分享自微信公衆號 - 計算機視覺漫談()。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。app

相關文章
相關標籤/搜索