一。制作训练集
1
创建文件夹,
图片存储在JPEGImages文件夹中
2
使用labellimg工具,标记图片,生成.XML格式的文件,存储在目录Annotation下,
3
生成ImageSets文件夹中的Main文件夹中的四个文件. test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集.VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%,下面的代码生成这四个文件,百分比可以自己调整.
程序:
import os
import random
trainval_percent = 0.7
train_percent = 0.5
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
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('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/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()
import os
import random
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets/Main'
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('/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/'+name)
if i in train:
ftrain.write('/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/'+name)
else:
fval.write('/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/'+name)
else:
ftest.write('/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/'+name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
并且,在图片后面加后缀.jpg
如:
/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/120.jpg
/home/hb/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/28.jpg
并且在/darknet/scripts文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt三个文件。到此,数据准备完成。
4.运行将XML生成txt文件的脚本命令
文件下载到VOCdevkit同级的路径下,生成训练和验证的文件列表 ,如果下载好了darknet项目,在darknet/scripts/目录下也有voc_lable.py
运行命令:python voc_label.py
, 这个文件需要更改里面的相关信息,
运行后发现label文件夹下面已经生成了对应的txt标签
PS:运行后,制作的120张图片只生成了54个txt,初步判断可能是图片样本质量问题导致的
二。修改配置文件
a.cfg/voc.data文件中:
classes是分类数目,train 和valid 放着的是训练图片和验证图片的路径
names里面放分类的名称文档,backup文件夹是用于保存训练模型的
b.yolo-voc.cfg
将[region]中的classes改为4,
将最后一个[convolutional](紧挨着[region]的前一个)中的filter改为30(filter的公式filters=(classes+ coords+ 1)* (NUM) ,我的是(4+4+1)* 5=45)
三。训练
将下载的权重模型放在scripts文件夹中
现在是训练,要引掉cfg中的testing了,batch和subdivisions测试时等于1,放在训练里肯定是不行的,难以收敛。
# Testing
#batch=1 #检测时去掉前面的`#`,注释training里面对应两行的内容
#subdivisions=1 #检测时去掉前面的`#`,注释training里面对应两行的内容
# Training
# batch=64 #训练时去掉前面的`#
# subdivisions=8 #训练时去掉前面的`#`
...
### 修改数值的时候不能用全部替换操作,手动修改### filters= 18 #[检测目标数(classes)+ 5 ] * 3 在[yolo]标签上面4行。 一共三处 ...
classes = 1 #目标类的数量,此处为一类物体。
[yolo]标签下面3行。一共三处
...
random=0 ##显存大可以改为1,可以提高精度。
训练指令
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg scripts/darknet19_448.conv.23 -gpus 0,1
训练之前记得将darknet中的makefile文件夹中更改配置,然后make编译,才可运行并使用GPU。
测试
命令:
~/darknet$ ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_800.weights data/18.jpg -thresh 0.25
其中-thresh 0.25
是阈值,可以更改。