天天看點

Caffe實戰:caffe編譯和使用過程中遇到的問題彙總(持續更新......) - 懸崖邊上打坐

Caffe實戰:caffe編譯和使用過程中遇到的問題彙總(持續更新......)

【問題一】error MSB4062: 未能從程式集...加載任務

error MSB4062: 未能從程式集 E:\NugetPackages\OpenCV.2.4.10\build\native\\private\coapp. NuGetNativeMSBuildTasks.dll 加載任務“NuGetPackageOverlay”。未能加載檔案或程式集“file:///E:\NugetPackages\ OpenCV.2.4.10\build\native\private\coapp.NuGetNativeMSBuildTasks.dll”或它的某一個依賴項。系統找不到指定的檔案。

解決辦法:把NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props檔案下的"\private"前面的‘/’去掉

類似的,如果提示gflag或glog這類的錯誤,修改方法同上。

【問題二】編譯libcaffe CPU版本時沒有任何問題,但是編譯GPU版本時竟然提示【問題一】中所示問題?

有網友說是cuda和cuddn版本不相容問題,caffe支援cuddn 4和5版本。網上衆說紛纭,我也沒有嘗試。

還好自己保持的有原先的版本,隻是将libcaffe工程目錄中的檔案替換成先前的版本,然後重新編譯,cuda版本竟然通過了。但是cuddn版本還是沒有通過,可能真的是版本問題。

再來梳理下該問題,編譯cpu和gpu時沒有出現【問題一】,但是添加cudnn時出現該問題,說明是cudnn的版本不比對。Microsoft caffe版本一般支援cudnn 4或5版本,而自己筆記本上安裝的是cuda 10版本,對應的最老的cudnn版本也高于5版本了。于是安裝了cuda 8 + cudnn 5版本。但編譯gpu(沒有添加cudnn)是又開始報錯了,确實很郁悶,搜集網上的讨論,彙總下來:

(1)如果編譯cpu版本就報該問題,則按照【問題一】中的解決方法;

(2)如果編譯cpu版本沒有問題,但是編譯gpu版本出現問題,則一般清理工程,重新編譯;或者清理工程,重新打開vs,再重新編譯;有時重新開機電腦就好了;或者用管理者的身份打開vs(通過管理者cmd打開)等操作-貌似很管用;

(3)如果編譯cpu,cuda都沒有問題,添加cudnn有問題,則一般是cudnn版本不相容問題;檢視caffe支援的cudnn版本(一般是cudnn4,5);再檢視安裝的cuda和cudnn版本是否對應(cuda有不同的版本,支援的平台之分,而cudnn有與之對應的版本),網上有cuda8.0+cudnn5.1成功案例;如果還存在問題隻能按照上面的方法都嘗試一遍,碰運氣吧。

參考: https://bbs.csdn.net/topics/392062086

終極解決方案:

(1)右鍵工程-->管理NuGet程式包,将opencv2.4.10版本更新到opencv2.4.11版本;

(2)重新清理,編譯;

(3)**每個工程都進行更新操作。(一定要把所有使用到Opencv的工程都更新)

一個快捷的方法:右鍵解決方案\'caffe\'-->管理NuGet程式包,将opencv2.4.10版本更新到opencv2.4.11版本;會把整個解決方案中的所有用到opencv的工程都進行同步更新。

困擾了2天的超級變态問題終于解決了,原來僅僅隻是更新下opencv版本就徹底解決了。

【關于提示未能從程式集...加載任務之類問題的小結】

  • 第一步:檢查錯誤提示路徑private前面是否多了一個"\",如“E:\NugetPackages\OpenCV.2.4.10\build\native\\private\”所示;如果存在,則将xxx.props檔案下的"\private"前面的‘/’去掉。【參考問題一解決方法】
  • 第二步:如果提示關于opencv的錯誤,則更新依賴庫,或者重新安裝;例如,在管理NuGet程式包中,将opencv2.4.10更新到opencv2.4.11版本;【參考問題二解決方法】
  • 第三步:對于提示glog(gflag)這類錯誤,而glog又沒有更新提示,則可以解除安裝glog,然後再重新聯機搜尋安裝;(注意glog依賴 于gflag,安裝/解除安裝glog時自動安裝/解除安裝gflag)

                       或者将gflags.2.1.2.1-->gflags.2.0.1.0(自己試驗時發現效果并不好)

                       有時會出現時而編譯(GPU版本)正确,時而提示glog(gflag)錯誤(問題一),從錯誤提示上看路徑完全正确,但是就是加載不成功,很可能是由于另外一個程式正在使用(NuGet程式),導緻無法加載;這時候,解決的辦法就是重新開機  vs,釋放加載glog/gflag的程序;或者删除..\NugetPackages\gflags.2.1.2.1,然後重新編譯(nuGet重新下載下傳gflags)。(最有效,但是需要重新加載)

(備注:由于nuGet重新下載下傳依賴包太慢了,可以關閉vs,剪切gflags.2.1.2.1到其它地方,通過是否剪切成功來判斷gflags是否被占用)

後來經過多次編譯測試,發現出現【問題一】(有時編譯成功,有時失敗情況)的根本原因,是NuGet程序占用了gflag或者opencvXX檔案,導緻重新編譯時無法正常編譯;最有效的方法是打開任務管理器,中斷NuGet程序。

參考:Caffe學習(一):安裝Windows版Caffe與Faster RCNN過程中的報錯及解決方法

【問題三】fatal error C1083: 無法打開包括檔案: “opencv2/core/core.hpp”: No such file or directory

在編譯libcaffe時提示這個錯誤,說明沒有添加opencv頭檔案目錄。

解決方法1:最簡單的方法是,将NugetPackages\OpenCV.2.4.10\build\native\include路徑添加到工程中。

但是,其它依賴庫的頭檔案,比如gflag頭檔案都能正常加載,為何opencv的路徑沒有正常加載呢?于是檢視了libcaffe工程下的“packages.config”檔案,發現沒有關于opencv的包内容,原來是預設編譯libcaffe時沒有加載關于opencv的相關内容,但是預處理器中包含了USE_OPENCV的宏,于是需要包含Opencv的頭檔案目錄,但是找不到相應的路徑。知道引起的原因,可以進行以下修改。

解決方法2

第一步:在“packages.config”檔案中添加opencv;可以參考caffe工程下面的“packages.config”檔案

第二步:“libcaffe.vcxproj”檔案,添加導入opencv project内容;可以參考“caffe.vcxproj”檔案的對應部分

這樣就添加了關于opencv需要的頭檔案,庫檔案路徑等資訊。

神秘的消失:檢視原先的libcaffe工程下的packages.config”檔案和“libcaffe.vcxproj”檔案中都包含有opencv内容,而這個版本的檔案中為何沒有opencv内容?手動删了?不可能,它又是怎麼消失的?

【問題四】caffe 安裝時提示cudnn.hpp(114): too few arguments in function call

這是由于cudnn6.0及以上版本在調用cudnnSetConvolution2dDescriptor還需要dataType::type類型的參數,是以在缺失的地方補上對應的CUDNN_DATA_FLOAT或CUDNN_DATA_DOUBLE即可。

在cudnn.hpp中cudnnSetConvolution2dDescriptor的正确調用方法:

template <typename Dtype>
inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv,
    cudnnTensorDescriptor_t bottom, cudnnFilterDescriptor_t filter,
    int pad_h, int pad_w, int stride_h, int stride_w) {
#if CUDNN_VERSION_MIN(6, 0, 0)
  CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
      pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION,
      dataType<Dtype>::type));
#else
    CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
      pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION));
#endif
}      

【問題五】建立工程,導入libcaffe.lib靜态庫,編譯時提示“error LNK2038: 檢測到“_ITERATOR_DEBUG_LEVEL”的不比對項: 值“0”不比對值“2”

産生這個問題的原因是目前工程的Debug版本,與引用的庫檔案libcaffe.lib時的Debug版本的運作庫類型不一緻造成的。

解決方法:

  • 檢查工程的版本和libcaffe.lib版本是否一緻,即工程是Debug版本的,調用Debug版本的libcaffe.lib;
  • 檢查工程版本的運作庫類型與libcaffe.lib的運作庫類型是否一緻;

【問題六】建立工程,導入libcaffe.lib建立網絡對象時提示“Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Input (known types: Input )”類似的問題。

這個問題出現在:相同的代碼在microsoft版本的caffe裡使用就沒有問題,自己建立一個項目就出錯。

錯誤的原因是沒有執行個體化InputLayer和注冊Input類型。在input_layer.cpp中的最後可以看到

INSTANTIATE_CLASS(InputLayer);
REGISTER_LAYER_CLASS(Input);      

每個層都有類似的操作。而我們在建立的項目中,似乎沒有執行個體化層和注冊對應的類型造成的(具體有什麼用還真不知道)。

解決方法:建立一個head.h頭檔案,将相應層(用到哪些層就包含哪些層的注冊資訊)的這些資訊包含進去。如下所示:

#ifndef HEAD_H_
#define HEAD_H_
#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
namespace caffe
{
     extern INSTANTIATE_CLASS(InputLayer);
     //REGISTER_LAYER_CLASS(Input);
     extern INSTANTIATE_CLASS(ConvolutionLayer);
     REGISTER_LAYER_CLASS(Convolution);
     extern INSTANTIATE_CLASS(ReLULayer);
     REGISTER_LAYER_CLASS(ReLU);
     extern INSTANTIATE_CLASS(PoolingLayer);
     REGISTER_LAYER_CLASS(Pooling);
     extern INSTANTIATE_CLASS(LRNLayer);
     REGISTER_LAYER_CLASS(LRN);
     extern INSTANTIATE_CLASS(DropoutLayer);
     //REGISTER_LAYER_CLASS(Dropout);
     extern INSTANTIATE_CLASS(InnerProductLayer);
     extern INSTANTIATE_CLASS(SoftmaxLayer);
     REGISTER_LAYER_CLASS(Softmax);
}
#endif      

注意一點,如果提示某某類型已經注冊過了,則将相應的REGISTER_LAYER_CLASS注釋掉。

參考:【邊喝caffee邊Caffe 】(三) Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type

【問題七】在windows平台上編譯libcaffe庫,caffe.exe工具以及pycaffe和matcaffe接口時,有時會提示“object将警告視為錯誤”或者"opnecv...依賴項找不到...”等這方面的問題?

這是由于編譯器将某些警告視為錯誤處理,導緻編譯失敗;可以通過“右鍵工程-->選擇屬性-->C/C++-->正常-->将警告視為錯誤-->改為否”

【問題八】編譯caffe debug版本時,提示關于"找不到,打不開opencv相應的....."類似這個問題?

點選問題,指向opencv版本的标記。當時以為是因為找不到opencv debug版本的庫造成的,因為一開始是在Release版本下編譯的,自動下載下傳依賴包,或許僅僅隻下載下傳release版本的相應庫吧。于是,把依賴封包件移除,在Debug版本下重新下載下傳依賴包,進行編譯,無奈下載下傳依賴包太慢了。

後來,改為僅支援CPU模式(不采用GPU)進行Debug版本編譯,發現沒有問題,正常編譯(還是原先的依賴包);然後,又改為支援cuda模型進行debug版本編譯,同樣沒有問題。這就很奇怪了,沒有更新依賴庫,隻是先用cpu模式編譯了一遍,然後再編譯支援cuda模式的debug版本,一切正常。這該任何解釋???

參見【問題二】的解決方法:更新下opencv庫的版本

【問題九】提示無法連接配接“libboost_regex-vc120-mt-sgd-1_62.lib”或者提示未找到boost_regex-vc120.1.59.0/...中檔案

Install-Package boost_regex-vc120 -Version 1.59.0 -Source D:\路徑

這個錯誤主要是在編譯caffe工具時提示的,大概的意思是nuGet沒有安裝boot_regex-vc120.1.59.0這個依賴庫。查找caffe.vcxproj和packages.config檔案發現确實需要這個庫,但是在Packages.dgml中沒有相關的資訊,是以猜測導緻nuGet沒有下載下傳這個庫。

但是檢視原先的windous-caffe版本中(最初版本),caffe.vcxproj和packages.config檔案中不需要這個庫,不清楚到底怎麼添加上去的,幹脆将這兩個檔案中的關于這個庫的資訊删除。

【問題九】在調用/使用libcaffe.lib靜态庫時,經常會提示“Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type的錯誤”?

【Caffe實戰】正确使用libcaffe.lib靜态庫的方式