用自己的数据(txt格式的标签)制作VOC数据集

制作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

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值