Python影像辨識筆記(九之二):關於YOLOv3的一些心得

Image for post
Image for post

1.Windows環境中,使用純CPU訓練,defaults.py中的batch、epoch、learning rate(lr)都不可以調太高。(會因為記憶體不足而造成當機問題產生)

batch=1、epoch=1、learning rate=1e-4,電腦不會當機(CPU為i5-2400)#20190826-20:24更新
當機問題已經解決。
將width*heigth從608*608改成416*416,就可以提高batch size和epoch。yolo3.cfg檔案中,將width和height都調整成416defaults.py中的batch可以提高到8、epoch=4#20190827-19:48更新剛開始訓練時Learning rate可以大一點(0.1~0.01),後期Learning rate要小(如果出現loss NaN的話)loss產生NaN情形時,降低learning rate和batch size#20190827-19:52更新高學習率有較快的學習速度,但是準確度較低#20190918更新Jetson TX2訓練時,batch和epoch都可以提高到16,且不會當機

2.要使用GPU訓練時,最好用性能較高的顯示卡,網路上看到大多使用GTX1080 Ti在跑訓練(以我自己的電腦為例,GTX 750 Ti,都會出現GPU記憶體不足的錯誤情形)

使用Jetson TX2來訓練效果不錯

3.圖片的標記需要使用labelimg來進行標記,會產出xml檔案(VOC格式,需要將VOC格式的xml文件轉換成YOLO格式的txt文件),或txt檔案(YOLO格式)

!!!!非常重要!!!!
###在開啟labelimg標記前必須先將軟體所在資料夾中的
data/predefined_classes.txt修改成我們需要的名稱,否則後續的標記都是錯誤的
###標記完的.txt檔案要注意裡面的object-class為0才對(假設只有1個class的話)
!!!!非常重要!!!!
labelimg標記流程:(1)下載圖片
使用Python批次下載Google圖片
(2)開啟labelimg
選擇Open Dir,開啟圖片資料夾
選擇Change Save Dir,設定.txt檔案存檔的位置
使用快捷鍵進行標記:
W(產生框框,進行標記)
Ctrl+S(存檔)
D(下一張)
#如果無法使用快捷鍵,檢查是否切換到英文鍵盤(而不是注音)
#
無法開啟labelimg或者閃退嗎?
刪除C:\Users\yourUserName\當中的.labelImgSettings.pkl檔案,再重新開labelimg.exe
(3)完成後將原始圖檔和TXT文件重新命名使用Ant Renamer批量命名,檔名不能有空白或中文或特殊符號,可以用「File001.jpg、File001.txt」來命名。
(4)產生train.txt
快速在Windows中建立目錄中的所有檔案清單
透過上面連結中的方法來產生路徑檔案(list.txt),用Editor存成路徑檔案(train.txt)(不可用記事本存,在Linux上會有錯誤)(參考darknet yolov3 訓練時出現 Cannot load image 亂碼問題)
(5)將檔案傳輸至TX2上
這邊推薦使用Filezilla來進行檔案傳輸,方便目錄檔案管理

4.YOLO中的cfg設定要注意

本次訓練是由yolo2升級至yolo3,而yolo2和yolo3的參數filters參數的計算方式不同,v2的filters:5*(classes+5),而v3:3*(classes+5),通過修改以上參數後可以正常訓練。簡單來說v2就是(classes+5)*5;v3則是(classes+5)*3

5.一定要安裝Visual C++ 2015 build tools ,不然會有很多錯誤問題產生

6.路徑最好使用「絕對路徑」比較不會有錯誤產生

7.cfg參數調整:如果顯示卡記憶體太小,將random調整成0、subdivision調大

8.在上次的記憶點重新訓練(加上 -1 )

Windows:
python flow --model cfg/yolo3.cfg --load -1 --train --annotation train/annotations --dataset train/images
Linux(Ubuntu):
$ ./darknet detector train cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup

9.訓練好的Model怎麼進行預測

Windows:方法1

在darkflow資料夾中有一個ckpt資料夾,裡面有checkpoint和.meta和.profile檔。先產生.pb檔,再進行預測

python ./flow --model cfg/yolov2-tiny-test.cfg --load bin/yolov2-tiny.weights --savepb

python ./flow --pbLoad built_graph/yolov2-tiny-test.pb --metaLoad built_graph/yolov2-tiny-test.meta --imgdir sample_img/
方法2

直接用.cfg和.weights檔進行預測
python ./flow --model cfg/yolov2-tiny-test.cfg --load bin/yolov2-tiny.weights --imgdir sample_img/Linux(Ubuntu)(須將yolov3.cfg裡面的batch、subvision修改為1)
$ ./darknet detector test cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup data/bird.jpg
###cfg/voc.data很重要,沒有加入的話,會無法有正確的標記名稱

9.1偵測圖片和影片用的指令不同

如果要辨識影片的話,一定要有OpenCV(Makefile裡面的OPENCV=1)
並且指令要做一些修改:
#偵測影片
$ ./darknet detector demo cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup data/bird.mp4
#偵測圖片
$ ./darknet detector test cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup data/bird.jpg

9.2偵測影片時FPS太低怎麼辦

https://github.com/pjreddie/darknet/issues/80

1.使用tiny-yolo模型,訓練出來的FPS會比較高一點
2.降低yolov3.cfg的檔案中,width和height數值(降到288時,FPS提升到6.8左右)3.降低影片解析度
4.使用更好的顯示卡

10.每個不同的專案都有不同的理想參數值,必須自己去嘗試出來

11.只有1個label class很難看到正確的辨識結果(loss要到0.1甚至0.01)

自己測試的結果大約0.2~0.4之間就能預測出來了

12.無法產生標記框的解決方案

1.主因:labelimg在標記時產生錯誤,注意objet-class-id是不是0(如果只有一個class的話。如果有更多class,則從0,1,2,3,.....往上累積)。
在啟動labelimg軟體前,就把data/predefined_classes.txt文件修改成我們要標記的名稱,刪除其他不相關的class(並且使用code editor修改,而不是記事本)
2.嘗試Overfitting模型將會是一個看到bounding boxes的方法,可以試著調整learning rate和batch size3.降低threshold來看到bounding boxes,但是會有false positives產生
當獲得合理的辨識效果時,提高threshold值

13.該怎麼看訓練的log?

每個batch都會有這樣一個輸出:2706: 1.350835, 1.386559 avg, 0.001000 rate, 3.323842 seconds, 173184 images2706:batch是第幾組。1.350835:總損失1.386559 avg : 平均損失0.001000 rate:目前的學習率3.323842 seconds: 當前batch訓練所花的時間173184 images : 目前為止參與訓練的圖片總數 = 2706 * 64Region 82 Avg IOU: 0.798032, Class: 0.559781, Obj: 0.515851, No Obj: 0.006533, .5R: 1.000000, .75R: 1.000000,  count: 2Region Avg IOU:表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比.Class:標註物體分類的正確率,期望該值趨近於1。Obj:  越接近1越好。No Obj: 期望該值越來越小,但不為零。

count: count後的值是所有的當前subdivision圖片(本例中一共4張)中包含正樣本的圖片的數量。

14.更多結果請參考以下篇文章,都在持續更新中,本文也會同步更新。

Python影像辨識筆記(九):分別在Windows和Ubuntu 18.04上安裝並執行YOLOv3(使用GPU)Python影像辨識筆記(九之二):關於YOLOv3的一些心得Python影像辨識筆記(九之三):YOLOv3結合深度學習的Object DetectorPython影像辨識筆記(九之四):可視化YOLOv3訓練過程中的loss、IOU、avg Recall等的曲線圖Python影像辨識筆記(九之五):透過Google Colab在雲端運行YOLOv3Python影像辨識筆記(九之六):將LabelImg標記的xml檔案轉成txt檔案NVIDIA Jetson TX2學習筆記(三):執行YOLOv3The Complete YOLOv3 Reproduce List on GitHubUsing YOLOv3 Model in Python with ImageAI Library

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store