SSD-Tensorflow 目標檢測(自定義資料集(VOC2007格式))
阿新 • • 發佈:2018-12-16
一、準備
-
搭建SSD框架,下載解壓即可
-
下載pascalvoc資料,自己的資料根據voc格式改寫(圖片的名稱,不用拘泥於6位數字,其他命名也可以)資料集下載點選
解壓後不要混合在一個資料夾下
VOCtrainval用來訓練,VOCtest用來測試。
VOCtrainval 中JPEGImage資料夾中僅是訓練和驗證的圖片,Main資料夾中僅是trainval.txt, train.txt, val.txt
VOCtest中JPEGImage資料夾中僅是測試圖片,Main資料夾中僅是test.txt
自己的檔案根據以上檔案格式放置圖片即可。 -
自己的資料根據voc格式改寫(圖片的名稱,不用拘泥於6位數字,其他命名也可以)
-
標記資料 ,這個過程枯燥,需要耐心。詳情請點選,
-
生成txt檔案,train.txt, trainval.txt, test.txt, val.txt
import os
import random
saveBasePath = r"./VOC007/ImageSets" # txt檔案儲存目錄
total_xml = os.listdir(r'./VOC007/Annotations') # 獲取標註檔案(file_name.xml)
# 劃分資料集為(訓練,驗證,測試集 = 49%,20%,30%)
trainval_percent = 0.7
train_percent = 0.7
tv = int(len(total_xml) * trainval_percent) # 70%訓練-驗證集的檔案數目
tr = int(tv * train_percent) # 70%訓練集的檔案數目
# 打亂訓練檔案(洗牌)
trainval = random.sample(range(len(total_xml)), tv)
train = random.sample(trainval, tr)
print("train and val size", tv)
print("train size" , tr)
ftrainval = open(os.path.join(saveBasePath, 'Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'Main/val.txt'), 'w')
for i in range(len(total_xml)): # 遍歷所有 file_name.xml 檔案
name = total_xml[i][:-4] + '\n' # 獲取 file_name
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()
- 將train.txt, trainval.txt, test.txt, val.txt放置訓練驗證集檔案目錄下
VOCtrainval_06-Nov-2007\VOCdevkit\VOC2007\ImageSets\Main\
- 將test.txt放置測試集檔案目錄下:
VOCtest_06-Nov-2007\VOCdevkit\VOC2007\ImageSets\Main\
- 將訓練類別修改為和自己一樣的
在此目錄檔案下:SSD-Tensorflow/datasets/pascalvoc_common.py
根據實際情況進行修改
VOC_LABELS = {
'none': (0, 'Background'),
'aeroplane': (1, 'Vehicle'),
'bicycle': (2, 'Vehicle'),
'bird': (3, 'Animal'),
'boat': (4, 'Vehicle'),
'bottle': (5, 'Indoor'),
'bus': (6, 'Vehicle'),
'car': (7, 'Vehicle'),
'cat': (8, 'Animal'),
'chair': (9, 'Indoor'),
'cow': (10, 'Animal'),
'diningtable': (11, 'Indoor'),
'dog': (12, 'Animal'),
'horse': (13, 'Animal'),
'motorbike': (14, 'Vehicle'),
'Person': (15, 'Person'),
'pottedplant': (16, 'Indoor'),
'sheep': (17, 'Animal'),
'sofa': (18, 'Indoor'),
'train': (19, 'Vehicle'),
'tvmonitor': (20, 'Indoor'),
}
- 將影象資料轉換為tfrecods格式
SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py 。
更改檔案的83行為:image_data = tf.gfile.FastGFile(filename, 'rb').read()
更改檔案的67行,SAMPLES_PER_FILES = 500(自定義)
意為:幾個.xml轉為一個tfrecords,如下圖
待續