Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)与训练记录
1在windows上面訓練和測試ssd的方法很少,而且配置也相當之麻煩,搞了幾天才調(diào)試成功。現(xiàn)在寫一下過程分享到博客上,順便也可以作為今后再次安裝的參考。我的配置環(huán)境:
windows: 10?
gpu: Titan X?
cuda: 8.0?
caffe: caffe-ssd-microsoft?
python: 2.7.13
Caffe-SSD的編譯與配置
編譯這部分不打算詳細展開,網(wǎng)上有很多教程,CPU的較多,下面會給出好用的參考教程。這里推薦一下caffe-ssd-microsoft版本而不是caffe-windows加上caffe-ssd的修改版(網(wǎng)上一些教程是這么改的),兩個方法都可以,我這里采用的就是單用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有關(guān)regex 的引用和語句?
3. C/C++ –> 常規(guī) 里的將警告提示為錯誤修改 為?否
編譯caffe模塊
libcaffe編譯成功后,再進行caffe的編譯,注意點就是要添加opencv的引用目錄和庫目錄。這個不難。
編譯pycaffe模塊
這個可選,如果想用python接口的話這個是必須編譯的,注意的是首先要配置好下面兩個庫的引用和庫目錄?
1. python庫目錄?
2. opencv庫目錄?
之后進行g(shù)oogle的protobuf的配置,這個不配置會報錯的。
配置protobuf
配置參考:
http://www.jianshu.com/p/0c563b2c0fdb
下載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,如下命令
- 1
然后再分別寫入下面兩個命令就可以了。
python setup.py testpython setup.py intall- 1
- 2
最后在python環(huán)境下,import caffe不報錯就表明安裝成功。顯示如下:?
然后再進行編譯pycaffe,編譯成功后將Build/x64/Release/pycaffe下的caffe文件夾拷貝到Anancoda下面的Lib\site-packages下即可(因為我裝的是Anancoda,其他的也可以找到對應(yīng)的包目錄)。
編譯get_image_size和convert_annoset模塊
跟前面類似,都是配置好opencv的引用就可以了,目的是為了之后VOC數(shù)據(jù)的訓練準備用的工具。由于我都是單項目啟動的,所以都是一個一個配置。?
注意事項:
NuGet包里面的opencv默認是2.4.10,以及支持的python都是2.7版本的,如果是opencv3以上的,需要將NuGet包里對應(yīng)的opencv卸載,重新搜素Opencv3進行配置。python的話最好是用python2,如果沒有可以安裝MiniAnaconda進行雙環(huán)境配置,其實Ananconda也可以實現(xiàn)兩個環(huán)境。
附送一個python2和python3環(huán)境可以切換的安裝方法,是基于Ananconda的
http://blog.csdn.net/infin1te/article/details/50445217
至此前期的配置和準備都已經(jīng)完成,下一部分是開始SSD的訓練和檢測部分。
GPU編譯的一些問題
CPU照著之前給的教程能很順利的通過編譯,但是GPU我遇到了一些沒有過的問題,有下面幾個:?
1.caffe.TransformationsParameters has no filed named “distort_param”。?
?
發(fā)現(xiàn)在caffe_pd_h中,對比原Caffe-ssd分支項目中,確實沒有兩組參數(shù)DistortionParamter和ExpansionParameter。我的解決方法就是從caffe-ssd/src/proto中的caffe.pb.cc復制過去,然后會報錯:
解決方法: 就是將報錯的文件都從原ssd文件中賦值過去。這樣就能編譯通過了。
還有一種解決方法就是按照前面的第二個博客鏈接(Caffe-Windows+SSD)的方法進行,但是會有其他的一些問題。
2.cudnn路徑?jīng)]配置好導致的錯誤,在CommonSettings.props中,如果已經(jīng)將cudnn的include和lib都已經(jīng)合在Cuda中,則去掉Cudnn的路徑;另一種方法就是寫入正確的Cudnn路徑。參考博客:
http://blog.csdn.net/zb1165048017/article/details/51549105
3.錯誤:error MSB4062:未能從程序集 C:\NuGetPackages\gflags.2.1.2.1 ….coapp.NuGetNativeMSBuildTask.dll 加載任務(wù)NuGetPackageOverlay…. 如下:?
?
解決方法:進入到對應(yīng)的glog.0.3.3.0/build/native,打開glog.targets,到末尾注釋掉這個有關(guān)的UsingTask和相應(yīng)的ProtertyGroup下的內(nèi)容:?
這三個問題解決后,GPU版本的libcaffe就編譯成功了?
SSD(single-shot-multibox)模型的訓練和檢測
這一部分的參考教程不多,這是其中一個:
http://blog.csdn.net/muwu5635/article/details/60874721
訓練部分
VOC0712的lmdb數(shù)據(jù)準備
下載地址:
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根目錄下,這里要修改對應(yīng)的caffe的路徑名稱:?
修改后,運行后得到生成test_name_size.txt文件。下面這個結(jié)果就是運行成功的結(jié)果:?
create_data.bat
接著同樣復制data/VOC0712下的create_data.bat文件到caffe的根目錄,修改正確的路徑,執(zhí)行后得到lmdb的數(shù)據(jù)。下面這幅圖就是生成成功的結(jié)果:?
訓練
這里有兩種方法,一個用python接口調(diào)用VOC0712下ssd_pascal.py和score_ssd_pascal.py來生成相應(yīng)的訓練和測試網(wǎng)絡(luò)文件,及是否采用GPU計算等參數(shù)的設(shè)置。另一個就是類似常用windows下實現(xiàn)minst的方法直接調(diào)用caffe.exe或者bat文件調(diào)用。不過都要準備兩個東西:訓練的prototxt和一個預訓練的VGGNet的網(wǎng)絡(luò)。?
?
其中SSD_300x300包含:deploy.prototxt、solver.prototxt、train.prototxt和test.prototxt。?
下載地址:
https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
下載后將網(wǎng)絡(luò)模型放在下面的目錄下:
caffe-ssd-microsoft/models/VGGNet/VOC0712/
然后同樣在caffe目錄下新建一個ssd_pascal.bat文件,內(nèi)容如下:
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- 1
- 2
- 3
記得修改train和test兩個prototxt里面的source路徑。
運行后會報錯,如下錯誤?
Check failed: a<=b(0 vs -1.19209-007)
- 1
- 2
- 3
解決方法是找到對應(yīng)的cpp,注釋掉下面的語句:?
之后就沒問題問題了,開始訓練:?
GPU下的訓練
將solver.prototxt里面的模式改成GPU,同樣的運行ssd_pascal.bat就可以了。但是當時遇到了一個問題,訓練過程中損失函數(shù)loss=1.#QNAN,這明顯是錯誤的結(jié)果:?
但是這個問題無法定位,所以最后采取的方法就是從作者的ssd文件中將layer相關(guān)的都替換了,但是又出現(xiàn)了新的問題:?
caffe.pb.h中提示錯誤:error: expected an identifier.?
這個錯誤是由于當時沒在bbox_util.cu中注釋掉thrust相關(guān)的內(nèi)容導致。
- 1
- 2
- 3
- 4
- 5
這個問題是由于前面的編譯沒注意導致的。最后編譯成功后,訓練時的正確結(jié)果是:?
?
我設(shè)置的最大輪數(shù)是60000次,不過也要幾個小時。
檢測部分
檢測有兩種方法,一種用python接口,另一種就是工程下面的ssd_detect項目。前面訓練好的模型會保存在以下位置:
models\VGGNet\VOC0712\SSD_300x300
第一種方法,因為前面已經(jīng)編譯了pycaffe模塊很簡單,打開jupyter notebook,進入到examples文件夾下,打開ssd_detect.ipynb,一路運行下去就可以了,最后的結(jié)果如下?
第二種方法,需要對源文件做一點修改,分為下面兩個步驟
編譯ssd_detect模塊
找到ssd_detect.cpp,添加如下顯示檢測結(jié)果的代碼:
?
修改完后進行編譯,得到exe文件。
ssd_detect.bat
跟前面的bat文件路徑一致,添加如下內(nèi)容
.\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存的是檢測圖片的路徑。
檢測結(jié)果
最后會在cmd中顯示目標的位置和confidence,并顯示目標框。?
?
如果是多張圖片,就在test.txt里面依次寫入圖片路徑即可,同樣每一幅圖片的結(jié)果都會顯示出來?
總結(jié)
整個過程真的很折磨,很多頭疼的問題,總之還是覺得不要在windows下跑比較好,坑太多,ubuntu下更加友好。不過在整個過程中也算可以知道該如何準備數(shù)據(jù)和識別,以及了解一些Caffe的常識,多少也算有點用處。
總結(jié)
以上是生活随笔為你收集整理的Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)与训练记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSD框架训练自己的数据集
- 下一篇: voc_eval.py:41: Runt