研究背景
由于研究时常根据使用情况,制作符合要求的数据集,因而将需要的代码整理。
数据集结构
└── 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