在 darknet 目录下新建 voc
文件夹,在里面创建子文件夹 VOCdevkit
,
继续在 VOCdevkit 中创建 VOC 2007
,创建三个子文件夹:
VOC 的命名格式为:000001.jpg,路径名称 path 根据自己的实际位置进行修改。
# -*- coding: utf-8 -*-
import os
path = "H:\DataSet\data\myYOLO\YOLOv3训练集\data\images"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
print(file)
#遍历所有文件
for file in filelist:
#原来的文件路径
Olddir=os.path.join(path, file)
#如果是文件夹则跳过
if os.path.isdir(Olddir):
continue
#文件名
filename=os.path.splitext(file)[0]
#文件扩展名
filetype=os.path.splitext(file)[1]
#用字符串函数zfill 以0补全所需位数
Newdir=os.path.join(path,str(count).zfill(6)+filetype)
#重命名
os.rename(Olddir,Newdir)
count+=1
打标签工具: labelImg: labelImg 下载
使用方法: 在图片中给物体画框然后输入标签就可以了,打标结果保存到 imgData/annotations 文件夹中,格式是 xml 文件。例如对于图片 001.jpg,打标结果保存为 001.xml。
python3 labelImg.py # 打开labelImg
标注流程:
open dir
change save dir
create rectbox
,快捷键是 W
save
,快捷键是 Ctrl + S
next image
,快捷键是 D
,上一张是 A
生成了 Annotation 文件夹下的 xml 标签文件之后,就可以生成 4 个 txt 文件,分别为:
这 4 个文件中存储的是上一步中 xml 文件的文件名。 trainval 和 test 内容相加为所有 xml 文件,train 和 val 内容相加为trainval。生成代码如下:(路径 path 根据自己的实际情况进行修改)
import os
import random
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = 'xml文件存储的路径'
txtsavepath = '生成txt文件的存储路径'
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(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()
yolo 训练要求标签文件格式为 txt,所以将要 voc 格式的 xml 标签文件转换成 txt 标签文件。
转换脚本: voc_label.py
首先下载格式转化脚本到 VOCdevkit 的同级目录下:wget https://pjreddie.com/media/files/voc_label.py
打开 voc_label.py 进行修改
# 因为没有用到VOC2012的数据,要修改年份
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
# 修改检测的物体种
classes = ["dogcatperson"]
运行 voc_label.py 即可完成文件转化,
如果要用多个 txt 中的数据一起用来训练,就需要先合并文件。比如合并 train_2007.txt 和 train_2012.txt
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
这里由于已经生成了 trainval.txt 文件,所以无需合并,直接用 train.txt 和 val.txt 的合并文件 trainval.txt 来训练。
如果还没有生成 txt 文件,也可以用 txt 标签文件进行生成:
import os
import random
trainval_percent = 0.5
train_percent = 0.5
txtfilepath = 'H:\DataSet\data\myYOLO\YOLOV3训练\data\labels'
txtsavepath = 'H:\DataSet\data\myYOLO\YOLOV3训练\data\ImageSets'
total_txt = os.listdir(txtfilepath)
num=len(total_txt)
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(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_txt[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()
打开 cfg/voc.data 文件,进行如下修改:
classes= 4 # 自己数据集的类别数
train = /data/monn/darknet/project_yolov3/voc/VOCdevkit/VOC 2007/ImageSets/traindata.txt # train文件的路径
valid = /data/monn/darknet/project_yolov3/voc/VOCdevkit/VOC 2007/ImageSets/test.txt # test文件的路径
names = /data/monn/darknet/project_yolov3/data/voc.names #用绝对路径
backup = /data/monn/darknet/project_yolov3/backup #模型保存的文件夹
注意需要在 darknet 文件夹下,新建名为 backup 的文件夹,否则训练过程报错:Couldn’t open file: backup/yolov3-voc.backup
打开 data/voc.names 文件,对应自己的数据集修改类别。
people
front
side
back
修改 == yolov3-voc.cfg== 配置文件,或者直接上传一个新的配置文件,起名为 yolov3-my.cfg 也行。
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
首先下载 Imagenet 上预先训练的权重:
wget https://pjreddie.com/media/files/darknet53.conv.74
训练我们的数据,并保存 log 日志文件:
./darknet detector train cfg/voc.data cfg/yolov3-my.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log
训练结束,修改 cfg 文件后进行测试:
./darknet detect cfg/yolov3-my.cfg yolov3-voc_900.weights test3.jpg
YOLOV3训练出现nan的问题?
在显存允许的情况下,可适当增加batch大小,可以一定程度上减少NAN的出现,动量参数可以调为0.99。