我利用数据集标注工具是精灵标注助手,我认为很好用。奉劝一句标注数据集时不要随便找人给你标,如果他没有用心给你标注,你在后面训练会出现很多问题。在一开始标注数据集的时候不要一下子给他标注完,先标注几十张图片,然后用在你的网络里,看看有没有错误,如果没有问题就按这种方式标,如果有,再找出原因,在后面标注的过程中注意。
解压VOC2007数据集后可以看到VOC2007文件夹下有以下5个文件夹:
(1)JPEGImages
这个文件夹存放的是你目标检测训练和测试用的所有图片,打开JPEGImages文件可以看到下图的图片命名方式,仿照这个格式,因此首先你要把自己的图片重命名为000000.jpg这种格式,然后把图片统一放到JPEGImages文件夹下面。
注意图片的后缀是.jpg,别的也行,只不过这样修改会减少后面训练时候不必要的麻烦。
(2)Annotations
这个文件夹是JPEGImages文件夹中对应图片的.xml格式,打开可以看到:
那么对于自己的数据集该怎么做呢,我们用到的就是第一部分提到的标注工具,这个软件有教程,很容易就会,制作完自己的数据集之后导出pascal_voc格式就可以了。
(3)ImageSets
这个文件夹下面有三个文件夹,主要用到的就是Main文件,其余的两个文件我们不用管它,打开Main文件可以看到有好多txt文件,那么在制作我们自己的Main时候真正用到的文件只有4个:
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集
这个4个文件的制作方法,我用的是python代码生成:
import os
import random
trainval_percent = 0.66
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()
运行完之后就可以得到上面4个文件了。
(4)其余的两个文件SegmentationClass和SegmentationObject直接忽略就可以了,这是用在图像分割的。
(1)修改lib/datasets/pascal_voc,py,
# self._classes = ('__background__', # always index 0
# 'aeroplane', 'bicycle', 'bird', 'boat',
# 'bottle', 'bus', 'car', 'cat', 'chair',
# 'cow', 'diningtable', 'dog', 'horse',
# 'motorbike', 'person', 'pottedplant',
# 'sheep', 'sofa', 'train', 'tvmonitor')
(2)修改tools/demo.py
# CLASSES = ('__background__',
# 'aeroplane', 'bicycle', 'bird', 'boat',
# 'bottle', 'bus', 'car', 'cat', 'chair',
# 'cow', 'diningtable', 'dog', 'horse',
# 'motorbike', 'person', 'pottedplant',
# 'sheep', 'sofa', 'train', 'tvmonitor')
和
net.create_architecture("TEST", (数据集类别+1),
tag='default', anchor_scales=[8, 16, 32])
(3)删除data目录下的cache文件夹
通常遇到的错误是:assert (boxes[:, 2] >= boxes[:, 0]).all() 报错
解决方法再这里说的很详细,会帮你解决。