天天看点

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静态库的方式