計算機視覺caffe之路附1:Ubuntu+Opencv+Caffe開發深度學習常見錯誤及經驗
1.Opencv3.1編譯,CUDA版本大於8.0引起
/home/usrname/OpenCV-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54:
error: ‘NppiGraphcutState‘ has not been declared typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat
解決方法:
進入opencv-3.1.0/modules/cudalegacy/src/目錄,修改graphcuts.cpp檔案,將:
#include "precomp.hpp"
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
改為
#include "precomp.hpp"
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
2.GPU選擇錯誤
Check failed: error == cudaSuccess (10 vs. 0) invalid device ordinal
原因:GPU選擇錯誤caffe.set_device(1)
。
解決方法:
改為
caffe.set_device(0)
Jetson TX1只有一個GPU,#0。
3.影象模式錯誤:非RGB
在訓練自己資料集時報出如下兩類錯誤:
OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cvtColor, file /ssda/software/opencv-3.1.0/modules/imgproc/src/color.cpp, line 8141
terminate called after throwing an instance of 'cv::Exception'
或者:
annotated_data_layer.cpp:205] Check failed: std::equal(top_shape.begin() + 1, top_shape.begin() + 4, shape.begin() + 1)
原因:資料集圖片內混有非RGB模式圖片,如灰度圖(L),img.mode='L'
。
解決方法:
- 去掉非RGB圖片。
- python轉換L為RGB:
img = img.convert("RGB")
img.save(dir+'/' + name + '.jpg')
4. mbox_loss = 0 (* 1 = 0 loss)
原因是資料集製作錯誤,如果使用VOC作為參考,需要嚴格按照其格式,包括資料型別,例如bndbox:
<bndbox>
<xmin>60</xmin>
<ymin>27</ymin>
<xmax>385</xmax>
<ymax>331</ymax>
</bndbox>
解決方法:
bndbox引數必須為整數,如果是小數<xmin>60.0</xmin>
,執行時不會報錯,但是訓練模型不會成功,持續是loss=0。
5. bndbox引數超出影象尺寸
錯誤現象:
xml bounding box irregular
解決方法:
修改bndbox引數,使其不超過圖片尺寸。
6.找不到或打不開圖片檔案
在製作資料集的過程中,經常出現can not open or find ..pic.jpg
之類的找不到圖片的錯誤,但是路徑是正確的,檔案也存在。
原因:圖片列表檔案train.txt、val.txt或者trainval.txt、test.txt的換行符包含’\r’,這是由windows匯入到Linux下出現的
解決方法:
將’\r\n’全部替換’\n’。
7.關於學習率的設定:base_lr
不能設定太大,數十次迭代之後就會出現Nan;
不能設定太小,否則loss基本不會下降;
受制於GPU視訊記憶體大小,通常batch_size不可能設定成容納全部圖片,Jetson TX1訓練ssd時只能設定為4,還是在不test的情況下,因此loss波動會很厲害,但是是正常現象,並非學習率設定太大導致的波動,進而改小學習率導致始終無法下降。
通常設定初始學習率base_ir為0.0001,stepsize為20000。實際訓練總,設定合適的snapshot,多儲存快照,根據 計算機視覺caffe之路第五篇:ImageNet資料集訓練及預測例項中繪製loss曲線的方法監控loss下降趨勢,如果發現loss不下降,這適當調大base_lr,通常是成倍的增加,自制loss有效下降。
此外可以學習下這篇論文:http://cilvr.nyu.edu/lib/exe/fetch.php?media=deeplearning:dl-optimization.pdf
8.cv::imshow不顯示圖片
cv::VideoCapture cap(0);//0表示攝像頭id
//cap.open("test.avi"); //或者開啟視訊
cv::namedWindow("video",1);
for(;;){
cv::Mat frame;
cap<<frame;
if(frame.empty())
break;
cv::imshow("video",frame);
cv::waitKey(10) //!!!
}
注意最後一定要加上waitKey(10)
,否則顯示視窗不會顯示,原因是迴圈中,highgui沒有給予imshow繪製處理的時間。
9.LNK1104 無法開啟檔案“opencv_dep_cudart.lib”
用vs2015編譯有些opencv專案時出現此編譯錯誤。
解決方法:
在專案-屬性-聯結器-輸入-附加庫目錄中,刪除opencv_dep_cudart.lib專案。
未完待續