------------------------------ 本文僅供學習交流,如有錯誤,望交流指教 ------------------------------
yolov3 訓練及資料集準備【記錄】
一、資料集的準備
0x00.檔案目錄結構
VOCdevkit
——VOC2018
這個年号可以自行替換,但是注意同時修改腳本上的年号,否則找不到目錄
————Annotations
存放所有的mxl标記檔案,可由labelimg标注工具進行标注生成
————ImageSets
——————Main
存放4個txt檔案,其中test.txt是測試集,train.txt是訓練集,val.txt是驗證集,trainval.txt是測試和驗證集
————JPEGImages
用于存放圖檔
————labels
用于存轉換後yolo标記格式的txt檔案

首先如上圖建立好目錄
0x01.生成 test.txt、train.txt、val.txt、trainval.txt
這裡我使用了一個現成的python腳本,用于生成txt檔案,腳本自動會擷取圖檔名稱,按比例生成不同的集圖檔名,使用的時候注意修改路徑。
生成完畢後,應該會看到Main檔案夾下會有四個txt檔案,如果生成失敗可以檢查下:目前目錄權限及腳本内的路徑,注意圖檔命名不能有中文。
生成完畢後,因為接下來我們隻用:val.txt驗證集和train.txt訓練集,是以将test.txt是測試集裡的東西複制到驗證集,我這隻有10個圖檔用作簡單測試,如果你的資料量大對模型有品質要求的,請仔細調整訓練集和驗證集的比例
目前為止我們就完成了voc的資料集制作
目前為止我們就完成了voc的資料集制作
需要轉換成yolo的資料集格式,将.xml檔案轉換成yolo的txt
#python3
import os
import random
trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
0x02.voc标簽檔案.xml轉yolo标簽檔案.txt
下載下傳voc_label.py檔案,将檔案下載下傳到VOCdevkit同級的路徑下,生成訓練和驗證的檔案清單
這個檔案在darknet-master裡面也有可以拿過來用,需要改下樣本集的名稱,及類的标簽
wget https://pjreddie.com/media/files/voc_label.py
sets=[('2018', 'train'), ('2018', 'val')]#修改自己的年号隻使用了訓練和驗證集
classes = ["wheel", "armor"]#修改為自己的标簽
運作python voc_label.py跑完後它會在labels這個檔案夾下,轉換好所需要的yolo标簽檔案,
同時在VOCdevkit同級目錄下生成:2018_train.txt、2018_val.txt 兩個檔案,yolo訓練是要用這兩個檔案
在生成過程中發現,voc_label生成的直接是voc檔案夾裡的路徑,這裡我也就不改了,路徑問題,大家都懂得,存哪都一樣
也就是說,其實不用把jpg檔案放到data/images這個檔案夾下,直接把yolo的标簽檔案txt複制到JPEGImages檔案夾裡就可以了
0x03.yolo的檔案結構
yolov3
這個名字随意
——backup
存儲訓練好的模型
——cfg
用于存放配置檔案.cfg和.data檔案
——data
存放圖檔、标簽檔案、名字檔案(.names)
————images
存放圖檔和yolo的txt文本,圖檔名和txt文本名對應
————labels
存放用于opencv繪制圖檔框的圖檔檔案
ps:
labels這個檔案夾有的教程說存放yolo标簽檔案就是xml生成的txt檔案,但是我嘗試了下,會提示找不到标簽檔案,可能是yolov3的原因。
二、檔案的修改配置
0x00.檔案修改配置.cfg、.data、.names、下載下傳權重檔案
.cfg檔案一會再說,咳咳。。。
.data檔案的配置
cfg檔案夾下建立:myv3_det.data檔案
.data存放的各個檔案的路徑,修改成自己的路徑,很容易修改。
classes= 4 #classes為訓練樣本集的類别總數
train = C:\Users\***\Desktop\win_yolo_xl\yolo3\yolo3\2018_train.txt #train的路徑為訓練樣本集所在的路徑
valid = C:\Users\***\Desktop\win_yolo_xl\yolo3\yolo3\2018_val.txt #valid的路徑為驗證樣本集所在的路徑
names = data\voc.names #names的路徑為data/voc.names檔案所在的路徑
backup = backup
.names檔案的配置
data檔案夾下建立myv3.names檔案
.name檔案存放标簽的名字,内部是通過ID轉換的名字,例如下面,一行一個。
可以直接從labelimg标注工具中的predefined_classes.txt把名字複制出來
衆所周知
labelimg工具是要先配置predefined_classes.txt再标注
别問我怎知道的,多畫兩遍框框就能了解我的痛
vehicle
armor
wheel
people
.cfg檔案的配置
直接上一個我的配置吧,這個不全根據自己的情況修改
[net]
# Testing ### 測試模式
#batch=1
#subdivisions=1
# Training ### 訓練模式,每次前向的圖檔數目 = batch/subdivisions
batch=16
subdivisions=8
width=416 ### 網絡的輸入寬、高、通道數
height=416
channels=3
momentum=0.9 ### 動量
decay=0.0005 ### 權重衰減
angle=0
saturation = 1.5 ### 飽和度
exposure = 1.5 ### 曝光度
hue=.1 ### 色調
learning_rate=0.001 ### 學習率
burn_in=1000 ### 學習率控制的參數
max_batches = 50200 ### 疊代次數
policy=steps ### 學習率政策
steps=40000,45000 ### 學習率變動步長
scales=.1,.1 ### 學習率變動因子
[convolutional]
batch_normalize=1### BN
filters=32 ### 卷積核數目
size=3 ### 卷積核尺寸
stride=1 ### 卷積核步長
pad=1 ### pad
activation=leaky ### 激活函數
#"此處省略并沒卵用的若幹"
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=4###20 #類别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1 #1,如果顯存很小,将random設定為0,關閉多尺度訓練;
#"此處省略并沒卵用的若幹"
[convolutional]
size=1
stride=1
pad=1
filters=27###75
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=4###20 #類别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1 #1,如果顯存很小,将random設定為0,關閉多尺度訓練;
#"此處省略并沒卵用的若幹"
[convolutional]
size=1
stride=1
pad=1
filters=27###75 27
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=4###20 #類别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1 #1,如果顯存很小,将random設定為0,關閉多尺度訓練;
這裡引用下:https://blog.csdn.net/lilai619/article/details/79695109
A.filters數目是怎麼計算的:3x(classes數目+5),和聚類數目分布有關,論文中有說明;
B.如果想修改預設anchors數值,使用k-means即可;
C.如果顯存很小,将random設定為0,即關閉多尺度訓練;
D.其他參數如何調整,有空再補;
E.前100次疊代loss較大,後面會很快收斂;
Region xx: cfg檔案中yolo-layer的索引;
Avg IOU: 目前疊代中,預測的box與标注的box的平均交并比,越大越好,期望數值為1;
Class: 标注物體的分類準确率,越大越好,期望數值為1;
obj: 越大越好,期望數值為1;
No obj: 越小越好;
.5R: 以IOU=0.5為門檻值時候的recall; recall = 檢出的正樣本/實際的正樣本
0.75R: 以IOU=0.75為門檻值時候的recall;
count: 正樣本數目。
下載下傳Imagenet上預先訓練的權重:
https://pjreddie.com/media/files/darknet53.conv.74
到目前為止就湊齊所有訓練需要的檔案了,
大家可以和下面的仔細核對一下
檔案夾樹
└─yolo3
│ 2018_train.txt#兩個集
│ 2018_val.txt
│ Adarknet_yolo_v3_test.bat#用于啟動訓練
│ bad.list
│ darknet.exe
│ darknet53.conv.74#預訓練權重檔案
│ log.txt#日志檔案非必須
│ predictions.jpg#輸出标記好的圖
│ pthreadGC2.dll
│ pthreadVC2.dll
│ test.bat
│ voc_label.py
├─backup
│ my_yolov3_100.weights#訓練好的模型
│ my_yolov3_3000.weights
├─cfg
│ myv3_det.data#不說了
│ my_yolov3.cfg
├─data
│ │ myv3.names
│ │ timg.jpg#隻是用于最後測試順手放這了
│ │
│ ├─images
│ └─labels
└─VOCdevkit
└─VOC2018
│ main4.py#生成4個txt
├─Annotations#存放所有voc的.xml檔案
│ 1(1).xml
│ 1(10).xml
├─ImageSets
│ └─Main
│ test.txt
│ train.txt
│ trainval.txt
│ val.txt
├─JPEGImages
│ 1(1).jpg#所有圖檔
│ 1(1).txt
│ 1(10).jpg
│ 1(10).txt
└─labels
1(1).txt#由voc_label.py生成好的yolo的标簽檔案
1(10).txt
三、訓練(吃火鍋)
運作:
聰明的你一定會寫一個指令,并且儲存在xxx.bat檔案裡,這個指令直接把輸出儲存到了log.txt是以看不到輸出,可以打開txt檢視進度
darknet.exe detector train cfg/myv3_det.data cfg/my_yolov3.cfg darknet53.conv.74 -ext_outputpause>>log.txt
葛洲壩水利樞紐工程38公裡處,來自三峽水力發電站的電力,通過1060.7公裡長的輸電電路,不遠萬裡來到這裡,在這個冰冷無情的寒夜裡唯有訓練模型和火鍋,配的上這樣的電力。
在火鍋沸騰和一遍一遍的續水中,不知不覺模型已經訓練了3000多次。
啥?你問我啥硬體?GTX1060呀,為啥訓練那麼快?3000次訓練一頓火鍋的時間?
吃火鍋不小心睡着了。。。
先刷個鍋,一會回來。。。
三、測試
經前面的訓練相信你已經得到了這個檔案,他是每100次儲存一次,是以一開始是沒有的。
随後我們用這個檔案測試下:
darknet.exe detector test cfg/myv3_det.data cfg/my_yolov3.cfg backup/my_yolov3_3000.weights -i 0 -thresh 0.25 data/timg.jpg -ext_outputpause
我也是剛開始寫部落格MarkDown編輯器都用不利索,如有錯誤還請大家指出,如有疑問也歡迎大家在下面留言讨論。
參考:
https://blog.csdn.net/maweifei/article/details/81137563
https://blog.csdn.net/lilai619/article/details/79695109
非常有參考價值,很感謝作者