YOLOv3訓練實踐(把代碼整合一下,寫個直接xml到txt的代碼,xml到csv,xml到record的代碼 留坑)

1.準備數據集

1.找足夠多的圖片。

2.下載labelImg軟件,網址https://tzutalin.github.io/labelImg/,需要翻牆。下載windows最新版。

win10,第一次運行labelImg沒毛病,之後再打開的時候,exe窗口總是一閃而過,重啓電腦,重下軟件都沒用。

win+R,輸入cmd,命令行運行exe文件,出現以下錯誤:

Traceback (most recent call last):
  File "<string>", line 1453, in <module>
  File "<string>", line 1449, in main
  File "<string>", line 1442, in get_main_app
  File "<string>", line 98, in __init__
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\libs.settings", line 33, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 1378, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 858, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 880, in load_eof
EOFError

解決辦法:

進入C:/Users/your_account(你自己的賬戶名)文件,在裏面找到.labelImgSettings.pkl文件並刪除,之後再運行exe文件就沒問題啦。

參考https://github.com/tzutalin/labelImg/issues/221,真的非常感謝了,困擾了好久。

3.下載之後解壓,點擊labelImg.exe便可用。點擊左側Open,打開圖片,按快捷鍵w,即可進行標定,保存的時候選擇xml文件存儲路徑。

4.新建文件夾VOC(名稱任意),在VOC下新建xml、Image兩個文件夾(對應代碼裏的名稱)。將標定得到的xml文件都放入xml文件中,所有圖片放入Image文件中。

代碼Getdata中traindata.py與trans.py。將兩個py文件放入VOC文件夾下。運行traindata.py,可以得到trainImage,validateImage,trainImageXML,validateImageXML四個文件夾,分別存放訓練、測試用的圖片與xml,圖片會被損壞,所以,手動替換吧。還會生成兩個txt文件trainImageId,validateImageId,分別放訓練、測試用圖片的名稱,一行一個,這是爲了用來生成後面的txt文件用的。

之後運行trans.py文件。首先要修改11行的classes,將[]裏面的內容換成自己的類別信息。運行後生成兩個txt文件train,val,分別放相應圖片的路徑信息,同時生成兩個文件夾trainLabel,valLabel,分別放xml轉換後的信息。

最後有用的信息是全部的圖片,和trainLabel,valLabel文件,還有存放圖片路徑的兩個txt文件train,val。這兩個代碼比較雞肋,走了很多彎路,有空自己修改一下。

要把由xml轉成的txt文件與圖片放入同一個目錄,train,val路徑隨意。

參考https://blog.csdn.net/qq_34484472/article/details/73135354

5.修改代碼

首先找到darknet-master文件夾,就是之前下載的dark。找到cfg文件夾下voc.data。

classes= 1#類別,要檢測幾個類別就改成幾。
train  = xxx\VOC\train.txt#這裏放的是train.txt的路徑
valid  = xxx\VOC\valPath.txt#val.txt路徑。
names = data/person.names#這裏要進入darknet-master/data,新建一個person.names文件,裏面放類別名稱,一個類別一行。這裏只識別一個類別,即只需寫一個person。
backup = backup#存放訓練模型的文件。

train,val.txt分別爲存放圖片路徑的文檔。

之後,找到darknet-master/cfg中yolov3.cfg,將開頭的測試部分註釋掉,回覆訓練部分信息。

# Testing
#batch=1
#subdivisions=1
# Training
batch=7#
subdivisions=1##這個參數根據自己GPU的顯存進行修改,顯存不夠就改大一些
...                 #因爲訓練時每批的數量 = batch/subdivisions
width=416
height=416
......

learning_rate=0.001#學習率
burn_in=1000
max_batches = 3000##根據自己的需求還有訓練速度max_batches可以調整一下
policy=steps
steps=1000,2000# #跟着max_batches做相應調整
scales=.1,.1


之後找到[yolo],一共有三個[yolo]。

對[yolo]上面的一個[convolutional]中的filters進行修改,根據filters=3*(classes+5).同時也修改yolo中的classes。

[convolutional]
size=1
stride=1
pad=1
filters=18         #filters = 3*(classes + 5)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1          #修改類別數
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1           #顯存小的話 =0

一共有3個[yolo],所以需要修改三個部分,完成之後保存。

用darknet,通過電腦攝像頭實時測試指令:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

https://jingyan.baidu.com/article/4f7d5712efdf3e1a2019272b.html,office2013親測有效

Q&A:

訓練YOLO3過程遇到的坑:

Loading weights from darknet53.conv.74...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Couldn't open file: C:/darknet-master/data/train.txt

或者

"annot load image "data/nfpa/pos-15.jpg
STB Reason: can't fopen
"annot load image "data/nfpa/pos-15.jpg
STB Reason: can't fopen
解決辦法:

出錯是因爲txt文件格式不對,無法讀取對應路徑的圖片。下載notepad++,打開出錯的txt文件,

每行數據後面有個CR LF,這樣的格式是不對的。

點擊編輯-文檔格式轉換-轉換爲UNIX格式。

每行數據後面有且僅有一個LF,格式正確,保存修改之後,再運行,就不會報錯了。

要注意訓練、測試指令,否則會出現核心已經轉移的錯誤。 用detector...

測試的時候,記得修改yolov3-voc.cfg文件,將訓練模塊註釋掉,恢復測試模塊。

在前面的訓練中,顯示0.00000rate是正常的(雖然cfg中設置的rate=0.001),原因:darknet-master/src/network.c中94行左右,

float get_current_rate(network *net)
{
    size_t batch_num = get_current_batch(net);
    int i;
    float rate;
    if (batch_num < net->burn_in) return net->learning_rate * pow((float)batch_num / net->burn_in, net->power);///

AlexeyAB: 訓練過程中出現nan是沒有問題的,如果avg(loss)爲nan的話,則訓練出錯。

 

  • darknet: ./src/parser.c:280: parse_region: Assertion `l.outputs == params.inputs' failed.

        已放棄 (核心已轉儲)

原因:檢查yolov3-voc.cfg文件(就是訓練自己的數據修改的那個cfg文件),看一下3個yolo那裏對應的classes有沒有修改,還有上面的filter,我發現自己的classes沒有改,改好之後就不報錯了。

 

記錄一些別人踩過得坑:

1.https://blog.csdn.net/jiachen0212/article/details/79735632,out of memory:

1:CUDA Error: out of memory表明顯存不夠,調小batch數值

2:Resizing到不同尺度,同樣增加顯存。設置random=0。關閉多尺度訓練。

 

評估模型

./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg results/yolov3-voc_final.weights

要在example文件裏的detector.c中修改validate_detector_recall()函數,509行,修改爲自己的路徑。    list *plist = get_paths("/xxx/Desktop/up/train.txt");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章