YOLO v2 環境建置與操作
* 在 Windows 下工具讀取 Linux 檔案的工具:Ext2Fsd
訓練環境的比較
若使用 NVIDIA GTX 1080Ti 進行訓練,標準 YOLO 架構 40,000 次迭代,大約耗時兩個整天。
若使用 Tiny YOLO 進行訓練,67 個鐘頭可約訓練 100,000 次迭代。
訓練資料集準備
資料集準備與YOLO v1 藥品辨識訓練文件中是相同的,擷取如下:
不管你原本把 darknet 資料夾放在哪兒
請先將 darknet 資料夾移到 /home 目錄下!
VOCdevkit
首先,請下載 voc_label.py 這個檔案在 /home 目錄下。
我們必須將所有分類的標籤(以 21 種藥品為例)放在
class
陣列當中:classes = ["Amlodipine_Atorvastatin", "Aprovel_300mg", "Buscopan_10mg" , "Celecoxib_200mg", "Coaprovel", "Defense_f_c_tab", "Dipyridamole_25mg", "Dulcolax_5mg", "Ethambutol_HCL_400mg", "Famotidine_20mg", "Folinate_15mg", "Irbesartan", "Irbesartan_Hydr", "Mebeverine_HCL_100mg", "Nicametate_Citrate_50mg", "Sinbaby_120gm", "'Tegafur_Uracil", "Theophylline_Anhydrous_250mg", "Theophylline_Anhydrous_125mg", "Trospium_chloride_10mg", "Ursodeoxycholic_acid"]
如果我有一大堆用類別名稱命名的資料夾,如何快速產生這樣的標籤呢?
請參考這裡的 Windows 技巧,產生 TXT 檔後要注意:要刪掉「XXX.bat」與「list.txt」這兩行,因為他們不是我們要訓練的類別;刪掉後使用 Word 之類的工具,將「換行」取代為「", "」,並在第一行的開頭補上一個「"」。
建立路徑
接著,我們要開始蓋一堆東西(懶人包在這兒):
在 /home 目錄下建立名為
VOCdevkit
的目錄。在
VOCdevkit
目錄中,建立名為VOC2012
的目錄。在
VOC2012
目錄中,建立Annotations
、ImageSets
、JPEGImages
三個目錄。在
Annotations
目錄中,放入藥品的所有.xml
檔案。在
ImageSets
目錄中,建立Main
目錄,並在Main
目錄中放入trainval.txt
檔案(內容是從數字 1 開始,一路排到與訓練圖數量相同的數字 n 的檔案;請參考這兒的方法四)。在
JPEGImages
目錄中,放入作為訓練樣本的 n 張圖片(.jpg)。完成後,就可以在 /home 目錄下,執行 voc_label.py 檔案:
python voc_label.py
執行後,會在
/home
目錄下出現2012_trainval.txt
檔案(裡面包含了所有訓練圖庫的路徑),並在/home/ee303/VOCdevkit/VOC2012/
目錄下建立 labels 資料夾,裡面包含 n 筆.txt
的檔案。
訓練環境準備
在 YOLO v2 的環境建置中,有大幅的修改與簡化步驟。當我們準備好與 YOLO v1 相同的訓練資料集VOCdevkit
後:
下載此 YOLO v2 的深度學習架構包。
~/cfg/yolo-drug.cfg - 修改 classes 數量、修改最下面的 filter = (classes + 5) * 5。
~/cfg/voc-drug.data - 修改 classes 數量、train.txt 的檔案路徑、test.txt 的檔案路徑、.names 檔案路徑、backup 的資料夾路徑。
~/data/voc_drug.names - 放入所有藥品的名稱,以「換行」分類。
~/src/detector.c - 修改所有你看得到的路徑與最下方的 classes 數量。
~/train.txt - 修改為訓練照片的路徑。
~/test.txt - 修改為測試照片的路徑。
設定完成後記得在 darknet 目錄下使用make
指令重新編譯。
系統指令
深度學習訓練:
./darknet detector train cfg/voc-drug.data cfg/yolo-drug.cfg
(這已在 Jetson 上實作,別在桌機實作)搭配傳統影像處理的實時藥物辨識:
./darknet detector drug_test cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights /home/ee303/darknet_drug_200/Combine_result/
(Step 2. 分類)根據 test.txt 進行藥物識別,在 test_all 資料夾中輸出一堆測試結果的 TXT 檔:
./darknet detector test_all cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights test_all/
隨後再用 testall.py 檔案來分析資料夾中的所有 TXT 檔,並輸出評估結果。
(Step 1. 偵測,在 darknet_detection 中)大量測試 multi_test 資料夾中的藥物照片:
框選與辨識結果將存檔於 multi_test/result 資料夾中;而裁減出來的藥物區域,將放在 multi_test/cut 當中。
(要修改 detector.c 中 multi_test 函式的 for 迴圈藥物數量;目前仍有 killed 問題,需要清理使用free
指令記憶體)
./darknet detector multi_test cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights multi_test/
下面是幾乎不會用到的...
傳統辨識(測試單張圖片,輸出圖片):
./darknet detector test cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights /home/ee303/Combine_result/result.png
Recall 測試:
./darknet detector recall cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights
Validate 測試:
./darknet detector valid cfg/voc-drug.data cfg/yolo-drug.cfg backup/yolo-drug_final.weights
特殊用途註解
- 若想在實時藥物辨識時,關閉 "Cannot load image" 的訊息,請到 ~/src/image.c,找到
image load_image_cv
函式。 - 因為我們訓練或辨識的圖片可能是 .png 檔,與 YOLO 系統預設的 .jpg 並不相同,因此我們必須在
validate_detector_recall
函式中找到find_replace
區塊,加上find_replace(labelpath, ".png", ".txt", labelpath);
指令,程式才能找到對應的 .png 與 .txt 檔。