2015-09-05 33 views
3

我試圖使用caffenet.caffemodel來提取功能。我在Visual Studio中實現了extract_features.cpp。我的咖啡庫也是作爲靜態庫建立的,並鏈接到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); 
    } 

最初我以爲鏈接錯誤。現在我更仔細地看,並意識到不是鏈接器問題。什麼可能是錯誤?

+0

我認爲問題在於你的caffe是靜態庫。我記得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 - >使用庫的依賴輸入 - >真

這種方法雖然簡單,但有時候我們希望只使用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); 
} 

最後包括在您的應用程序正在使用朱古力,那兒的頭文件。例如,在你的情況下,它是「ImageData」(或更正確的ImageDataLayer),在VS打開「image_data_layer.cpp」文件,並檢查那裏「REGISTER_LAYER_CLASS (的ImageData);」在那裏可用。

希望它有助於解決問題。

0

確保你的caffe是用opencv編譯的