1. 程式人生 > >計算機視覺caffe之路附1:Ubuntu+Opencv+Caffe開發深度學習常見錯誤及經驗

計算機視覺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專案。


未完待續