制作VOC数据集

制作VOC数据集

  1. PASCAL VOC数据集的构成:
--VOC2007
   --Annotations
   --ImageSets
     --Main
     --Layout
     --Segmentation
   --JPEGImages
   --SegmentationClass
   --SegmentationObject

*JPEGImages:存放图片。
*Annotations:每张图片对应的XML文件,内容是标记的各个目标的位置和类别信息
*ImageSets:Layout 存放人体部位的数据。(用不上)
Segmentation 存放分割的数据。(用不上)
Main 存放的是目标识别的数据,主要有test.txt , train.txt, val.txt, trainval.txt(测试集图片的文件名、训练集图片的文件名、训练验证集图片的文件名、验证集图片的文件名)四个文件。
*SegmentationClass与SegmentationObject:存放的是图像分割结果图,对目标检测任务来说没有用。class segmentation 标注出每一个像素的类别 。object segmentation 标注出每一个像素属于哪一个物体。

  1. 创建各个文件
import os
def make_voc_dir():
    os.makedirs('E:/headX/Annotations')
    os.makedirs('E:/headX/ImageSets')
    os.makedirs('E:/headX/ImageSets/Main')
    os.makedirs('E:/headX/ImageSets/Layout')
    os.makedirs('E:/headX/ImageSets/Segmentation')
    os.makedirs('E:/headX/JPEGImages')
    os.makedirs('E:/headX/SegmentationClass')
    os.makedirs('E:/headX/SegmentationObject')
if __name__ == '__main__':
    make_voc_dir()
  1. 准备所需图片若干张,放入指定文件夹。
    step1.将准备好的图片进行resize,设置成大小相同的图像。
import cv2
import glob
import os

image_path = "E:/headX/img/*.jpg"  # 原始图片路径
output_path = "E:/headX/JPEGImages/"   # 修改后的保存路径
count = 0
for jpgfile in glob.glob(image_path):
    
    #img = Image.open(jpgfile)
    image = cv2.imread(jpgfile)
    image = cv2.resize(image,(1280,720),interpolation=cv2.INTER_CUBIC)
    cv2.imwrite(os.path.join(output_path,os.path.basename(jpgfile)), image)
    print("save%d"%count)
    count += 1
print("resize finished!")

step2.将调整好大小的图片进行顺序重命名。

import os
path = input('请输入文件路径:/……/')

#获取该目录下所有文件,存入列表中
fileList = os.listdir(path)
n = 0
m = 0   # 图片编号从m+1开始
for i in fileList:
    #设置旧文件名(就是路径+文件名)
    oldname = path + os.sep + fileList[n]   # os.sep添加系统分隔符
    #设置新文件名
    # newname = path+os.sep  + str(m+1)+".jpg"
    newname = path + os.sep + '%04d' % m + ".jpg"
    os.rename(oldname, newname)   #用os模块中的rename方法对文件改名
    print(oldname, '======>', newname)
    n += 1
    m += 1

step3.采用labelimg标注图像,生成相应的Annotations目录下的XML文件。(如何安装labelimg请期待下一篇)
本人采用anaconda安装,因此labelImg的进入如下:
打开Anaconda Prompt(anaconda),
输入conda activate pt
cd *\labelImg-master
python labelImg.py
进入labelImg进行图像标注,获得.xml文件。
制作VOC数据集_第1张图片
step4.生成ImageSets下的Main(test.txt , train.txt, val.txt, trainval.txt)。

# 4make_imagesets
import os
import random

xmlfilepath = r'E:/headX/Annotations/'  # xml文件的路径
saveBasePath = r'E:/headX/ImageSets/'  # 生成的txt文件的保存路径

trainval_percent = 0.9  # 训练验证集占整个数据集的比重(划分训练集和测试验证集)
train_percent = 0.8  # 训练集占整个训练验证集的比重(划分训练集和验证集)
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)

print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'Main/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()

得到图中所示的.txt文件。
制作VOC数据集_第2张图片
至此基本完成了VOC数据集制作。
主要参考:
https://blog.csdn.net/qq_40927867/article/details/114984762

你可能感兴趣的:(目标检测,计算机视觉,深度学习)