darknet訓練自己的模型權重-yolo4
阿新 • • 發佈:2021-05-26
注:此過程是執行在darknet已編譯完成後的情況,具體執行環境參考上一篇博文:編譯darknet網路-下載git版本時間20210520
一、在darknet主目錄下建立yolo-obj.cfg配置檔案,拷貝yolov4-custom.cfg的內容到yolo-obj.cfg中,並對部分內容進行修改。
- 修改batch=64,修改subdivisions=64(如果顯示卡效能較高,可以設定batch=96或subdivisions=16)
- 修改width=416,height=416(如果顯示卡效能較高,可以設定width=608,height=608)
- 修改max_batches=classes*2000,例如當前有3個類別,則設定為6000,這裡的max_batches表示最終的迭代次數
- 修改steps為max_batches的80%到90%,比如max_batches=6000,則steps=4800,5400
- 修改classes,使用檔案內容搜尋關鍵字[yolo]可以搜到3次,修改classes的數量為你的類別數,這裡classes=3
- 修改filters,同上一步搜尋[yolo],每次搜到的yolo上一個的[convolutional]中filters=(classes + 5)x3 比如filters=24
- (可以跳過)如果要用[Gaussian_yolo] ,則搜尋[Gaussian_yolo] 將[filters=57] 的filter 修改為 filters=(classes + 9)x3 (注:這裡我沒搜到對應的內容)
二、在darknet主目錄下建立obj.name檔案,內容為你的類別,比如水壺、人和筆,格式如下:
jug
person
pen
三、製作obj.data,在darknet主目錄下建立obj.data檔案,內容如下:
classes= 3
train = ./scripts/2007_train.txt
#valid = ./scripts/2007_test.txt #(做測試用的測試txt)
valid = ./scripts/2007_val.txt
names = obj.name #(找不到的話,可以修改為自己的絕對路徑)
backup = backup/ # 權重儲存的位置
四、在darknet主目錄下建立backup資料夾,方便訓練過程報存權重
五、資料集製作,在scripts資料夾下按如下目錄建立VOCdevkit 資料夾,放自己的訓練資料,結構如下:
VOCdevkit
--VOC2007
----Annotations #(放XML標籤檔案)
----ImageSets
------Main
----JPEGImages # (放原始圖片)
然後,把自己的原始未標註圖片和標籤資訊放入相應資料夾下。
六、scripts資料夾下有voc_label.py,開啟後修改自己的類別資訊
sets=[ (‘2007’, ‘train’), (‘2007’, ‘val’), (‘2007’, ‘test’)]
classes = [“jug”, “person”,“pen” ] 按自己的類別修改,但是順序要和obj.name 保持一致
七、在主目錄下建立make_data.py 檔案,拷貝下面程式碼。
import os
import random
import sys
root_path = './scripts/VOCdevkit/VOC2007'
xmlfilepath = root_path + '/Annotations'
txtsavepath = root_path + '/ImageSets/Main'
if not os.path.exists(root_path):
print("cannot find such directory: " + root_path)
exit()
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
trainval_percent = 0.9
train_percent = 0.8
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)
print("train and val size:", tv)
print("train size:", tr)
ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
執行make_data.py 檔案,在Main 下生成四個txt檔案。
八、在scripts資料夾下執行voc_label.py檔案,執行前如有”2012”相關字樣內容需刪除,保留”2017”部分,執行結束在scripts 檔案下生成 3個相應的txt檔案,在VOC2007下生成labels資料夾。
九、開始訓練,先下載預訓練權重yolov4.conv.137,放入darknet主目錄下,
權重下載地址:
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
用下面的命令開始訓練:
./darknet detector train obj.data yolo-obj.cfg yolov4.conv.137 -map
每訓練迭代1000次會單獨儲存1份當前權重。
#訓練2000此後在之前訓練的基礎上繼續訓練(適合中途停止後繼續訓練)
./darknet detector train obj.data yolo-obj.cfg backup/yolo-obj_2000.weights -map
參考部落格:
Yolov4訓練自己的資料集,史上最詳細教程(本人多次使用訓練,親測效果不錯,小白都可以學會)_王GUO寧的部落格-CSDN部落格