程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

基於Python實現的鋼筋數量識別

編輯:Python

資源下載地址:https://download.csdn.net/download/sheziqiong/85749883
資源下載地址:https://download.csdn.net/download/sheziqiong/85749883

提高精度

  • 這部分主要從數據、先驗框(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,326

  • 既有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(特征金字塔)可以通過特征圖的跨層concat這樣的操作,來使得每一層預測所用的feature map都融合了不同深度的語義特征,增強檢測效果。在YOLO v3中只是使用相鄰兩層的特征層進行融合,我發現很多邊緣的鋼筋沒有得到很好的檢測,我的其中一個猜測是特征融合得不夠好,所以我將52×52的預測分支(三個預測分支中對應檢測小物體的分支)進行了特征大融合,手動將其改成3個預測分支的融合,試驗後發現效果有提升,但是整體不穩定,在後面就把代碼改回來了,但是後面發現那一次提交的結果就是最高的==
  • 這裡還有一點就是在本場景下只是對多目標單類別的檢測,作為僅有的一個類別鋼筋並不具有很強的語義信息,所以我覺得可能並不需要像YOLO一樣用那麼深FPN,這裡可以考慮把最深的FPN換成一個更淺的FPN進行融合,效果應該有提升。

空洞卷積

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

多尺度訓練

  • 模型的訓練我們采用多尺度圖片輸入進行訓練,來使得模型具有尺度的魯棒性,這裡要提一點,如果是通過每次輸入圖片的時候來隨機選擇尺度方式輸入(即YunYang代碼中的方式)來多尺度訓練,訓練中的loss容易出現nan,為了避免這個問題可以在每個batch之間隨機選擇尺度而不是每個batch內來隨機選擇尺度。

背景錯檢

  • 測試樣本中出現了許多背景樣本錯撿的問題,我們自然而然會想到Focal loss,我們知道Focal loss有兩個參數 α γ \alpha \gamma αγ,其中 γ \gamma γ固定為2不用調,主要是調整 α \alpha α,但在試驗中我發現無論怎麼調這個參數,最後訓練的時候雖然收斂的速度加快許多,但是檢測的效果都沒有變好,這和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,但把其中的參數 σ \sigma σ從0.1試0.7,效果都非常不好,我們具體來看效果圖:

資源下載地址:https://download.csdn.net/download/sheziqiong/85749883
資源下載地址:https://download.csdn.net/download/sheziqiong/85749883


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved