制作自己の数据集(详细学习笔记)
前言
一、下载相关数据集,作为样板(参考)
目标检测领域常用的三个数据集PASCAL VOC、ImageNet、COCO.
我用的是voc2007.
Pascal VOC网址:http://host.robots.ox.ac.uk/pascal/VOC/
VOC数据集在类别上可以分为4大类,20小类。
数据集下载后解压得到一个名为VOCdevkit的文件夹,该文件夹结构如下:
简单介绍一下这五个文件夹的作用
1.Annotations:此文件中放置的是图像对应的标注文件,即,xml文件。
xml主要介绍了对应图片的基本信息,如来自那个文件夹、文件名、来源、图像尺寸以及图像中包含哪些目标以及目标的信息等等
xml格式:
下面展示一些 对应码片
。
import copy
from lxml.etree import Element, SubElement, tostring, ElementTree
import cv2
# 修改为你自己的路径
template_file = 'G:\\dataset\\WJ-data\\anno.xml'
target_dir = 'G:\\dataset\\WJ-data\\Annotations\\'
image_dir = 'G:\\dataset\\train\\' # 图片文件夹
train_file = 'G:\\dataset\\train.txt' # 存储了图片信息的txt文件
with open(train_file) as f:
trainfiles = f.readlines() # 标注数据 格式(filename label x_min y_min x_max y_max)
file_names = []
tree = ElementTree()
for line in trainfiles:
trainFile = line.split()
file_name = trainFile[0]
print(file_name)
# 如果没有重复,则顺利进行。这给的数据集一张图片的多个框没有写在一起。
if file_name not in file_names:
file_names.append(file_name)
lable = trainFile[1]
xmin = trainFile[2]
ymin = trainFile[3]
xmax = trainFile[4]
ymax = trainFile[5]
tree.parse(template_file)
root = tree.getroot()
root.find('filename').text = file_name
# size
sz = root.find('size')
im = cv2.imread(image_dir + file_name)#读取图片信息
sz.find('height').text = str(im.shape[0])
sz.find('width').text = str(im.shape[1])
sz.find('depth').text = str(im.shape[2])
# object 因为我的数据集都只有一个框
obj = root.find('object')
obj.find('name').text = lable
bb = obj.find('bndbox')
bb.find('xmin').text = xmin
bb.find('ymin').text = ymin
bb.find('xmax').text = xmax
bb.find('ymax').text = ymax
# 如果重复,则需要添加object框
else:
lable = trainFile[1]
xmin = trainFile[2]
ymin = trainFile[3]
xmax = trainFile[4]
ymax = trainFile[5]
xml_file = file_name.replace('jpg', 'xml')
tree.parse(target_dir + xml_file)#如果已经重复
root = tree.getroot()
obj_ori = root.find('object')
obj = copy.deepcopy(obj_ori) # 注意这里深拷贝
obj.find('name').text = lable
bb = obj.find('bndbox')
bb.find('xmin').text = xmin
bb.find('ymin').text = ymin
bb.find('xmax').text = xmax
bb.find('ymax').text = ymax
root.append(obj)
xml_file = file_name.replace('jpg', 'xml')
tree.write(target_dir + xml_file, encoding='utf-8')
YOLO数据集txt标注格式:
0 0.160938 0.541667 0.120312 0.386111
分别指所标注内容的类别、归一化后的中心点x坐标,归一化后的中心点y坐标,归一化后的目标框宽度w,归一化后的目标况高度h(此处归一化指的是除以图片宽和高)
2.ImageSets文件夹中是标注类别的每个文件列表信息,此文件中会有你划分的训练集图片和测试集图片的名称列表。
包含三个子文件夹:
Layout:存放train,valid,test和train+valid数据集的文件名
Segmentation:存放分割所用train,valid,test和train+valid数据集的文件名
Main:存放各个类别所在图片的文件名,比如cow_val,表示valid数据集中,包含有cow类别目标的图片名称。
3.JPEGImages中存放的是所有的原始图片,为.JPEG格式。
4.SegmentationCllass存放所有分割图像的标注。
5.SegmentationObject存放分割图像的标注文件。
二、 windows下利用Anaconda安装LabelImg
Step1:
打开Anaconda Prompt,新建环境:
conda create --name=labelImg python=3.7
Step2:
激活环境
conda activate labelImg
Step3:
pip install pyqt5
Step4:
pip install labelImg
环境安装完成以后,下次使用在Anaconda Prompt里使用“activate labelImg” 激活环境,输入labelImg即可,用的时候不要关闭Anaconda Prompt。
最后在保存文件的路径下生成.xml文件和PASCAL VOC所用格式相同。
三,总结
按照要求将自己做的图片放入对应文件夹,然后放入代码进行训练。
如果自己的图片的名称是很乱的,进行“改名”
代码附上:
import os
path = r"E:\团队\voc\JPEGImages"
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=".jpg" # 文件扩展名
Newdir=os.path.join(path, str(count).zfill(5)+filetype) # 用字符串函数zfill 以0补全所需位数
os.rename(Olddir, Newdir)# 重命名
count+=1
count=0 :表示从0开始写名字
zfill(5):表示有几位数字