注:此过程是运行在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文件夹。

训练集如何训练权重 训练好的权重_深度学习_02

 

九、开始训练,先下载预训练权重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