1. 程式人生 > >SSD訓練自己資料遇到的問題

SSD訓練自己資料遇到的問題

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的常識,多少也算有點用處。