天天看點

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

      • Opencv31編譯CUDA版本大于80引起
      • GPU選擇錯誤
      • 圖像模式錯誤非RGB
      • mbox_loss 0 1 0 loss
      • bndbox參數超出圖像尺寸
      • 找不到或打不開圖檔檔案
      • 關于學習率的設定base_lr
      • cvimshow不顯示圖檔
      • LNK1104 無法打開檔案opencv_dep_cudartlib

1.Opencv3.1編譯,CUDA版本大于8.0引起

/home/usrname/OpenCV-/modules/cudalegacy/src/graphcuts.cpp::: 
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選擇錯誤

原因:GPU選擇錯誤

caffe.set_device(1)

解決方法:

改為

caffe.set_device(0)

Jetson TX1隻有一個GPU,#0。

3.圖像模式錯誤:非RGB

在訓練自己資料集時報出如下兩類錯誤:

OpenCV Error: Assertion failed ((scn ==  || scn == ) && (depth == CV_8U || depth == CV_32F)) in cvtColor, file /ssda/software/opencv-/modules/imgproc/src/color.cpp, line 
terminate called after throwing an instance of 'cv::Exception'
           

或者:

annotated_data_layer.cpp:] Check failed: std::equal(top_shape.begin() + , top_shape.begin() + , shape.begin() + ) 
           

原因:資料集圖檔内混有非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表示攝像頭id  
//cap.open("test.avi");  //或者打開視訊
cv::namedWindow("video",);  
for(;;){  
 cv::Mat frame;  
 cap<<frame;  
 if(frame.empty())  
    break;  
 cv::imshow("video",frame);  
 cv::waitKey()  //!!!
}  
           

注意最後一定要加上

waitKey(10)

,否則顯示視窗不會顯示,原因是循環中,highgui沒有給予imshow繪制處理的時間。

9.LNK1104 無法打開檔案“opencv_dep_cudart.lib”

用vs2015編譯有些opencv項目時出現此編譯錯誤。

解決方法:

在項目-屬性-連接配接器-輸入-附加庫目錄中,删除opencv_dep_cudart.lib項目。

未完待續

繼續閱讀