SSD-實現


一、制作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    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM