2015-09-05 2 views
3

Я пытаюсь извлечь функции, используя caffenet.caffemodel. Я реализую extract_features.cpp в Visual Studio. Моя библиотека caffe также построена как статическая библиотека и ссылка на extract_features.exe. Когда я запускаю код, у меня есть ошибки, какСоздайте ошибку слоя в layer_factory.hpp

E0906 02:10:00.842056 4356 extract_features.cpp:74] Using CPU 
F0906 02:10:04.035171 4356 layer_factory.hpp:88] Check failed: registry.count(t 
ype) == 1 (0 vs. 1) Unknown layer type: ImageData (known types:) 
*** Check failure stack trace: *** 

ошибка происходит в layer_factory.hpp

static shared_ptr<Layer<Dtype> > CreateLayer(const LayerParameter& param) 
    { 
    if (Caffe::root_solver()) { 
     LOG(INFO) << "Creating layer " << param.name(); 
    } 
    const string& type = param.type(); 
    CreatorRegistry& registry = Registry(); 
    CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type 
     << " (known types: " << LayerTypeListString() << ")"; 
    return registry[type](param); 
    } 

Первоначально был я думал об ошибке Link. Теперь я смотрю внимательнее и понимаю, что проблема с линкером. Что может быть ошибкой?

+0

Я думаю, проблема в том, что у вас есть кафе как статическая библиотека. Я вспоминаю подобную проблему в mac-os, вам придется копать там решение. – Shai

+0

Да, они (http://stackoverflow.com/questions/30325108/caffe-layer-creation-failure) также имеют одинаковую проблему и считают статическую библиотечную проблему, поскольку код регистрации слоя не включен в ссылку. Но при отладке я могу запустить весь этот исходный код внутри layer_factory.hpp. Спасибо, что я в этом поработаю. – batuman

+0

Выполнение кода в файлах заголовков во время отладки не обязательно означает, что оно доступно в выпуске. – Shai

ответ

3

Я познакомился с недавно знакомой проблемой для запуска приложения, связанного со статической библиотекой Caffe (скомпилированной в Visual Studio). Там я нашел 2 различные решения:

  1. Добавить проект Caffe к вашему решению и установить следующую опцию в главном проекте:

    Свойства проекта -> Общие свойства -> Рамки и ссылки -> Caffe -> использование библиотеки зависимостей Входы -> True

Этот метод прост, но иногда мы хотим использовать только caffe.lib без проекта и здесь приходит второй метод.

  1. Создайте заголовочные файлы в своем проекте и добавьте туда все объявления классов слоев извне, чтобы заставить компоновщик использовать свои символы. Смотрите пример ниже:

Пример

#include "caffe/common.hpp" 
namespace caffe 
{ 
    extern INSTANTIATE_CLASS(ConvolutionLayer); 
    extern INSTANTIATE_CLASS(PoolingLayer); 
    extern INSTANTIATE_CLASS(ReLULayer); 
    extern INSTANTIATE_CLASS(TanHLayer); 
} 

Наконец включить саму заголовочный файл в приложении, где вы используете Caffe.

Также проверьте уровень, который вы встретили в своей проблеме, например, в вашем случае это «ImageData» (или для исправления ImageDataLayer), откройте файл «image_data_layer.cpp» в VS и проверьте там, что «REGISTER_LAYER_CLASS (ImageData);» доступен там.

Надеюсь, что это поможет решить проблему.

0

убедитесь, что ваш cafe составлен с opencv