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");