天天看點

制作自己的VOC資料集制作自己的VOC資料集

制作自己的VOC資料集

由于最近在用自己的資料複現deeplabv3+的代碼,需要用到VOC格式的資料集,這裡将主要介紹一下如何将自己的資料集轉化為VOC資料集。

首先VOC資料集的格式如下:

  • ImageSets
    • Segmentation
      • tain.txt
      • val.txt
      • test.txt
  • JPEGImages
  • SegmentationClass

    其中JPEGImages存放.jpg格式的原圖,SegmentationClass存放與JPEGImages一一對應的.png格式的标簽圖檔。

    制作自己的VOC資料集制作自己的VOC資料集

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






           

繼續閱讀