在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type的错误,如下图:
这里参考网上资料汇总了几种解决方法:
1. 不使用Caffe的静态库,直接将Caffe的source加入到main工程中;
2. 将Caffe编译成动态库;
3. 使用Caffe静态库,新建一个caffe_layers_registry.hpp头文件,文件中的内容如下(部分代码段,需要将所有的层全部列出来),并且需要将此头文件include到其它文件的上面:
#include "caffe/common.hpp" // may be need to include other head files namespace caffe { extern INSTANTIATE_CLASS(ConvolutionLayer); extern INSTANTIATE_CLASS(PoolingLayer); extern INSTANTIATE_CLASS(ReLULayer); extern INSTANTIATE_CLASS(TanHLayer); // other layer // may be need to REGISTER_LAYER_CREATOR() }
4. 使用Caffe静态库,选中Caffe_Test工程 --> 右键,属性--> 通用属性 --> 引用 --> 添加引用 --> caffe(此caffe工程为caffe静态库工程) --> 项目引用属性 --> 链接库依赖项设置为True,使用库依赖项输入设置为True,如下图:
5. 使用Caffe静态库,在原有src/caffe/net.cpp文件中,添加如下代码段:
#define FORCE_REG(type) \ extern LayerRegisterer<float> g_creator_f_##type; \ extern LayerRegisterer<double> g_creator_d_##type; \ LayerRegisterer<float> *__g_creator_f_##type = &g_creator_f_##type; \ LayerRegisterer<double> *__g_creator_d_##type = &g_creator_d_##type FORCE_REG(TanH); FORCE_REG(Pooling); FORCE_REG(ReLU); FORCE_REG(Sigmoid); FORCE_REG(Softmax); FORCE_REG(Dropout); FORCE_REG(Convolution); FORCE_REG(Deconvolution); FORCE_REG(Concat); FORCE_REG(BNLL); FORCE_REG(Flatten); FORCE_REG(InnerProduct); FORCE_REG(Eltwise); FORCE_REG(Power); FORCE_REG(LRN); FORCE_REG(MemoryData); FORCE_REG(Data); FORCE_REG(Split); FORCE_REG(Reshape); FORCE_REG(Im2col); FORCE_REG(Slice); FORCE_REG(PReLU); FORCE_REG(SoftmaxWithLoss); FORCE_REG(Accuracy);
以上第4种、第5种方法亲自测试过可以正常调用Caffe静态库,但是依赖的Caffe源码比较老,后面会更新到最新版本。