制作VOC数据集,VOC格式如下
Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
JPEGImages文件夹
改文件夹下存放的是我们已按统一规则命名好的原始图像,包括训练和测试图片。
ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。在这里我们只用存放图像数据的Main文件,通常为train.txt、test.txt等,该文本文件里面的内容是需要用来训练或测试的图像的名字(无后缀无路径),其他两个暂且不管。
SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关。
Step 1——改名字的操作,便于后续处理:
把图片放到JPEGSImages里面(所有图片,包括训练和测试),在VOC2007里面,人家的图片文件名都是000001.jpg类似这样的,我们也统一格式,把我们的图片名字重命名成这样的,由于本测试样本图片只有3000张,所以我命名为0001-3000,下面是py3的代码
# -*- coding:utf8 -*-
'''
批量重命名文件夹中的图片文件
我依次把三个文件夹的更新了一下,抽查的几个,发现按照统一规则转换的是对应着的
'''
# !/usr/bin/python3
import os
class BatchRename():
def __init__(self):
self.path = r'XXX' # 我把txt和image都改了下路径
def rename(self):
filelist = os.listdir(self.path)
print(filelist)
total_num = len(filelist)
i = 1
#
for item in filelist:
if item.endswith('.txt'):
src = os.path.join(os.path.abspath(self.path), item)
str1 = str(i)
dst = os.path.join(os.path.abspath(self.path), str1.zfill(4) + '.txt') #str1.zfill(x),x为一共几位数,用0补齐,如001000
# print(dst)
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
# print
# 'total %d to rename & converted %d jpgs' % (total_num, i)
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
Step 2
比较重要,由于我的数据集拿到的是txt格式的,需要转换为xml
网上找到的大多数都是用工具直接生成xml的,所以需要转换一下
这边找个了个极好的转换的代码
import os,sys
import glob
from PIL import Image
# the direction/path of Image,Label
src_img_dir = r"sample-Images"
src_txt_dir = r"sample-Labels"
src_xml_dir = r"xml"
img_Lists = glob.glob(src_img_dir + '/*.jpg')
# print(img_Lists)
#
img_basenames = []
for item in img_Lists:
img_basenames.append(os.path.basename(item))
# print(img_basenames)
img_name = []
for item in img_basenames:
temp1, temp2 = os.path.splitext(item)
img_name.append(temp1)
# print(img_name)
for img in img_name:
im = Image.open((src_img_dir + '/' + img + '.jpg'))
width, height = im.size
# print(width)
gt = open(src_txt_dir + '/' + img + '.txt').read().splitlines()
#
xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')
xml_file.write('<annotation>\n')
xml_file.write(' <folder>VOC2018</folder>\n')
xml_file.write(' <filename>' + str(img) + '.jpg' + '</filename>\n')
xml_file.write(' <size>\n')
xml_file.write(' <width>' + str(width) + '</width>\n')
xml_file.write(' <height>' + str(height) + '</height>\n')
xml_file.write(' <depth>3</depth>\n')
xml_file.write(' </size>\n')
for index in range(len(gt)):
if index != 0 :
spt = gt[index].split(' ')
xml_file.write(' <object>\n')
xml_file.write(' <name>' + str(spt[0]) + '</name>\n')
xml_file.write(' <pose>Unspecified</pose>\n')
xml_file.write(' <truncated>0</truncated>\n')
xml_file.write(' <difficult>0</difficult>\n')
xml_file.write(' <bndbox>\n')
xml_file.write(' <xmin>' + str(spt[1]) + '</xmin>\n')
xml_file.write(' <ymin>' + str(spt[2]) + '</ymin>\n')
xml_file.write(' <xmax>' + str(spt[3]) + '</xmax>\n')
xml_file.write(' <ymax>' + str(spt[4]) + '</ymax>\n')
xml_file.write(' </bndbox>\n')
xml_file.write(' </object>\n')
xml_file.write('</annotation>')
转换后的xml格式如下:
Step 3:生成txt
ImageSets文件夹下Main文件夹中的4个文件(test.txt、train.txt、trainval.txt、val.txt)。
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集
在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%,如果数据集比较少,test和val可少一些
import os
import random
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = 'VOC2007/Annotations'
txtsavepath = 'VOC2007/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()
原文:
这篇博客很详细的讲解了各个文件夹及其作用,十分之详细,感谢这位老哥
https://blog.csdn.net/qq_33297776/article/details/79758342
这是一个海参的
https://blog.csdn.net/xiao__run/article/details/78714659
https://blog.csdn.net/ch_liu23/article/details/53558549
参考这篇文章生成txt
https://blog.csdn.net/gulingfengze/article/details/79639111