使用 YOLOv3 訓練及預測自己的圖檔

動機:想要玩 Darknet(YOLOv3) 來 訓練/預測 自己的圖片,要如何做呢?!

準備環境
1.Ubuntu 18.04
2.Anaconda 2020.02 for Linux (Python 3.7)
3.Darknet
4.OpenCV 3.4.9
5.CUDA 10.0
6.Geforce GTX 1080 Ti * 2

實作步驟
1.建立工作目錄: 先建立一個主要的目錄外加四個子目錄,如下圖:
2.建立分類: 依照類別(label)建立文字檔,並命名為 drug_voc.names,存放在 drug_detect 目錄內,如下:
https://gist.github.com/dvsseed/c5c21a16cec29764b9c0d6f58f97dc20
3.圖檔命名: 整理自己的圖檔,並按照上述第2.項的類別流水號 ( 示範格式: 類別流水號_類別名稱_圖檔流水號.jpg ),存放在 JPEGImages 子目錄內,如下:
4.圖檔標註: 這裡筆者喜歡在 Windows 10 內操作,先下載 labelImg v1.8.1 (https://github.com/tzutalin/labelImg/files/2638199/windows_v1.8.1.zip),安裝完成後執行 labelImg.exe 操作功能如下:

  • 按左方 Open Dir 並選擇 JPEGImages 子目錄
  • 按下 Change Save Dir 並選擇 Annotations 子目錄
  • save format 預設為 PascalVOC 不用變
開始一個一個圖檔標註,使用 快捷鍵 如下:

  • W (產生方框,進行標記)
  • Ctrl+S (存檔,請輸入上述第2.項的類別名稱)
  • D (下一張)

5.整理 train、val 圖檔名稱檔: 利用指令 ( $ ls -d JPEGImages/* > train.txt ) 將所有的圖檔名稱輸入至文字檔,再利用 Editor 編輯並按比例 80/20 將 80% 存成 train.txt20% 存成 val.txt
6.產生 train、val 文字檔: 利用 python 程式碼來生成 drug_train.txt 及 drug_val.txt 並將 PascalVOC (.xml) 轉換成 YOLO (.txt),如下:
https://gist.github.com/dvsseed/e34a8241cd5059e83bad0abb16609ede
直接執行指令 ( $ python voc_label.py )
7.製作 drug_voc.data 文字檔: 利用 Editor 編輯產生,存放於 drug_detect 目錄內,內容如下:
https://gist.github.com/dvsseed/29e8d1f81aae033b197223220d3bd9e6
8.製作 yolov3-voc.cfg 參數檔: 利用 Editor 編輯產生,存放於 drug_detect 目錄內,內容如下:
https://gist.github.com/dvsseed/ad718262f026462438c8891d72eafa40
這個部分的重點是要根據 GPU 的 RAM來控制 batchsubdivisions 的值,也要根據類別數量來改 classes 的值及計算出 filters [=(classes + 5) * 3]
9.下載 YOLO Pre-trained Convolutional Weights,並存放於 darknet 目錄內,指令如下:
$ wget https://pjreddie.com/media/files/darknet53.conv.74
10.執行訓練,並保存LOG到.txt文件,指令如下:
$ ./darknet detector train drug_detect/drug_voc.data drug_detect/yolov3-voc.cfg darknet53.conv.74 -gpus 1 | tee -a train_drug_record.txt
經過12個小時的等待後~~~
11.使用訓練好的模型進行預測(須修改 yolov3-voc.cfg 裡面的 batch=1subvision=1)
$ ./darknet detector test drug_detect/drug_voc.data drug_detect/yolov3-voc.cfg drug_detect/backup/yolov3-voc.backup drug_detect/JPEGImages/0_Binin-U_0.jpg
顯示預測結果如下圖

心得:首先要感謝 labelImg 的作者(Tzuta Lin)及 Yanwei Liu 的網文(如參攷 1.),讓筆者省下了不少的摸索時間,更要大大的感謝 Darknet 的大神 Joseph Redmon,讓我們受惠及學習到這麼多!!


參攷
2.【AI_Column】如何以YOLOv3訓練自己的資料集 ─ 以小蕃茄為例, https://makerpro.cc/2019/12/train-your-dataset-with-yolov3/
4.DarkNet-YOLOv3 训练自己的数据集 Ubuntu16.04+cuda8.0, https://zhuanlan.zhihu.com/p/35490655

留言