目标检测之voc数据集制作
1.voc数据集结构
Annotations:存放检测物体在图片上的坐标位置xml文件
JPEGImages:存放训练和验证的图片
ImageSets:文件下有三个子文件夹,Layout、Main和Segmentation,其中我们关注Main文件夹就OK了,Main文件夹里train.txt,val.txt,trainval.txt,test.txt这四个txt文件,存放不带后缀的图片名
2.制作步骤
2.1图片重命名:首先将训练用的图片放在JPEGImages文件夹下,图片名称建议重命名成000001.jpg这样的格式
import os
def image_rename(img_path):
imglist=os.listdir(img_path)
i=1
for file in imglist:
Oldname=os.path.join(img_path,file)
filename=os.path.splitext(file)[0]
filetype=os.path.splitext(file)[1]
Newname=os.path.join(img_path,str(i).zfill(6)+filetype)#用字符串函数zfill 以0补全所需位数
os.rename(Oldname,Newname)
i=i+1
if __name__ == "__main__":
imgs_path = "C:/Users/Administrator/Desktop/VOC2007/img"
image_rename(imgs_path)
2.2 生成xml文件:使用LabelImg软件生成物体坐标的xml文件,xml文件的名称与图片名称相同,包含了图片名称,图片中object的类别及其bounding box坐标。
2.3 生成txt文件:生成Main文件夹下的四个文件了(train.txt,val.txt,trainval.txt,test.txt)。
import os import random trainval_percent = 0.8 train_percent = 0.7 xmlfilepath = 'C:/Users/Administrator/Desktop/VOC2007/Annotations' txtsavepath = 'C:/Users/Administrator/Desktop/VOC2007/ImageSets/Main' xmllist = os.listdir(xmlfilepath) num = len(xmllist) 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('C:/Users/Administrator/Desktop/VOC2007/ImageSets/Main/trainval.txt', 'w') ftest = open('C:/Users/Administrator/Desktop/VOC2007/ImageSets/Main/test.txt', 'w') ftrain = open('C:/Users/Administrator/Desktop/VOC2007/ImageSets/Main/train.txt', 'w') fval = open('C:/Users/Administrator/Desktop/VOC2007/ImageSets/Main/val.txt', 'w') for i in list: name = xmllist[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()