1. 程式人生 > >SSD-Tensorflow 目標檢測(自定義資料集(VOC2007格式))

SSD-Tensorflow 目標檢測(自定義資料集(VOC2007格式))

一、準備

  1. 搭建SSD框架,下載解壓即可

  2. 下載pascalvoc資料,自己的資料根據voc格式改寫(圖片的名稱,不用拘泥於6位數字,其他命名也可以)資料集下載點選
    解壓後不要混合在一個資料夾下
    VOCtrainval用來訓練,VOCtest用來測試。
    VOCtrainval 中JPEGImage資料夾中僅是訓練和驗證的圖片,Main資料夾中僅是trainval.txt, train.txt, val.txt
    VOCtest中JPEGImage資料夾中僅是測試圖片,Main資料夾中僅是test.txt
    自己的檔案根據以上檔案格式放置圖片即可。

  3. 自己的資料根據voc格式改寫(圖片的名稱,不用拘泥於6位數字,其他命名也可以)

    檔案重新命名點選

  4. 標記資料 ,這個過程枯燥,需要耐心。詳情請點選,

  5. 生成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\
  1. 將訓練類別修改為和自己一樣的
    在此目錄檔案下: 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'),   
}
  1. 將影象資料轉換為tfrecods格式
    SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py 。
    更改檔案的83行為:image_data = tf.gfile.FastGFile(filename, 'rb').read()
    更改檔案的67行,SAMPLES_PER_FILES = 500(自定義)意為:幾個.xml轉為一個tfrecords,如下圖
    在這裡插入圖片描述
    待續