時隔好多好多日子了,一直沒寫博客(小聲bb,最近忙着接私活兒)。馬上就要開學了,害,回去就要加油幹了!!!
本次教程寫個pytorch版本的yolov3檢測,用的火焰檢測數據集,效果如下:
這就可以做個火警預測了,yolov3是真的香呀,這次用到的是github 的一個pytorch實現版本,效果上還是不錯的。
那麼, 接下來,就跟我一起來實操起來吧!!!
一、環境要求
老規矩,工欲善其事必先利其器,搭建環境!!
- Python: 3.7.4
- Tensorflow-GPU 1.14.0
- Keras: 2.2.4
- numpy:1.17.4
這裏建議用anaconda來快速搭建一個虛擬環境,速度很快的!!!
二、數據集準備
從互聯網上收集火焰圖片,並用labelimg進行標註,得到標註圖片以及標註的位置信息。
如下:
萬事俱備,開始coding!!!!
三、Pytorch版本的YoloV3
1.安裝模塊
在requirements.txt
中含有本次所需的python模塊.
- numpy
- torch==1.2.0
- torchvision==0.4.0
- matplotlib
- tensorflow==1.13.2
- tensorboardX==2.0
- terminaltables
- pillow
- tqdm
可用pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
來安裝所需的模塊。
2.下載所需的權重文件
Linux平臺下,cd weights/
,之後運行bash download_weights.sh
文件,即可下載所需的權重信息。
Windows平臺下,可直接編輯download_weigths.sh文件,複製其中的模型鏈接,在遊覽器中打開下載。
下載完畢後,在weights文件的內容如下:
3.修改配置文件
Linux平臺下,運行cd config/
目錄,之後運行 bash create_custom_model.sh <num-classes>
其中 爲類別參數,根據你的需要修改,這裏我修改爲1.
Windows平臺下,配置git的bin目錄下的變量之後,運行sh.exe文件。之後cd config
目錄之後,運行sh create_custom_model.sh <num-classes>
即可
執行完畢之後,修改custom.data,修改其配置信息即可。
4.配置本次yolov3的數據格式
重點來了,重點來了,重點來了!!!
在該github下,對自定義的數據,並未闡述,只是一筆帶過。但該yolov3的版本所需的數據格式跟voc格式和coco格式都不大一樣。每張圖片對應一個txt標註信息。其第一列爲類別信息,之後的四列爲標準化的標註信息。其中 label 是類別在 data/custom/classes.names 的索引, <> 代表縮放後的比例係數
- <1>*w = (xmax-xmin)/2 + xmin
- <2>*h = (ymax-ymin)/2 + ymin
- <3> = (xmax-xmin)/w
- <4> = (ymax-ymin)/h
這裏github未提供數據轉換,這裏先新建兩個Annotations和JPEGImages的文件夾,將準備好的圖片和xml標記信息放於其中。
然後運行voc2yolov3
文件,生成train.txt
和valid.txt
文件信息,將數據集劃分,即將圖片路徑保存在兩個txt文件中。
之後運行voc_annotation.py
對xml標記信息進行處理,處理成下列的txt文件形式
並記得修改classes.names的類別名,以及將圖片複製到images文件中。即
好了,數據格式製作完成了!!!
下面可以開始訓練了.
5.運行train.py
# 訓練命令
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights weights/darknet53.conv.74
# 添加其他參數請見 train.py 文件
# 從中斷的地方開始訓練
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights checkpoints/yolov3_ckpt_99.pth --epoch
若出現警告解決方案UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead.
在 model.py
計算損失的位置 大概在 192 行左右添加以下兩句:
obj_mask=obj_mask.bool() # convert int8 to bool
noobj_mask=noobj_mask.bool() #convert int8 to bool
運行過程如圖所示:
可通過tensorboard來查看運行過程中的變化。tensorboard --logdir='logs\'
6.測試結果
叮咚,叮咚,馬上大功告成了!!!
python detect.py --image_folder data/imgs/ --weights_path checkpoints/yolov3_ckpt_99.pth --model_def config/yolov3-custom.cfg --class_path data/custom/classes.names
運行上述,其會對data/imgs 文件下的圖片進行預測,並將預測結果保存到output/imgs文件下
若是在 GPU 的電腦上訓練,在 CPU 的電腦上預測,則需要修改 model.load_state_dict(torch.load(opt.weights_path, map_location='cpu'))
好了,大功告成了!!! 立下flag!!! 明天再更一個!!!