天天看點

【SSD】用caffe-ssd架構MobileNet網絡訓練自己的資料集,還有訓練可視化連結【SSD】用caffe-ssd架構MobileNet網絡訓練自己的資料集

【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

用的到的東西如圖:

【SSD】用caffe-ssd架構MobileNet網絡訓練自己的資料集,還有訓練可視化連結【SSD】用caffe-ssd架構MobileNet網絡訓練自己的資料集

二、下載下傳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檔案:

  1. transform_param {
  2. scale:
  3. force_color: true ###添加
  4. mean_value:
  5. mean_value:
  6. 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,就不會提示找不到東西了。

五、訓練腳本

  1. #!/bin/sh
  2. /home/hans/caffe-ssd/build/tools/caffe train \
  3. --solver= "/home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/doc/solver_train.prototxt \
  4. -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檔案開頭為:

  1. layer {
  2. name: "data"
  3. type: "Input"
  4. top: "data"
  5. input_param { shape: { dim: dim: dim: dim: } }
  6. }

二是後面幾層的處理像素變成了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格式

  1. #!/bin/sh
  2. set -e
  3. size=
  4. TOOLS=/home/hans/caffe/build/tools
  5. cur_dir=$(cd $( dirname ${BASH_SOURCE[<span class="hljs-number">0</span>]} ) &amp;&amp; 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/"
  6. 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 \
  7. --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 \
  8. --shuffle=false \
  9. $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 \
  10. $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
  11. echo "Done."