【YOLO】自己制作VOC数据集

一、数据集文件夹

自己按照VOC2007的格式创建文件夹VOCdevkit,然后内部再创建VOC2007文件夹,此文件夹里面存放Annotations、ImageSets、JPEGImage、SegmentatinClass、SegmentationObject这五个文件夹,其中,Annotations存放标记后的XML图片文件,ImageSets里面包括三个文件夹,分别是Layout、Main、Segmentation(我只考虑了图片分类问题,因此只需要创建Main文件,Main文件包括的是txt文件)JPEGImage用于存放jpg或者jpeg格式的图片,SegmentatinClass、SegmentationObject与分割有关,也不需要。
【YOLO】自己制作VOC数据集_第1张图片

二、将训练数据集放在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
使用方法

  1. cmd打开anaconda prompt
  2. cd到labelImage文件路径下
  3. 终端分别输入pyrcc5 -o resources.py resources.qrc及python labelImg.py,则进入labelImage
    【YOLO】自己制作VOC数据集_第2张图片
  4. open Dir 打开需要标记的文件
  5. change save Dir 更改标记后的XML文件保存路径
  6. 点击Create RecBox 用矩形框进行目标标记,如下图
  7. 标记结束 点击save,则形成XML文件并保存
  8. 点击Next Image 则进入下一张图片的标记
    【YOLO】自己制作VOC数据集_第3张图片

四、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文件保存的是图片的名称,如下图
【YOLO】自己制作VOC数据集_第4张图片
【YOLO】自己制作VOC数据集_第5张图片
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()

你可能感兴趣的:(【YOLO】自己制作VOC数据集)