關於在windows上完成目標檢測模型Centernet 以及自己數據的訓練

關於在windows上完成目標檢測模型Centernet 以及自己數據的訓練

配置設置

最近在windows上覆現了centernet模型,跑通了demo,並對自己的數據進行了訓練,這裏對過程進行記錄。
配置:Windows 10,VS2015,Anaconda3.5.1,python3.6,torch1.1,Cuda10.0,Cudnn7.5。(VS2015和python3.6應該是對應torch1.1)可以直接下載whl文件進行本地安裝。文中涉及到的所有額外文件,包括安裝包,py文件,模型文件,需要替換的文件,我都將打包上傳。
模型:https://github.com/xingyizhou/CenterNet
將源碼下載之後保存到英文目錄下,因爲代碼中的cv2包的cv2.imread()只能從英文路徑中讀取文件,類似於:
在這裏插入圖片描述

模型復現/demo.py的運行

1

在命令行窗口中進入對應的源碼文件下,對requirements.txt內的包進行安裝:
pip install -r requirements.txt
在這裏插入圖片描述

2 編譯DCNv2文件

(1)下載 https://github.com/CharlesShang/DCNv2 內的源碼,然後將DCNv2文件夾替換CenterNet\src\lib\models\networks\DCNv2文件夾
(2)修改 DCN文件2\src\cuda\dcn_v2_cuda.cu:
//extern THCState *state; // 註釋該行
THCState *state = at::globalContext().lazyInitCUDA(); // 添加該行
(3)編譯
進入 CenterNet\src\lib\models\networks\DCNv2文件夾下,
打開make.sh,在該路徑下運行該文件內的指令:

python setup.py build develop

3 編譯NMS

(1)在命令行窗口中:cd CenterNet\src\lib\external
然後註釋setup.py文件中該行代碼:
#extra_compile_args=["-Wno-cpp", “-Wno-unused-function”]
主要原因是因爲源碼是針對ubuntu系統的,在windows上不兼容
(2)運行

python setup.py build_ext –inplace

4 測試

測試上通常在cmd窗口上測試,如果想在編譯器(Syder)上直接測試,需要把opt.py中的默認項更改爲自己想要的,同時把task項改爲—task:
在這裏插入圖片描述
在命令行中的輸入則爲:
python demo.py ctdet --demo …/images/ --load_model …/models/ctdet_coco_dla_2x.pth
其中載入的模型和參數需要提前下載
dla34-ba72cf86.pth 置於C:\Users\Liuzp.cache\torch\checkpoints內
ctdet_coco_dla_2x.pth 置於F:\WORK\CenterNet\CenterNet\models 內

訓練自己的數據

1 準備數據集

如果數據集的文件爲圖片,建議先將圖片製作爲VOC格式的數據,然後再將其轉換爲COCO格式的數據。
(1)首先將所有的圖片(不同類別、用於測試、訓練的圖片)都置於同一個文件夾下,在CenterNet\data\ 下新建一個文件夾,我這裏命名爲signal,然後包含兩個文件夾:annotations 和images。其中images下放置圖片,且圖片尺寸保持一致。(不需要根據圖片現有尺寸對代碼中的resolution進行更改,否則報錯)
(2)利用labelImg軟件對圖片進行標註,標註好類別,比如我這裏有五個標籤,對應五個類別,生成對應的xml文件,存到annotations文件夾下,方面調用
(3)將xml文件轉化爲json文件,只需將voc2coco2.py文件中的classes修改爲自己的類別,並設置好訓練文件與驗證文件的比例train_ratio與val_ratio即可。運行voc2coco2.py,即可完成xml文件到coco格式數據的轉換,並把生成的json文件放在annotations文件夾下,分別是
train_sig.json、test_sig.json、val_sig.json。
(4)運行calculatestd.py對images文件夾下的圖片進行RGB通道上均值和方差的計算。

2 修改配置信息

(1)到src/lib/datasets/dataset目錄下,複製coco.py文件,並重命名爲signal.py
14行 numclasses=5
16 行 mean和std修改爲1.4中的計算結果
22行 super(signal, self).init()
23行修改數據讀取路徑,讀取CenterNet/data/signal文件下圖片
self.data_dir = os.path.join(opt.data_dir, ‘signal’)
self.img_dir = os.path.join(self.data_dir, ‘images’)
25行起,修改讀取的json文件名,並添加test情況下的讀取:
在這裏插入圖片描述
44行 修改class_name和valid_ids
在這裏插入圖片描述
(2)修改將數據集加入src/lib/datasets/dataset_factory裏面
在這裏插入圖片描述
(3)在/src/lib/opts.py文件中修改默認的dataset和exp_id(輸出用)
在這裏插入圖片描述
第28行,修改load_model的默認路徑:
在這裏插入圖片描述
這裏可以直接載入model文件夾中下載好的ctdet_coco_dla_2x.pth
第39行,修改num_workers的default=0

修改ctdet任務使用的默認數據集爲新添加的數據集,如下(修改分辨率,類別數,均值,標準差,數據集名字):
第336行,改下ctdet的init初始化信息。
在這裏插入圖片描述
(4)修改src/lib/utils/debugger.py文件(變成自己數據的類別和名字,前後數據集名字一定保持一致)
45行下方加入
elif num_classes == 5 or dataset == ‘signal’:

460行加入檢測的類別數,我的爲
signal_class_name =[‘LFM’,‘EQFM’,‘SFM’,‘FRANK’,‘BARKER’]

3 訓練數據

在./src/目錄下,運行main.py文件,
python main.py ctdet
如果出現out of memory, 可以調小opt.py中的batch_size
訓練完成後會生成log和模型文件如下:

在這裏插入圖片描述
如果想繼續訓練,就更改opt.py中的load_model默認路徑,載入想要繼續訓練的模型,然後執行

python main.py ctdet --resume

4 測試和驗證模型

(1)測試模型
利用之前生成的test_sig.json文件與model_best進行測試,在\CenterNet\src\路徑下運行test.py文件

python test.py --not_prefetch_test ctdet 
 --load_model ../CenterNet/exp/ctdet/originalsignal/model_best.pth

(2)驗證模型
驗證模型就是利用demo.py對images文件夾下的圖片或視頻進行測試
python demo.py ctdet --demo …/images/signal1.jpg
–load_model …/CenterNet/exp/ctdet/originalsignal/model_best.pth
帶數據增強驗證則加上

--flip_test (翻轉測試)
--test_scales 0.5, 0.75, 1, 1.25, 1.5(可以在opt.py中對其默認設置進行更改)

如果需要保存你的預測結果,可以到/CenterNet/src/lib/detecors/ctdet.py下,在show_results函數中的末尾加入這句:

debugger.save_all_imgs(path='/CenterNet-master/outputs', genID=True)

有什麼問題大家可以關注我並留言,我會給大家回覆
上傳的資源還在審覈中,通過審覈後我會在評論中給出下載鏈接
附加文件

發佈了7 篇原創文章 · 獲贊 41 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章