制作VOC数据集,VOC格式如下
Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
JPEGImages文件夹
改文件夹下存放的是我们已按统一规则命名好的原始图像,包括训练和测试图片。
ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。在这里我们只用存放图像数据的Main文件,通常为、等,该文本文件里面的内容是需要用来训练或测试的图像的名字(无后缀无路径),其他两个暂且不管。
SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关。
Step 1——改名字的操作,便于后续处理:
把图片放到JPEGSImages里面(所有图片,包括训练和测试),在VOC2007里面,人家的图片文件名都是000001.jpg类似这样的,我们也统一格式,把我们的图片名字重命名成这样的,由于本测试样本图片只有3000张,所以我命名为0001-3000,下面是py3的代码
# -*- coding:utf8 -*-
'''
批量重命名文件夹中的图片文件
我依次把三个文件夹的更新了一下,抽查的几个,发现按照统一规则转换的是对应着的
'''
# !/usr/bin/python3
import osclass 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:dswith('.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)ame(src, dst)print('converting %s to %s ...' % (src, dst))i = i + 1except:continue# print# 'total %d to rename & converted %d jpgs' % (total_num, i)if __name__ == '__main__':demo = BatchRename()ame()
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个文件、、、)。
:测试集
:训练集
:验证集
:训练和验证集
在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%,如果数据集比较少,test和val可少一些
import os
import randomtrainval_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+'/', 'w')
ftest = open(txtsavepath+'/', 'w')
ftrain = open(txtsavepath+'/', 'w')
fval = open(txtsavepath+'/', '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()
原文:
这篇博客很详细的讲解了各个文件夹及其作用,十分之详细,感谢这位老哥
这是一个海参的
参考这篇文章生成txt
本文发布于:2024-02-08 19:51:14,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739319968499.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |