前几天师弟问我如何做自己的VOC2007数据集的事情,当时跟他说网上资料很多,让他自己查查,但不知道什么原因和我说还是没搞好。自己想想也是,不熟悉的东西即便在别人眼里看似很简单,到了自己跟前也变得深奥到天际。所以这里方便大家一起学习就写了这篇博客,供大家和师弟参考,如有错误的地方还请大家指教。
在做目标检测时,我们需要准备好自己的数据集,将其制作为VOC2007格式的数据集,这里可以下载原始VOC2007数据集:VOC2007数据集,我们来看看这个数据集到底是什么样的。
解压VOC2007数据集后可以看到VOC2007文件夹下有以下5个文件夹:
- Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。 - JPEGImages文件夹
改文件夹下存放的是数据集图片,包括训练和测试图片。 - ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。在这里我们只用存放图像数据的Main文件,其他两个暂且不管。Action存放的是人的动作,我们暂时不用。Main存放的是图像物体识别的数据,分为20类,当然我们自己制作就呵呵呵不一定了,如果你有精力。Main里面有test.txt , train.txt, val.txt ,trainval.txt.这四个文件我们后面会生成。Segmentation存放的是可用于分割的数据 - SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关。
2.开始制作
制作自己的VOC2007格式数据集其实不需要上述那么多内容,我们只要做三个部分即可:Annotations文件夹、JPEGImages文件夹、ImageSets文件夹下的Main文件。
第一步:我们参照原始VOC2007数据集的文件层次创建上述四个文件夹,也就是创建一个VOCdevkit文件夹,下面再创建Annotations、JPEGImages、ImageSets三个文件夹,最后在ImageSets文件夹下再创建一个Main文件夹。
创建好所有文件夹后,我们将自己的数据集图片都放到JPEGImages文件夹下。按照习惯,我们将图片的名字修改为000001.jpg这种格式的(参照原始数据集图片命名规则),统一命名方法网络上有很多,网上很多,这里就不多赘述了。
另外强调两点:第一点是图片的格式,图片需是JPEG或者JPG格式,其他格式需要转换一下。第二点是图片的长宽比,图片长宽比不能太大或太小,这个参考原始VOC2007数据集图片即可。
第二步:我们来制作Annotations文件夹下所需要存放的xml文件。这里我们需要借助大神带给我们的福利了:LabelImg工具,可以按照上面的说明进行安装和使用。看到满篇的英文是不是很晕,那这里有个简单的方法可以帮助到大家!当然lxml
库文件还是要装的,但如果你用的是Anaconda环境,那么你什么都不用做,只需要点击这里:LabelImg标注工具,根据自己的情况选择下载window版本还是linux版本,然后解压使用就行了!
关于如何使用,这里以window版本的为例说明。下载解压后会得到一个exe可执行文件,另一个是data文件夹,这里面有个txt文件,内容是预定义的分类标签名,里面的标签可以根据自己的需要进行修改。执行exe文件打开标注界面就可以进行操作了,操作方法可以参考这篇文章:使用方法
这里给张标注工具的参考图:
下面就进行漫长的标注工作吧。。。
使用方法
(1) 修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,改为自定义位置,这里的路径一定不能包含中文,否则无法保存。
(2)源码文件夹中使用notepad++打开data/predefined_classes.txt,修改默认类别,比如改成person、car、motorcycle三个类别。
(3) “Open Dir”打开图片文件夹,选择第一张图片开始进行标注,使用“Create RectBox”或者“Ctrl+N”或者”W”开始画框,单击结束画框,再双击选择类别。完成一张图片后点击“Save”保存,此时XML文件已经保存到本地了。点击“Next Image”转到下一张图片。
(4) 标注过程中可随时返回进行修改,后保存的文件会覆盖之前的。
(5)完成标注后打开XML文件,发现确实和PASCAL VOC所用格式一样。
快捷键
Ctrl + u 加载目录中的所有图像,鼠标点击Open dir同功能
Ctrl + r 更改默认注释目标目录(xml文件保存的地址)
Ctrl + s 保存
Ctrl + d 复制当前标签和矩形框
space 将当前图像标记为已验证
w 创建一个矩形框
d 下一张图片
a 上一张图片
del 删除选定的矩形框
Ctrl++ 放大
Ctrl– 缩小
↑→↓← 键盘箭头移动选定的矩形框
具体事项
想要修改图2中的标签类别内容(如默认的dog、person、cat等)则在主目录下data文件夹中的predefined_classes.txt文件中修改。
使用时,使用ctrl+u快捷键加载图片后,使用ctrl+r快捷键指定生成的xml文件的保存位置,然后开始按照类别将图片中的目标进行矩形框标注,每标注一个目标后软件自动弹出类别信息以供选择,在弹出的类别信息中选择对应的类别名称双击即可。当一张图片中各个类别所需要标注的目标全部标注后,点击保存按键或者使用ctrl+s快捷键保存就生成了相对应的xml位置信息文件,此时可以开始下一张图片的标注。
说明:每标注完一张图片后进行保存,保存的xml文件名要与对应图片名一致,大家可以参考原始VOC2007数据集中JPEGImages文件夹下图片的命名和Annotations文件夹中的xml文件命名规则。
备注:这里还有个制作工具VOC2007数据格式制作工具 也很好用,大家也可以试一试。这个是在网上看到的,忘记作者了,在这里表示感谢。
第三步:我们来制作ImageSets文件夹下Main文件夹中的4个文件(test.txt、train.txt、trainval.txt、val.txt)。
首先我们先来了解下这四个文件到底是干什么用的,当然从文件的命名上我们也都能大体猜得上来他们的作用,不过这里还是简单的说明一下吧。 trainval和 test内容相加为所有xml文件,train和val内容相加为trainval。
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集
在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%。所以我们可参考以下代码来生成这4个txt文件:
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(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
注意:上述代码中涉及到的路径要写全,另外各个数据集所占比例根据实际数据集的大小调整比例。
至此,我们自己的VOC2007格式数据集就全部制作完成了。