天天看點

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

------------------------------ 本文僅供學習交流,如有錯誤,望交流指教 ------------------------------

yolov3 訓練及資料集準備【記錄】

一、資料集的準備

0x00.檔案目錄結構

VOCdevkit

——VOC2018

這個年号可以自行替換,但是注意同時修改腳本上的年号,否則找不到目錄

————Annotations

存放所有的mxl标記檔案,可由labelimg标注工具進行标注生成

————ImageSets

——————Main

存放4個txt檔案,其中test.txt是測試集,train.txt是訓練集,val.txt是驗證集,trainval.txt是測試和驗證集

————JPEGImages

用于存放圖檔

————labels

用于存轉換後yolo标記格式的txt檔案

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 首先如上圖建立好目錄

0x01.生成 test.txt、train.txt、val.txt、trainval.txt

  這裡我使用了一個現成的python腳本,用于生成txt檔案,腳本自動會擷取圖檔名稱,按比例生成不同的集圖檔名,使用的時候注意修改路徑。

  生成完畢後,應該會看到Main檔案夾下會有四個txt檔案,如果生成失敗可以檢查下:目前目錄權限及腳本内的路徑,注意圖檔命名不能有中文。

 生成完畢後,因為接下來我們隻用:val.txt驗證集和train.txt訓練集,是以将test.txt是測試集裡的東西複制到驗證集,我這隻有10個圖檔用作簡單測試,如果你的資料量大對模型有品質要求的,請仔細調整訓練集和驗證集的比例

目前為止我們就完成了voc的資料集制作

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 目前為止我們就完成了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檔案夾裡的路徑,這裡我也就不改了,路徑問題,大家都懂得,存哪都一樣

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 也就是說,其實不用把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檔案一會再說,咳咳。。。

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

.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
           
yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

.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

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 葛洲壩水利樞紐工程38公裡處,來自三峽水力發電站的電力,通過1060.7公裡長的輸電電路,不遠萬裡來到這裡,在這個冰冷無情的寒夜裡唯有訓練模型和火鍋,配的上這樣的電力。

 在火鍋沸騰和一遍一遍的續水中,不知不覺模型已經訓練了3000多次。

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 啥?你問我啥硬體?GTX1060呀,為啥訓練那麼快?3000次訓練一頓火鍋的時間?

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 吃火鍋不小心睡着了。。。

 先刷個鍋,一會回來。。。

三、測試

經前面的訓練相信你已經得到了這個檔案,他是每100次儲存一次,是以一開始是沒有的。

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

随後我們用這個檔案測試下:

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

yolov3 訓練及資料集準備【記錄】yolov3 訓練及資料集準備【記錄】

 我也是剛開始寫部落格MarkDown編輯器都用不利索,如有錯誤還請大家指出,如有疑問也歡迎大家在下面留言讨論。

參考:

https://blog.csdn.net/maweifei/article/details/81137563

https://blog.csdn.net/lilai619/article/details/79695109

非常有參考價值,很感謝作者

繼續閱讀