原
【SSD】用caffe-ssd架構MobileNet網絡訓練自己的資料集
置頂 2017年11月02日 13:33:00 閱讀數:9798 更多 個人分類: SSD 版權聲明:本文為部落客Hans原創文章,未經部落客Hans允許不得轉載。http://blog.csdn.net/renhanchi https://blog.csdn.net/renhanchi/article/details/78423343
前言
上一篇部落格寫了用作者提供的VGG網絡完整走完一遍流程後,馬上開始嘗試用MobileNet訓練。
還有兩個問題待解決:
1.均值問題。【2017.11.20 解決此問題】
2.無法用MobileNet提供的caffemodel做finetune。 【2017.11.3解決此問題】
【2017.11.03更新】成功轉換成ncnn格式。
一、資料集收集、整理
參考:http://blog.csdn.net/renhanchi/article/details/78411095
用的到的東西如圖:
二、下載下傳MobileNet相關檔案
https://github.com/chuanqi305/MobileNet-SSD
路徑自己看着弄。
三、生成train.prototxt、test.prototxt、deploy.prototxt
這裡哦,我需要提前說點事兒。
1. 預設有一個MobileNet_deploy.prototxt,沒有batch_norm層。可以跟官網提供的caffemodel一起用。
2. template裡面有四個檔案。兩個deploy,一個train,一個test。
經驗證,train和test跟一會我們自己生成的網絡結構一緻。
但我們不用template目錄中的東西,因為後面幾層num_output需要自己手動改。麻煩!
作者提供了兩個工具用于生成prototxt檔案。一個是gen.py一個是gen_model.sh。
我傾向用後者,操作簡單點。
運作指令:
sh gen_model.sh
後面接的數字是類别數+1。
生成的檔案在example目錄下。
這裡有一點哦,如果你的資料集裡面不完全是RGB三通道的。
那麼你要修改train.prototxt和test.prototxt檔案:
- transform_param {
- scale:
- force_color: true ###添加
- mean_value:
- mean_value:
- mean_value:
具體報錯内容可以看我上一篇部落格 http://blog.csdn.net/renhanchi/article/details/78411095。
然後再分别修改檔案中source和label_map_file的路徑,盡量用絕對路徑。
四、修改solver.prototxt檔案
我直接拿來solver_train.prototxt用的,路徑改好,盡量用絕對路徑。其他參數自己看着改吧。
這裡說一下坑了半天的一個問題吧。
一開始為了排錯,我習慣性設定test_initialization為true。
然後就一直提示Couldn’t find ant detections。
但是訓練階段沒問題的。
後來明白問題所在,因為我沒有finetune,是以一開始val階段并不能檢測到任何東西。
将test_initialization 設定為false後,先訓練一段時間後再val,就不會提示找不到東西了。
五、訓練腳本
- #!/bin/sh
- /home/hans/caffe-ssd/build/tools/caffe train \
- --solver= "/home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/doc/solver_train.prototxt \
- -gpu 6 2>&1 | tee /home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/MobileNet-SSD.log
根據下面2017.11.03更新的内容可以看出,訓練結束後,要通過作者提供的工具将bn層和conv層參數merge到一起,以加快計算速度。
修改merge_bn.py中路徑和檔案名。
新生成的模型應該會比原始模型稍微小一點。
六、訓練輸出可視化(2017.11.02)
參考: http://blog.csdn.net/renhanchi/article/details/78411095
七、測試模型效果(2017.11.03)
參考:http://blog.csdn.net/renhanchi/article/details/78411095
後記
為什麼一用pre_trained model做finetune就報錯!!!!!說conv0輸入數量不對(1 vs. 2)。應該是1,結果傳入2個???我各種對比檢查了train.prototxt和test.prototxt檔案,然并卵!!!!
——-【2017.11.3解決不能finetune的問題】——-
終于找到原因!
我把現在能做finetune的模型和deploy檔案放出來。
https://pan.baidu.com/s/16dw-dJ779By9AWdiSOxSuQ
github上作者放出兩個caffemodel,一個是訓練時候的,這個模型bn層和cnov層參數是分開的。一個是deploy的,這個模型将bn層和conv層參數merge到一起了。
作者的原話是merge後的模型速度會快一點。
——-【2017.11.3成功轉換成ncnn格式】———
https://github.com/arlose/ncnn-mobilenet-ssd
.param檔案建議就用上面作者提供的吧。如果是自己訓練的資料的話,把類别數改一下就好了,一共要改八處。
自己轉換過來的有兩個問題,
一是缺少頭兩層Input和Split,這個問題要修改deploy.prototxt檔案開頭為:
- layer {
- name: "data"
- type: "Input"
- top: "data"
- input_param { shape: { dim: dim: dim: dim: } }
- }
二是後面幾層的處理像素變成了600*600。
.bin 檔案一定要用經過merge.py處理過的caffemodel轉換!
——-【2017.11.16更新】———
暈了我之前一直在用6月剛釋出的ncnn,
這兩天移植工作交給我才發現官方的ncnn已經加入ssd的支援。
并且還加入的模型壓縮,雖然隻是從計算位數上做的壓縮,并且對效果會有折扣,但也是很實用的。
——-【2017.11.20更新】———
自帶make_mean.sh并不能求均值,發現有兩個轉lmdb工具,一個帶annotation,一個不帶。
ssd用的帶annotation工具中detection方法轉換的。
我就用老方法求了均值,使用build/tools/convert_imageset 和 build/tools/compute_iamge_mean
shell腳本代碼:
先把圖檔轉換成普通lmdb格式
- #!/bin/sh
- set -e
- size=
- TOOLS=/home/hans/caffe/build/tools
- cur_dir=$(cd $( dirname ${BASH_SOURCE[<span class="hljs-number">0</span>]} ) && pwd )</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">DATA_ROOT=<span class="hljs-string">"${cur_dir}/data/"
- FILE_PATH= "${cur_dir}/doc"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">echo <span class="hljs-string">"Creating train lmdb..."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">GLOG_logtostderr=<span class="hljs-number">1</span> $TOOLS/convert_imageset \
- --resize_height=$size \</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --resize_width=$size \
- --shuffle=false \
- $DATA_ROOT \</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> $FILE_PATH/train.txt \
- $FILE_PATH/train_lmdb_mean</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li></ol></code><div class="hljs-button" data-title="複制"></div></pre><br>計算均值,并将輸出儲存到mean.txt中<p></p><p></p><pre οnclick="hljs.copyCode(event)"><code class="language-python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#!/bin/sh</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">TOOLS=/home/hans/caffe/build/tools</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$TOOLS/compute_image_mean doc/train_lmdb_mean doc/mean.binaryproto >& | tee doc/mean.txt
- echo "Done."