SSD_300_vgg和SSD_512_vgg weights下載鏈接【需要科學上網~】:
| Model | Training data | Testing data | mAP | FPS |
|---|---|---|---|---|
| SSD-300 VGG-based | VOC07+12+COCO trainval | VOC07 test | 0.817 | - |
| SSD-300 VGG-based | VOC07+12 trainval | VOC07 test | 0.778 | - |
| SSD-512 VGG-based | VOC07+12+COCO trainval | VOC07 test | 0.837 | - |
我的csdn下載鏈接【沒法科學上網的同學】:
ssd-512:https://download.csdn.net/download/qq_36396104/10792340
ssd-300:https://download.csdn.net/download/qq_36396104/10792337
ssd源碼https://github.com/DengZhuangSouthRd/SSD-TinyObject/blob/master/COMMANDS.md
轉自:https://blog.csdn.net/liuyan20062010/article/details/78905517
1. 搭建SSD框架,下載解壓即可
2. 下載pascalvoc數據,自己的數據根據voc格式改寫(圖片的名稱,不用拘泥於6位數字,其他命名也可以)
解壓后不要混合在一個文件夾下,要生成三個,主要是利用訓練集測試的文件夾,VOCtrainval用來訓練,VOCtest用來測試。
VOCtrainval 中JPEGImage文件夾中僅是訓練和驗證的圖片,Main文件夾中僅是trainval.txt, train.txt, val.txt
VOCtest中JPEGImage文件夾中僅是測試圖片,Main文件夾中僅是test.txt.
3. 圖片數據重命名為6位數字
python代碼
3.標記數據
4.生成txt文件,train.txt, trainval.txt, test.txt, val.txt
python代碼
5. 將訓練類別修改為和自己一樣的
SSD-Tensorflow-master—>datasets—>pascalvoc_common.py
根據實際情況進行修改
6. 將圖像數據轉換為tfrecods格式
SSD-Tensorflow-master—>datasets—>pascalvoc_to_tfrecords.py 。。。然后更改文件的83行讀取方式為’rb’)
修改讀取圖片的類型:修改如下兩個地方
“image_format = b'JPEG'”
“filename = directory + DIRECTORY_IMAGES + name + '.jpg'”中 jpg 可以修改讀取圖片的類型
修改67行,可以修改幾張圖片轉為一個tfrecords,如下圖
在SSD-Tensorflow-master文件夾下創建tf_conver_data.sh
7. 訓練模型
train_ssd_network.py修改第154行的最大訓練步數,將None改為比如50000。(tf.contrib.slim.learning.training函數中max-step為None時訓練會無限進行。)
train_ssd_network.py,網絡參數配置,若需要改,再此文件中進行修改
修改如下圖中的數字600,可以改變訓練多長時間保存一次模型
需要修改的地方:
a. nets/ssd_vgg_300.py (因為使用此網絡結構) ,修改87 和88行的類別
b. train_ssd_network.py,修改類別120行,GPU占用量,學習率,batch_size等
c eval_ssd_network.py 修改類別,66行
# =========================================================================== # # Main evaluation flags. # =========================================================================== # tf.app.flags.DEFINE_integer( 'num_classes', 21, 'Number of classes to use in the dataset.') #根據自己的數據修改為類別+1
d. datasets/pascalvoc_2007.py 根據自己的訓練數據修改整個文件
方案1 從vgg開始訓練其中某些層的參數
方案2 : 從自己預訓練好的模型開始訓練(依然可以指定要訓練哪些層)
從自己訓練的ssd_300_vgg模型開始訓練ssd_512_vgg的模型
因此ssd_300_vgg中沒有block12,又因為block7,block8,block9,block10,block11,中的參數張量兩個網絡模型中不匹配,因此ssd_512_vgg中這幾個模塊的參數不從ssd_300_vgg模型中繼承,因此使用checkpoint_exclude_scopes命令指出。
因為所有的參數均需要訓練,因此不使用命令--trainable_scopes
另外由300轉512后還需修改:
1. 首先修改ssd_vgg_512.py的訓練類別
2.修改train_ssd_network.py的model_name
修改為ssd_512_vgg
3. 修改nets/np_methods.py
修改:將300改為512, 將類別改為自己數據的類別(+背景)
4. 修改preprocessing/ssd_vgg_preprocessing.py
修改:將300改為512
5. 修改ssd_notbook.ipynb
a 將文件中數字“300”改為“512”
其他修改可以參考:http://blog.csdn.net/liuyan20062010/article/details/78905517
方案3:從頭開始訓練自己的模型
8. 測試或驗證
首先將測試數據轉換為tfrecords
在SSD-Tensorflow-master文件夾下建立一個sh文件
9. 利用ssd_notebook.ipynb顯示訓練測試模型的結果
修改紅框標注的位置,一個是修改為自己的模型所在的路徑,另一個是修改為自己圖片所在的路徑
10. 注意
- –dataset_name=pascalvoc_2007 、–dataset_split_name=train、–model_name=ssd_300_vgg這三個參數不要自己隨便取,在代碼里,這三個參數是if…else…語句,有固定的判斷值,所以要根據實際情況取選擇
- TypeError: expected bytes, NoneType found SystemError: returned a result with an error set 這是由於CHECKPOINT_PATH定義的時候不小心多了個#號鍵,將輸入給注釋掉了,如果不想使用預訓練的模型,需要將--checkpoint_path=${CHECKPOINT_PATH} \注釋掉即可
- SSD有在VOC07+12的訓練集上一起訓練的,用一個笨一點的辦法: pascalvoc_to_tfrecords.py文件中,改變SAMPLES_PER_FILES,減少輸出tfrecord文件的個數,再修改tf_convert_data.py的dataset參數,記得將前后兩次的輸出名改變一下,前后兩次轉換的tfrecords放在同一個文件夾下,然后手工重命名。(這里由於只是驗證論文的訓練方法是否有效,所以沒必要寫這些自動化代碼實現合並,以后要用自己的數據集訓練的時候就可以寫一些自動化腳本)
- 有時候運行腳本會報錯,可能是之前依次運行導致顯存占滿。
- 從pyCharm運行時,如果模型保存路徑里之前的模型未刪除,將會報錯,必須保證該文件夾為空。
- 在TRAIN_DIR路徑下會產生四中文件: 1. checkpoint :文本文件,包含所有model.ckpt-xxxx,相當於是不同時間節點生成的所有ckpt文件的一個索引。 2. model.ckpt-2124.data-000000-of-000001:模型文件,保存模型的權重 3. model.ckpt-2124.meta: 圖文件,保存模型的網絡圖 4. model.ckpt-2124.index : 這個沒搞太清楚 5. graph.pbtxt: 用protobuf格式保存的模型的圖
- error:Default MaxPoolingOp only supports NHWC,這有兩種原因:1、你的電腦沒有gpu(情況很少)2、你使用的tensorflow版本有問題,看看是不是使用了非gpu版的tensorflow,或者使用的虛擬環境沒切換過來。








