文章目录
- 制作自己的目标检测数据集
- 一、下载Voc数据集
- 二、安装标注工具labelimg
- 三、制作图像标签
- 1.创建一个文件夹
- 2.在当前文件夹下打开命令提示符
- 3.打开标注软件
制作自己的目标检测数据集
一、下载Voc数据集
在官网下载Voc2012数据集:
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#devkit 找到–>Development Kit–>Download the training/validation data (2GB tar file)点击下载。
下载好的文件目录如下,目标检测主要用到的数据包括:
- Annotations(用来存放图像的标注信息)
- ImageSetes->Main文件夹下的
train.txt(训练集)
val.txt(验证集)
traincal.txt(训练+验证集)
txt文件中存放的是图像名称,其中train和val中的数据是互斥的。 - JPEGImages(存放所有的图像信息)
二、安装标注工具labelimg
- 图像标注的软件很多,在Github上有很多开源的项目:https://github.com/tzutalin/labelImg 官方文档有安装和使用的教程。
- Win+R打开命令提示符输入cmd,在命令窗口输入pip install labelImg进行安装
安装完成后直接输入labelimg就可以了
三、制作图像标签
下面是一个制作图像标注的一个实例:
1.创建一个文件夹
vocdata
- Annotations(存放生成的标注文件xml)
- image(存放自己的数据集图像)
- classes.txt(写入自己要检测的目标类别)
2.在当前文件夹下打开命令提示符
1.Shift+鼠标右键,选择在此处打开Powershell(S)
2.点击左上角的文件选择打开Windows PowerShell®
打开的命令提示符窗口是蓝色的
3.打开标注软件
在命令窗口输入:
labelimg ./image ./classes.txt
./image图像路径(表示对当前文件夹下的图像进行标注)
./classes.txt类别标签路径
这样在对图像进行标注时,类别是固定的,是提前写在classes.txt文件中的类别。
- Open Dir添加要标注的存放图像的文件夹
- Change Save Dir将标注信息存放的问价夹,选择自己创建的Annotations文件夹
- Create RectBox对图像中的目标进行框选
- 右上角的difficult表示检测目标的困难程度,如果目标比较难检测就勾选上,如果目标检测比较容易就不勾选
使用下面的代码,将数据集分成训练集,验证集,训练+验证集和测试集。
import os
import random
xmlfilepath=r'Annotations'
saveBasePath=r"ImageSets/Main/"
trainval_percent=1 # 训练+验证集的比例
train_percent=1 # 训练集的比例
temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
if xml.endswith(".xml"):
total_xml.append(xml)
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("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'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()