制作自己的VOC数据集
由于最近在用自己的数据复现deeplabv3+的代码,需要用到VOC格式的数据集,这里将主要介绍一下如何将自己的数据集转化为VOC数据集。
首先VOC数据集的格式如下:
- ImageSets
- Segmentation
- tain.txt
- val.txt
- test.txt
- Segmentation
- JPEGImages
- SegmentationClass
其中JPEGImages存放.jpg格式的原图,SegmentationClass存放与JPEGImages一一对应的.png格式的标签图片。
要制作自己的VOC数据集,默认你已经做好了如下准备:
- 使用labelme标注了数据并将json文件批量转化
- 将所有待训练的原图都存放在一个文件夹中
所以我们接下来的工作就是
- 从批量转化的json文件中挑出我们需要的label.png文件并重新命名并存储到SegmentationClass文件夹下
- 将原图复制到JPEGImages中并重新命名。(其中需要注意的是JPEGImages和SegmentationClass中的图片需要名称和位置一一对应)
- 生成.txt文件
用到的代码如下所示
import os
import shutil
from sklearn.model_selection import train_test_split
#从json中挑出mask文件
inputdir = r'F:\test0628' #存放json文件的文件夹
outputdir = r'F:\MyDataset\Seghybrid\SegmentationClass'
c = 1
for dir in os.listdir(inputdir):
# 设置旧文件名(就是路径+文件名)
oldname = inputdir + os.sep + dir + os.sep + 'label.png' # os.sep添加系统分隔符
# 设置新文件名
#c = outputdir + os.sep + dir.split('_')[1]
a = "0" * (6 - len(str(c)))
newname = outputdir + os.sep + a + str(c) + '.png'
shutil.copyfile(oldname, newname) # 用os模块中的rename方法对文件改名
print(oldname, '======>', newname)
c += 1
'''
#原始数据转换
inputdir = r'F:\ProcessData\AllData' #存放初始数据的文件夹
outputdir = r'F:\MyDataset\Seghybrid\JPEGImages'
c = 1
for dir in os.listdir(inputdir):
# 设置旧文件名(就是路径+文件名)
oldname = inputdir + os.sep + dir # os.sep添加系统分隔符
# 设置新文件名
#c = outputdir + os.sep + dir.split('_')[1]
a = "0" * (6 - len(str(c)))
newname =outputdir + os.sep +a + str(c) + '.jpg'
shutil.copyfile(oldname, newname) # 用os模块中的rename方法对文件改名
print(oldname, '======>', newname)
c += 1
#生成txt文件
imagedir = 'F:\MyDataset\Seghybrid\JPEGImages'
outdir = r'F:\MyDataset\Seghybrid\ImageSets\Segmentation'
images = []
for file in os.listdir(imagedir):
filename = file.split('.')[0]
images.append(filename)
# 训练集测试集验证集比例为:4:2:2
train, test = train_test_split(images, train_size=0.5, random_state=0)
val, test = train_test_split(test, train_size=0.5, random_state=0)
with open(outdir + os.sep +"train.txt", 'w') as f:
f.write('\n'.join(train))
with open(outdir + os.sep +"val.txt", 'w') as f:
f.write('\n'.join(val))
with open(outdir + os.sep +"test.txt", 'w') as f:
f.write('\n'.join(test))
'''