读取voc中的数据集路径修改_制作VOC2007数据集常用代码

本文档提供了处理VOC数据集的代码示例,包括图片重命名、VOC格式数据集的创建、txt文件的生成以及镜像翻转图像以扩充训练集。内容涉及XML文件的修改、数据集切分、图像尺寸记录和物体边界框的标注等操作。
摘要由CSDN通过智能技术生成

研究背景

由于研究时常根据使用情况,制作符合要求的数据集,因而将需要的代码整理。

数据集结构

└── VOCdevkit #根目录

└── VOC2012 #不同年份的数据集,这里只下载了2012的,还有2007等其它年份的

├── Annotations #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等

├── ImageSets #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本

│ ├── Action

│ ├── Layout

│ ├── Main

│ └── Segmentation

├── JPEGImages #存放源图片

├── SegmentationClass #存放的是图片,分割后的效果,见下文的例子

└── SegmentationObject #存放的是图片,分割后的效果,见下文的例子

Annotation文件夹存放的是xml文件,该文件是对图片的解释,每张图片都对于一个同名的xml文件。

ImageSets文件夹存放的是txt文件,这些txt将数据集的图片分成了各种集合。如Main下的train.txt中记录的是用于训练的图片集合

JPEGImages文件夹存放的是数据集的原图片

SegmentationClass以及SegmentationObject文件夹存放的都是图片,且都是图像分割结果图

代码实现

图片重命名保存在JPEGImages,将原命名数字+12682,再补0到6位数字。

import os

path = "/home/henry/File/URPC2018/VOC/VOC2007/JPEG/YDXJ0013"

#path1 = "/home/henry/File/URPC2018/VOC/VOC2007/JPEG/1"

filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)

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(int(filename)+12682).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数

os.rename(Olddir,Newdir)#重命名

VOC格式数据集从000000.jpg转换为从1.jpg开始的自然排列。

import os

path = "/home/henry/Files/URPC2018/UPRC2018UnderWaterDetection/cla6/JPEGImagesc"

path1 = "/home/henry/Files/URPC2018/UPRC2018UnderWaterDetection/cla6/1"

filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)

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(path1,str(int(filename)+1)+filetype)

os.rename(Olddir,Newdir)#重命名

Layout和Main文件夹所需text文档。

制作VOC2007数据集中的trainval.txt, train.txt , test.txt , val.txt

trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;

import os

import random

trainval_percent = 0.5

train_percent = 0.5

xmlfilepath = 'Anno/G0024173'

txtsavepath = 'test'

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('test\\trainval.txt', 'w')

ftest = open('test\\test.txt', 'w')

ftrain = open('test\\train.txt', 'w')

fval = open('test\\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()

# ! /usr/bin/python

# -*- coding:UTF-8 -*-

import os, sys

import glob

from PIL import Image

# VEDAI 图像存储位置

src_img_dir = os.path.abspath('.')+'/13'

# VEDAI 图像的 ground truth 的 xml 文件存放位置

src_xml_dir = '/home/henry/File/URPC2018/all_train_data_0829/111'

# 遍历目录读取图片

img_Lists = []

def get_img_list(dir_path):

if os.path.isdir(dir_path):

for x in os.listdir(dir_path):

get_img_list(os.path.join(dir_path, x))

elif os.path.isfile(dir_path) and dir_path.split('.')[-1] == 'jpg':

img_Lists.append(dir_path)

get_img_list(src_img_dir)

img_Lists.sort(key=lambda x:x[-10:])

# for i in img_Lists:

# print(i)

# 创建xml文件,存入图片信息

for img_item in img_Lists:

im = Image.open(img_item) #打开图片 为了记录图片的长宽数据

img = os.path.split(img_item)[1].split('.')[0]

width, height = im.size

# write in xml file

# os.mknod(src_xml_dir + '/' + img + '.xml')

xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')

xml_file.write('\n')

xml_file.write(' VOC2007\n')

xml_file.write(' ' + str(img) + '.jpg' + '\n')

xml_file.write(' \n')

xml_file.write(' ' + str(width) + '\n')

xml_file.write(' ' + str(height) + '\n')

xml_file.write(' 3\n')

xml_file.write(' \n')

xml_file.close()

# 读取全部信息

txt_file = open('YDXJ0013.txt')

for line in txt_file.readlines():

gt = line.splitlines()

# print(gt)

# gt = txt_file.readline().splitlines()

# # gt = open(src_txt_dir + '/gt_' + img + '.txt').read().splitlines()

# write the region of image on xml file

for img_each_label in gt:

spt = img_each_label.split(' ') # 这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。

# 判断是否需要写入xml

if spt[6] == '0':

# print (gt)

# 打开相应xml文件

# print(spt[5].zfill(6))

xml_file = open((src_xml_dir + '/' + spt[5].zfill(6) + '.xml'), 'a')

xml_file.write(' \n')

xml_file.write(' ' + str(spt[9]) + '\n')

xml_file.write(' Unspecified\n')

xml_file.write(' 0\n')

xml_file.write(' 0\n')

xml_file.write(' \n')

xml_file.write(' ' + str(spt[1]) + '\n')

xml_file.write(' ' + str(spt[2]) + '\n')

xml_file.write(' ' + str(spt[3]) + '\n')

xml_file.write(' ' + str(spt[4]) + '\n')

xml_file.write(' \n')

xml_file.write(' \n')

xml_file.close()

# 补上结尾

for i in range(4500):

xml_file = open((src_xml_dir + '/' + str(i).zfill(6) + '.xml'), 'a')

xml_file.wri

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值