Ошибка создания слоя в layer_factory.hpp

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

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);
  }

Изначально я думал, что ссылка ошибка. Сейчас смотрю внимательнее и понимаю, что дело не в компоновщике. В чем может быть ошибка?


person batuman    schedule 05.09.2015    source источник
comment
Я думаю, проблема в том, что у вас есть статическая библиотека caffe. Я помню аналогичную проблему в mac-os, вам придется поискать там решение.   -  person Shai    schedule 06.09.2015
comment
Да, они (stackoverflow.com/questions/30325108/) также имеет ту же проблему и считается проблемой статической библиотеки, поскольку код регистрации слоя не включен в связывание. Но при отладке я могу просмотреть весь этот исходный код внутри layer_factory.hpp. Спасибо, я покопаюсь в этом.   -  person batuman    schedule 06.09.2015
comment
выполнение кода в файлах заголовков во время отладки не обязательно означает, что он доступен в выпуске.   -  person Shai    schedule 07.09.2015


Ответы (2)


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

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

    Свойства проекта -> Общие свойства -> Framework and References -> Caffe -> Use Library Dependency Inputs -> True

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

  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); доступен там.

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

person vvvs    schedule 26.10.2015

убедитесь, что ваш caffe скомпилирован с помощью opencv

person Eli    schedule 26.07.2016