1在windows上面訓練和測試ssd的方法很少,而且配置也相當之麻煩,搞了幾天才調試成功。現在寫一下過程分享到部落格上,順便也可以作為今後再次安裝的參考。我的配置環境:
windows: 10
gpu: Titan X
cuda: 8.0
caffe: caffe-ssd-microsoft
python: 2.7.13
Caffe-SSD的編譯與配置
編譯這部分不打算詳細展開,網上有很多教程,CPU的較多,下面會給出好用的參考教程。這裡推薦一下caffe-ssd-microsoft版本而不是caffe-windows加上caffe-ssd的修改版(網上一些教程是這麼改的),兩個方法都可以,我這裡采用的就是單用caffe-ssd-microsoft的版本。
caffe-ssd-microsoft下載下傳:
https://github.com/conner99/caffe
配置的參考部落格連結:
http://blog.csdn.net/buaalei/article/details/54668507
http://www.jianshu.com/p/9a84cc434e05
這兩個可以配合着看,尤其GPU部分推薦看第二個部落格。反正我前前後後不停地編譯不停地改。
配置caffe-ssd-microsoft
編譯libcaffe子產品
這個就參考上面給的部落格就可以了,我就遇到下面幾個問題:
1. 添加3rdparty的hungarian.h和cpp
在這裡找這個兩個檔案,連結:http://pan.baidu.com/s/1mhYuf7y 密碼:3jp2
2. 注釋掉 detection_output_layer.hpp和detection_output_layer.cu和detection_output_layer.cpp有關regex 的引用和語句
3. C/C++ –> 正常 裡的将警告提示為錯誤修改 為 否
編譯caffe子產品
libcaffe編譯成功後,再進行caffe的編譯,注意點就是要添加opencv的引用目錄和庫目錄。這個不難。
編譯pycaffe子產品
這個可選,如果想用python接口的話這個是必須編譯的,注意的是首先要配置好下面兩個庫的引用和庫目錄
1. python庫目錄
2. opencv庫目錄
之後進行google的protobuf的配置,這個不配置會報錯的。
配置protobuf
配置參考:
http://www.jianshu.com/p/0c563b2c0fdb
- 選擇python2的環境
-
下載下傳protobuf.3.0.0:
下載下傳連結:
https://github.com/google/protobuf/releases/tag/v3.0.0
下載下傳兩個包:protobuf-python-3.0.0.zip 以及 protoc-3.0.0-win32.zip
protobuf-python-3.0.0為protobuf的安裝包
protoc-3.0.0-win32包含protobuf的編譯器protoc的win32版本,用以編譯*.proto檔案。
下載下傳後将protoc-3.0.0-win32\bin\protoc.exe 複制到protobuf-3.0.0\src\
用cmd進入到protoc-3.0.0\python目錄,運作 python setup.py build,生成大量*.py,如下指令
python setup.py build
然後再分别寫入下面兩個指令就可以了。
python setup.py test
python setup.py intall
最後在python環境下,import caffe不報錯就表明安裝成功。顯示如下:
然後再進行編譯pycaffe,編譯成功後将Build/x64/Release/pycaffe下的caffe檔案夾拷貝到Anancoda下面的Lib\site-packages下即可(因為我裝的是Anancoda,其他的也可以找到對應的包目錄)。
編譯get_image_size和convert_annoset子產品
跟前面類似,都是配置好opencv的引用就可以了,目的是為了之後VOC資料的訓練準備用的工具。由于我都是單項目啟動的,是以都是一個一個配置。
注意事項:
NuGet包裡面的opencv預設是2.4.10,以及支援的python都是2.7版本的,如果是opencv3以上的,需要将NuGet包裡對應的opencv解除安裝,重新搜素Opencv3進行配置。python的話最好是用python2,如果沒有可以安裝MiniAnaconda進行雙環境配置,其實Ananconda也可以實作兩個環境。
附送一個python2和python3環境可以切換的安裝方法,是基于Ananconda的
http://blog.csdn.net/infin1te/article/details/50445217
至此前期的配置和準備都已經完成,下一部分是開始SSD的訓練和檢測部分。
GPU編譯的一些問題
CPU照着之前給的教程能很順利的通過編譯,但是GPU我遇到了一些沒有過的問題,有下面幾個:
1.caffe.TransformationsParameters has no filed named “distort_param”。
發現在caffe_pd_h中,對比原Caffe-ssd分支項目中,确實沒有兩組參數DistortionParamter和ExpansionParameter。我的解決方法就是從caffe-ssd/src/proto中的caffe.pb.cc複制過去,然後會報錯:
解決方法: 就是将報錯的檔案都從原ssd檔案中指派過去。這樣就能編譯通過了。
還有一種解決方法就是按照前面的第二個部落格連結(Caffe-Windows+SSD)的方法進行,但是會有其他的一些問題。
2.cudnn路徑沒配置好導緻的錯誤,在CommonSettings.props中,如果已經将cudnn的include和lib都已經合在Cuda中,則去掉Cudnn的路徑;另一種方法就是寫入正确的Cudnn路徑。參考部落格:
http://blog.csdn.net/zb1165048017/article/details/51549105
3.錯誤:error MSB4062:未能從程式集 C:\NuGetPackages\gflags.2.1.2.1 ….coapp.NuGetNativeMSBuildTask.dll 加載任務NuGetPackageOverlay…. 如下:
解決方法:進入到對應的glog.0.3.3.0/build/native,打開glog.targets,到末尾注釋掉這個有關的UsingTask和相應的ProtertyGroup下的内容:
這三個問題解決後,GPU版本的libcaffe就編譯成功了
SSD(single-shot-multibox)模型的訓練和檢測
這一部分的參考教程不多,這是其中一個:
http://blog.csdn.net/muwu5635/article/details/60874721
訓練部分
VOC0712的lmdb資料準備
下載下傳位址:
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
在data\VOC0712下按照上述的順序依次解壓VOC檔案,得到目前目錄下的VOC2007和VOC2012兩個檔案夾。
get_image_size.bat
從data\VOC0712下複制get_image_size.bat到caffe-ssd-microsoft根目錄下,這裡要修改對應的caffe的路徑名稱:
修改後,運作後得到生成test_name_size.txt檔案。下面這個結果就是運作成功的結果:
create_data.bat
接着同樣複制data/VOC0712下的create_data.bat檔案到caffe的根目錄,修改正确的路徑,執行後得到lmdb的資料。下面這幅圖就是生成成功的結果:
訓練
這裡有兩種方法,一個用python接口調用VOC0712下ssd_pascal.py和score_ssd_pascal.py來生成相應的訓練和測試網絡檔案,及是否采用GPU計算等參數的設定。另一個就是類似常用windows下實作minst的方法直接調用caffe.exe或者bat檔案調用。不過都要準備兩個東西:訓練的prototxt和一個預訓練的VGGNet的網絡。
其中SSD_300x300包含:deploy.prototxt、solver.prototxt、train.prototxt和test.prototxt。
下載下傳位址:
https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
下載下傳後将網絡模型放在下面的目錄下:
caffe-ssd-microsoft/models/VGGNet/VOC0712/
然後同樣在caffe目錄下建立一個ssd_pascal.bat檔案,内容如下:
Build\x64\Release\caffe.exe train --solver
=models\VGGNet\VOC0712\SSD_300x300\solver.prototxt -weights
=model\VGGNet\VOC0712\VGG_ILSVRC_16_layers_fc_reduced.caffemodel
記得修改train和test兩個prototxt裡面的source路徑。
運作後會報錯,如下錯誤
Check failed: a<=b(0 vs -1.19209-007)
sgd_solver.cpp:] Iteration ,lr =
math_functions.cpp:] Check failed: a <= b < vs ->
*** Check failure stack trace ***.
解決方法是找到對應的cpp,注釋掉下面的語句:
之後就沒問題問題了,開始訓練:
GPU下的訓練
将solver.prototxt裡面的模式改成GPU,同樣的運作ssd_pascal.bat就可以了。但是當時遇到了一個問題,訓練過程中損失函數loss=1.#QNAN,這明顯是錯誤的結果:
但是這個問題無法定位,是以最後采取的方法就是從作者的ssd檔案中将layer相關的都替換了,但是又出現了新的問題:
caffe.pb.h中提示錯誤:error: expected an identifier.
這個錯誤是由于當時沒在bbox_util.cu中注釋掉thrust相關的内容導緻。
//#include "thrust/functional.h"
//#include "thrust/sort.h"
.....
//thrust::sort_by_key(&confidence[0],&confidence[0]+num_remain,&idx[0],
//thrurst::greater<Dtype>());*/
這個問題是由于前面的編譯沒注意導緻的。最後編譯成功後,訓練時的正确結果是:
我設定的最大輪數是60000次,不過也要幾個小時。
檢測部分
檢測有兩種方法,一種用python接口,另一種就是工程下面的ssd_detect項目。前面訓練好的模型會儲存在以下位置:
models\VGGNet\VOC0712\SSD_300x300
第一種方法,因為前面已經編譯了pycaffe子產品很簡單,打開jupyter notebook,進入到examples檔案夾下,打開ssd_detect.ipynb,一路運作下去就可以了,最後的結果如下
第二種方法,需要對源檔案做一點修改,分為下面兩個步驟
編譯ssd_detect子產品
找到ssd_detect.cpp,添加如下顯示檢測結果的代碼:
修改完後進行編譯,得到exe檔案。
ssd_detect.bat
跟前面的bat檔案路徑一緻,添加如下内容
.\Build\x64\Release\ssd_detect.exe models\VGGNet\VOC0712\SSD_300x300\deploy.prototxt
models\VGGNet\VOC0712\SSD_300x300\VGG_VOC0712
_SSD_300x300_iter_60000.model
models\VGGNet\VOC012\SSD_300x300\test.txt
–file_type image
confidence_threshold 0.5
pause
這裡要注意的是修改deploy.prototxt裡面的output_directory路徑,同時test.txt存的是檢測圖檔的路徑。
檢測結果
最後會在cmd中顯示目标的位置和confidence,并顯示目标框。
如果是多張圖檔,就在test.txt裡面依次寫入圖檔路徑即可,同樣每一幅圖檔的結果都會顯示出來
總結
整個過程真的很折磨,很多頭疼的問題,總之還是覺得不要在windows下跑比較好,坑太多,ubuntu下更加友好。不過在整個過程中也算可以知道該如何準備資料和識别,以及了解一些Caffe的常識,多少也算有點用處。