制作自己的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))
'''