SSD訓練自己資料遇到的問題
阿新 • • 發佈:2019-01-08
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
1
然後再分別寫入下面兩個命令就可以了。
python setup.py test
python setup.py intall
1
2
最後在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
1
2
3
記得修改train和test兩個prototxt裡面的source路徑。
執行後會報錯,如下錯誤
Check failed: a<=b(0 vs -1.19209-007)
sgd_solver.cpp:106] Iteration 13100,lr = 0.001
math_functions.cpp:250] Check failed: a <= b <0 vs -1.19209e-007>
*** Check failure stack trace ***.
1
2
3
解決方法是找到對應的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>());*/
1
2
3
4
5
這個問題是由於前面的編譯沒注意導致的。最後編譯成功後,訓練時的正確結果是:
我設定的最大輪數是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的常識,多少也算有點用處。