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