用CenterNet對旋轉目標進行檢測


不是大叔 我愛計算機視覺 前天

本文轉載自知乎,已獲作者授權轉載,請勿二次轉載。

https://zhuanlan.zhihu.com/p/315511581

前言

  1. 前段時間純粹為了論文湊字數做的一個工作,本文不對CenterNet原理進行詳細解讀,如果你對CenterNet原理不了解,建議簡單讀一下原論文然后對照本文代碼理解(對原版CenterNet目標檢測代碼進行了極大程度精簡)。

     

  2. 基本想法就是直接修改CenterNet的head部分,但是是直接在長寬圖上加一層通道表示角度,還是多引出一 路feature-map呢?實測是多引出一張feature map比較好,直接在長寬圖上加一層通道很難收斂,具體原因我也是猜測,角度和尺度特征基本無共享特征,且會相互干擾(角度發生些許變化,目標的長寬可能就變了,如果角度是錯的,長寬本來是對的呢?反之亦然)引出的feature-map只經歷了一層卷積層就開始計算loss,對於這種復雜的關系表征能力不夠,可能造成弄巧成拙。網絡結構如下:

代碼

代碼主要分為五個部分:

  • train.py:模型的訓練

  • predict.py:模型的前向推理

  • backbone:模型的主干網,給了DLA和ResNet的DCN與普通版本,層數可以自定義

  • loss.py:模型的損失函數

  • dataset.py:模型的數據處理

不是很重要:

  • data/airplane:示例訓練數據與圖片

  • dcn:編譯好的dcn,說明一下,這里與原版CenterNet編譯dcn一樣,直接文件夾復制過來即可,如果你不會編譯dcn,就用backbone內的dlanet.py與resnet.py

  1. 原版CenterNet代碼較多,我只需要做目標檢測,所以把各種3D檢測等都刪了,模型架構也拆了只保留了有用部分,方便自己閱讀以及魔改。

     

  2. 其次,因為只是加了一個角度檢測,所以主要是修改了一下數據處理部分,用的還是VOC格式,只是在.josn文件里面加了一個角度信息,打標簽的時候用[0,π]表示,后續在loss內添加了角度的feature-map損失,用的Smooth-L1 loss,打標簽方法已在下方更新。

2020.1021代碼已更新(不是很重要)

  • labelGenerator:生成自己的訓練數據

  • evaluation.py:性能指標計算

  • imgs:性能指標計算示例圖片

  1. 鑒於一些同學想知道怎么對自己的數據打標簽以及生成R-CenterNet可以訓練的數據,所以更新一個labelGenerator文件夾,內包含轉換函數以及用例。注意,這個文件夾以及其內部函數不是網絡必須的,只是想訓練自己打標簽的數據時用的。

     

  2. 鑒於一些同學想知道模型訓練完畢,怎么對比性能,比如旋轉框怎么計算mIOU等,所以更新一個evaluation.py以及對應的案例圖片和文件夾imgs。注意,這個.py和imgs文件夾不是必須的,只是模型訓練結束計算性能用的。

Demo

 

訓練自己的多分類網絡

  • 理論上torch >1.0即可,如果報了顯存不足的問題就是torch版本低了

  • 打標簽用labelGenerator文件夾里面的代碼

  • 修改代碼中所有num_classes為你的類別數目

  • 增加predict.py中方框顏色,我這里只檢測單目標,所以只有紅藍框。

  • 修改back_bone中hm的數目為你的類別數,如:

 

  •  
def DlaNet(num_layers=34, heads = {'hm': your classes num, 'wh': 2, 'ang':1, 'reg': 2}, head_conv=256, plot=False):

最后,有問題可以去github上看一下issue,或者私信留言。

后續有時間會將上面的工作工程化,用C++落地。

 

代碼地址:

https://github.com/ZeroE04/R-CenterNet

 

備注:目標檢測


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM