相信大家遇到过类似的问题,想要在工程中使用自己的caffe源代码,但是问题却很多,头大?!,那就看这篇文章吧,有不懂的可以提问相互交流,我在解决的过程中也有不少贵人热心帮助。
第一部分:问题说明
在自己的工程中使用caffe源代码,无外乎就两种(简单的)方法,一是直接使用源代码,二是封装好自己的类,导出dll外部使用。
首先说第一种方法,会遇到很多问题,比如层未定义(Unknown layer type)、重复注册(already registered),如果在MFC中使用,还会遇到caffe.pb.h文件相关的错误、GLOG_NO_ABBREVIATED_SEVERITIES未定义等常见错误,虽然也有不少解决办法
Check failed:registry.count(type)==1(0 vs.1)Unknown layer type
在控制台和mfc平台下调用caffe库会出现的bug及解决办法
虽然在控制台下直接使用源码的问题得到了解决,但是在MFC(QT)中使用caffe源码就比较困难,即使在控制台下直接使用源码,每次编译时间也很长,因此导出dll就成为不二之选。
第二部分:导出dll
第一次导出dll比较随便,.h文件大概是这样的
导出之后,不管是在控制台或者MFC(QT)中使用caffe源码,虽然都能正确编译后,但双击运行就出现停止运行的提示,截图如下
后来在Caffe CN社区官方QQ群请教,有一个热心人说他已经解决了,并且成功在MFC中使用caffe源码,他指点说.h文件不要有和caffe相关的特性,所有caffe细节都在.cpp文件中实现。根据他的指示,我第二次导出dll时的.h文件是这样的
但是奇怪的是问题依然没有解决,有时候都怀疑是不是自己人品不好,折腾很久之后,我想看看控制台程序中调用这个dll有没有什么提示,果然发现确实有提示,之前是在MFC中调用的,所以看不到提示
然后根据这个提示,谷歌了很久,终于发现了问题
https://groups.google.com/forum/#!msg/caffe-users/YMyTDo3XISo/iI91-r3WAgAJ
大概意思是全局变量导致的,然后我回想.cpp的实现,也是将caffe相关的变量都以全局变量的形式放在.cpp文件中,后来根据这个提示,修改了.cpp实现,这里简要描述下原理
修改后的.cpp实现是这样的
class my_caffe//实现细节都在这个类中
{
public:
my_caffe(X,Y,Z);
predict(A);
Net net_;
...
}
my_caffe * pCaffe;
caffe_dll::caffe_dll(X,Y,Z)
{
pCaffe = new my_caffe(X,Y,Z);
...
}
caffe_dll::predict(B)
{
pCaffe->predict(B);
}
...
.h文件只含有caffe_dll相关的接口。
修改.cpp之后导出的dll,可以在MFC(QT)、win32以及其他工程中方便的调用。
转载请注明出处,感谢给予我帮助的热心人和网上的教程,谢谢大家。