天天看點

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

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
  1. 選擇python2的環境
  2. 下載下傳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不報錯就表明安裝成功。顯示如下:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

然後再進行編譯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-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

發現在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…. 如下:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

解決方法:進入到對應的glog.0.3.3.0/build/native,打開glog.targets,到末尾注釋掉這個有關的UsingTask和相應的ProtertyGroup下的内容:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

這三個問題解決後,GPU版本的libcaffe就編譯成功了

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

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的路徑名稱:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

修改後,運作後得到生成test_name_size.txt檔案。下面這個結果就是運作成功的結果:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

create_data.bat

接着同樣複制data/VOC0712下的create_data.bat檔案到caffe的根目錄,修改正确的路徑,執行後得到lmdb的資料。下面這幅圖就是生成成功的結果:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

訓練

這裡有兩種方法,一個用python接口調用VOC0712下ssd_pascal.py和score_ssd_pascal.py來生成相應的訓練和測試網絡檔案,及是否采用GPU計算等參數的設定。另一個就是類似常用windows下實作minst的方法直接調用caffe.exe或者bat檔案調用。不過都要準備兩個東西:訓練的prototxt和一個預訓練的VGGNet的網絡。

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

其中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,注釋掉下面的語句:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

之後就沒問題問題了,開始訓練:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

GPU下的訓練

将solver.prototxt裡面的模式改成GPU,同樣的運作ssd_pascal.bat就可以了。但是當時遇到了一個問題,訓練過程中損失函數loss=1.#QNAN,這明顯是錯誤的結果:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

但是這個問題無法定位,是以最後采取的方法就是從作者的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>());*/
           

這個問題是由于前面的編譯沒注意導緻的。最後編譯成功後,訓練時的正确結果是:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

我設定的最大輪數是60000次,不過也要幾個小時。

檢測部分

檢測有兩種方法,一種用python接口,另一種就是工程下面的ssd_detect項目。前面訓練好的模型會儲存在以下位置:

models\VGGNet\VOC0712\SSD_300x300

第一種方法,因為前面已經編譯了pycaffe子產品很簡單,打開jupyter notebook,進入到examples檔案夾下,打開ssd_detect.ipynb,一路運作下去就可以了,最後的結果如下

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

第二種方法,需要對源檔案做一點修改,分為下面兩個步驟

編譯ssd_detect子產品

找到ssd_detect.cpp,添加如下顯示檢測結果的代碼:

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

修改完後進行編譯,得到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,并顯示目标框。

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

如果是多張圖檔,就在test.txt裡面依次寫入圖檔路徑即可,同樣每一幅圖檔的結果都會顯示出來

Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)與訓練記錄

總結

整個過程真的很折磨,很多頭疼的問題,總之還是覺得不要在windows下跑比較好,坑太多,ubuntu下更加友好。不過在整個過程中也算可以知道該如何準備資料和識别,以及了解一些Caffe的常識,多少也算有點用處。

繼續閱讀