一、制作voc數據集
1、數據集文件夾
新建一個文件夾,用來存放整個數據集,或者和voc2007一樣的名字:VOC2007
然后像voc2007一樣,在文件夾里面新建如下文件夾:
2、將訓練圖片放到JPEGImages
將所有的訓練圖片放到該文件夾里,然后將圖片重命名為VOC2007的“000005.jpg”形式
圖片重命名的代碼(c++,python,matlab),參考:http://blog.csdn.net/u011574296/article/details/72956446
3、標注圖片,標注文件保存到Annotations
使用labelIImg 標注自己的圖片
每個圖片和標注得到的xml文件,JPEGImages文件夾里面的一個訓練圖片,對應Annotations里面的一個同名XML文件,一 一 對應,命名一致
標注自己的圖片的時候,類別名稱請用小寫字母,比如汽車使用car,不要用Car
pascal.py中讀取.xml文件的類別標簽的代碼:
cls = self._class_to_ind[obj.find('name').text.lower().strip()]
寫的只識別小寫字母,如果你的標簽含有大寫字母,可能會出現KeyError的錯誤。
4、ImageSets\Main里的四個txt文件
在ImageSets里再新建文件夾,命名為Main,在Main文件夾中生成四個txt文件,即:
test.txt是測試集
train.txt是訓練集
val.txt是驗證集
trainval.txt是訓練和驗證集
VOC2007中,trainval大概是整個數據集的50%,test也大概是整個數據集的50%;train大概是trainval的50%,val大概是trainval的50%。
txt文件中的內容為樣本圖片的名字(不帶后綴),格式如下:
根據已生成的xml,制作VOC2007數據集中的trainval.txt ; train.txt ; test.txt ; val.txt
trainval占總數據集的50%,test占總數據集的50%;train占trainval的50%,val占trainval的50%;
上面所占百分比可根據自己的數據集修改,如果數據集比較少,test和val可少一些
二、實現
1、修改datasets文件夾中pascalvoc_common.py文件,將訓練類修改別成自己的
2、將圖像數據轉換為tfrecods格式,修改datasets文件夾中的pascalvoc_to_tfrecords.py文件,然后更改文件的83行讀取方式為’rb‘,如果你的文件不是.jpg格式,也可以修改圖片的類型。
此外, 修改67行,可以修改幾張圖片轉為一個tfrecords
3、運行tf_convert_data.py文件,但是需要傳給它一些參數:
linux:
在SSD-Tensorflow-master文件夾下創建tf_conver_data.sh,文件寫入內容如下:
windows+pycharm:
配置pycharm-->run-->Edit Configuration
遇見的問題:
其他py文件import datasets文件時導入不了模塊,導致讀取不了,解決方法:設為source root
然后運行tf_convert_data.py
4、訓練模型train_ssd_network.py文件中修改
train_ssd_network.py文件中網絡參數配置,若需要改,在此文件中進行修改,如:
其他需要修改的地方
5、nets/ssd_vgg_300.py ,(因為使用此網絡結構) ,修改96 和97行的類別
6、train_ssd_network.py
修改類別為2
7、 eval_ssd_network.py
8、datasets/pascalvoc_2007.py 根據自己的訓練數據修改整個文件
SSD-Tensorflow-master/datasets/pascalvoc_2007.py文件中,none類不要動,其他類修改為自己數據集的類,其中括號內的第一個數為圖片數,第二個數為目標數(bounding box的數目,total是所有類的總和)
# (Images, Objects) statistics on every class. # TRAIN_STATISTICS = { # 'none': (0, 0), # 'aeroplane': (238, 306), # 'bicycle': (243, 353), # 'bird': (330, 486), # 'boat': (181, 290), # 'bottle': (244, 505), # 'bus': (186, 229), # 'car': (713, 1250), # 'cat': (337, 376), # 'chair': (445, 798), # 'cow': (141, 259), # 'diningtable': (200, 215), # 'dog': (421, 510), # 'horse': (287, 362), # 'motorbike': (245, 339), # 'person': (2008, 4690), # 'pottedplant': (245, 514), # 'sheep': (96, 257), # 'sofa': (229, 248), # 'train': (261, 297), # 'tvmonitor': (256, 324), # 'total': (5011, 12608), # } # TEST_STATISTICS = { # 'none': (0, 0), # 'aeroplane': (1, 1), # 'bicycle': (1, 1), # 'bird': (1, 1), # 'boat': (1, 1), # 'bottle': (1, 1), # 'bus': (1, 1), # 'car': (1, 1), # 'cat': (1, 1), # 'chair': (1, 1), # 'cow': (1, 1), # 'diningtable': (1, 1), # 'dog': (1, 1), # 'horse': (1, 1), # 'motorbike': (1, 1), # 'person': (1, 1), # 'pottedplant': (1, 1), # 'sheep': (1, 1), # 'sofa': (1, 1), # 'train': (1, 1), # 'tvmonitor': (1, 1), # 'total': (20, 20), # } # SPLITS_TO_SIZES = { # 'train': 5011, # 'test': 4952, # } # SPLITS_TO_STATISTICS = { # 'train': TRAIN_STATISTICS, # 'test': TEST_STATISTICS, # } # NUM_CLASSES = 20
TRAIN_STATISTICS = {
'none': (0, 0),
'flower': (40, 40),
'total': (40, 40),
}
TEST_STATISTICS = {
'none': (0, 0),
'flower': (10, 10),
'total': (10, 10)
}
SPLITS_TO_SIZES = {
'train': 40,
'test': 10,
}
SPLITS_TO_STATISTICS = {
'train': TRAIN_STATISTICS,
'test': TEST_STATISTICS,
}
NUM_CLASSES = 1 #不用加一
按照之前的方式,同樣,如果你是linux用戶,你可以新建一個.sh文件,文件里寫入
DATASET_DIR=./tfrecords_/ TRAIN_DIR=./train_model/ CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt python3 ./train_ssd_network.py \ --train_dir=./train_model/ \ #訓練生成模型的存放路徑 --dataset_dir=./tfrecords_/ \ #數據存放路徑 --dataset_name=pascalvoc_2007 \ #數據名的前綴 --dataset_split_name=train \ --model_name=ssd_300_vgg \ #加載的模型的名字 --checkpoint_path=./checkpoints/vgg_16.ckpt \ #所加載模型的路徑 --checkpoint_model_scope=vgg_16 \ #所加載模型里面的作用域名 --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \ --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \ --save_summaries_secs=60 \ #每60s保存一下日志 --save_interval_secs=600 \ #每600s保存一下模型 --weight_decay=0.0005 \ #正則化的權值衰減的系數 --optimizer=adam \ #選取的最優化函數 --learning_rate=0.001 \ #學習率 --learning_rate_decay_factor=0.94 \ #學習率的衰減因子 --batch_size=24 \ --gpu_memory_fraction=0.9 #指定占用gpu內存的百分比
如果你是windows+pycharm中運行,除了在上述的run中Edit Configuration配置,你還可以打開Terminal,在這里運行代碼,輸入即可
python ./train_ssd_network.py --train_dir=./train_model/ --dataset_dir=./tfrecords_/ --dataset_name=pascalvoc_2007 --dataset_split_name=train --model_name=ssd_300_vgg --checkpoint_path=./checkpoints/vgg_16.ckpt --checkpoint_model_scope=vgg_16 --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box --save_summaries_secs=60 --save_interval_secs=600 --weight_decay=0.0005 --optimizer=adam --learning_rate=0.001 --learning_rate_decay_factor=0.94 --batch_size=24 --gpu_memory_fraction=0.9