window10+caffe(新版)+自己工程

佐手、 提交于 2020-04-06 08:42:05

由于最近在搞工程的东西,caffe在windows10下的一些东西编译时通过了,可是如何添加一个自己的工程呢?

模仿classification的例子是可以跑,但是添加自己工程会报错。头疼。。。。。。。。
大概大家报错都会遇到Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Input (known types: Input )问题吧。
首先试一下,http://blog.csdn.net/fengbingchun/article/details/54286435。
提供了几种解决方案。
我是按照fengbingchun的说明来的,好像不行。




然后又试了几个网上的方法,还是不过,这个错误好像是由于caffe在layer_factory.hpp里面的creator这儿出错了,因为是个工厂模式,重复注册,所以注册一次之后再注册就不行了。



解决方案:
自己的工程所有的include和lib路径添加好之后,然后添加过libcaffe引用。成功编译,但是运行就会遇到报错
F0519 14:54:12.494139 14504 layer_factory.hpp:77] Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Input (known types: Input )
按网上的方法,解决这个问题可以新建一个头文件,在用到的地方包含这个头文件,内容例如下面,运行时报Unknown哪层就往里面添加那层。



#ifndef CAFFE_REG_H
#define CAFFE_REG_H
#include "caffe/common.hpp"  
#include "caffe/layers/input_layer.hpp"  
#include "caffe/layers/inner_product_layer.hpp"  
#include "caffe/layers/dropout_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/softmax_layer.hpp"  
#include "caffe/layers/normalize_layer.hpp"
#include "caffe/layers/permute_layer.hpp"
#include "caffe/layers/flatten_layer.hpp"
#include "caffe/layers/prior_box_layer.hpp"
#include "caffe/layers/concat_layer.hpp"
#include "caffe/layers/reshape_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
#include "caffe/layers/detection_output_layer.hpp"
namespace caffe
{
extern INSTANTIATE_CLASS(InputLayer);
extern INSTANTIATE_CLASS(ConvolutionLayer);
REGISTER_LAYER_CLASS(Convolution);
extern INSTANTIATE_CLASS(InnerProductLayer);
extern INSTANTIATE_CLASS(DropoutLayer);
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(SoftmaxLayer);
//REGISTER_LAYER_CLASS(Softmax);
extern INSTANTIATE_CLASS(NormalizeLayer);
//REGISTER_LAYER_CLASS(Normalize);
extern INSTANTIATE_CLASS(PermuteLayer);
//REGISTER_LAYER_CLASS(Permute);
extern INSTANTIATE_CLASS(FlattenLayer);
extern INSTANTIATE_CLASS(PriorBoxLayer);
extern INSTANTIATE_CLASS(ConcatLayer);
extern INSTANTIATE_CLASS(ReshapeLayer);
extern INSTANTIATE_CLASS(SoftmaxLayer);
REGISTER_LAYER_CLASS(Softmax);
extern INSTANTIATE_CLASS(DetectionOutputLayer);
}
#endif
这时还会遇到一个麻烦的问题,添加了REGISTER_LAYER_CLASS()他会报重复注册,去掉这一句又报不认识这一层。
在layer_factory.hpp里做如下更改可以解决这个问题:
把static void AddCreator(const string& type, Creator creator){}里的:
    CHECK_EQ(registry.count(type), 0)<< "Layer type " << type << " already registered.";
    registry[type] = creator;
改为:
if (registry.count(type) != 0)
{
std::cout<< "Layer type " << type << " already registered.     ";
}
else
{
registry[type] = creator;
}













这样就能确保只注册一次了。


成功了。。。。。。。。。。

有问题请留言。


参考:

https://github.com/fengbingchun/Caffe_Test

http://blog.csdn.net/lien0906/article/details/73549811

http://blog.csdn.net/fengbingchun/article/details/54286435


发布了347 篇原创文章 · 获赞 635 · 访问量 266万+
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!