一、数据集文件夹
自己按照VOC2007的格式创建文件夹VOCdevkit,然后内部再创建VOC2007文件夹,此文件夹里面存放Annotations、ImageSets、JPEGImage、SegmentatinClass、SegmentationObject这五个文件夹,其中,Annotations存放标记后的XML图片文件,ImageSets里面包括三个文件夹,分别是Layout、Main、Segmentation(我只考虑了图片分类问题,因此只需要创建Main文件,Main文件包括的是txt文件)JPEGImage用于存放jpg或者jpeg格式的图片,SegmentatinClass、SegmentationObject与分割有关,也不需要。
二、将训练数据集放在JPEGImage里
将所有的图片放入JPEGImage中,图片的命名方式参考VOC2007,即‘000001.jpg’,图片的大小长宽比不能太大或者太小,可参考VOC2007的大小,设置为500*375
#修改一个文件夹下所有图片的名字,修改成000000.jpg格式
#保存修改的顺序到一个文档中,方便以后查看
import os
path = "原始图片路径"
filelist = os.listdir(path)
# 通过修改count得到图片名字的起始格式
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=os.path.splitext(file)[1]
Newdir=os.path.join(path,str(count).zfill(6)+filetype)
os.rename(Olddir,Newdir)
count+=1
三、标注图片,并放入Annotations
首先需要下载labelImage,labelImage 提取码:z0n9
使用方法:
- cmd打开anaconda prompt
- cd到labelImage文件路径下
- 终端分别输入pyrcc5 -o resources.py resources.qrc及python labelImg.py,则进入labelImage
- open Dir 打开需要标记的文件
- change save Dir 更改标记后的XML文件保存路径
- 点击Create RecBox 用矩形框进行目标标记,如下图
- 标记结束 点击save,则形成XML文件并保存
- 点击Next Image 则进入下一张图片的标记
四、ImageSets/Main中的四个TXT文件形成
import os
import random
# ==================可能需要修改的地方=====================================#
g_root_path = "C:/Users/17865/Desktop/yolo/yolov4-pytorch-master/yolov4-pytorch-master/VOCdevkit/VOC2007/"
xmlfilepath = "Annotations" # 标注文件存放路径
saveBasePath = "ImageSets/Main/" # ImageSets信息生成路径
trainval_percent = 0.98
train_percent = 0.98
# ==================可能需要修改的地方=====================================#
os.chdir(g_root_path)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
xml_list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(xml_list, tv)
train = random.sample(trainval, tr)
print("train and val size", tv)
print("train size", tr)
ftrainval = open(saveBasePath + "trainval.txt", "w")
ftest = open(saveBasePath + "test.txt", "w")
ftrain = open(saveBasePath + "train.txt", "w")
fval = open(saveBasePath + "val.txt", "w")
for i in xml_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文件保存的是图片的名称,如下图
VOC数据集制作完成!
补充:
获取上述4个TXT文件夹中图片的详细路径代码,并生成新的4个TXT文件
import os
import random
xmlfilepath=r'./VOCdevkit/VOC2007/Annotations'
saveBasePath=r"./VOCdevkit/VOC2007/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()