1. 程式人生 > 其它 >darknet訓練自己的模型權重-yolo4

darknet訓練自己的模型權重-yolo4

注:此過程是執行在darknet已編譯完成後的情況,具體執行環境參考上一篇博文:編譯darknet網路-下載git版本時間20210520

一、在darknet主目錄下建立yolo-obj.cfg配置檔案,拷貝yolov4-custom.cfg的內容到yolo-obj.cfg中,並對部分內容進行修改。

  1. 修改batch=64,修改subdivisions=64(如果顯示卡效能較高,可以設定batch=96或subdivisions=16)
  2. 修改width=416,height=416(如果顯示卡效能較高,可以設定width=608,height=608)
  3. 修改max_batches=classes*2000,例如當前有3個類別,則設定為6000,這裡的max_batches表示最終的迭代次數
  4. 修改steps為max_batches的80%到90%,比如max_batches=6000,則steps=4800,5400
  5. 修改classes,使用檔案內容搜尋關鍵字[yolo]可以搜到3次,修改classes的數量為你的類別數,這裡classes=3
  6. 修改filters,同上一步搜尋[yolo],每次搜到的yolo上一個的[convolutional]中filters=(classes + 5)x3 比如filters=24
  7. (可以跳過)如果要用[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部落格