machine-learning - 如何在caffe中使用c++从多个层获取特征

标签 machine-learning deep-learning caffe conv-neural-network

在使用 C++ 进行一次前向传递后,如何在 caffe 中同时获得 4096 暗淡特征层和 1000 暗淡类层?

我试图在extract_features.cpp中查找它,但它使用了一些奇怪的datum对象,所以我无法真正理解它是如何工作的。

到目前为止,我只是将 prototxt 文件裁剪到我想要提取和使用的图层

[...]
net->ForwardPrefilled();
Blob<float> *output_layer = net->output_blobs()[0];
const float *begin = output_layer->cpu_data();
const float *end = begin + output_layer->channels();
return vector<float>(begin, end);

但如果我想同时提取两个特定层(例如“prob”和“fc7”),这不起作用。

最佳答案

更新

extract_feature.cpp的简单工作流程(假设您在 c++ 中有一个 shared_ptr<Net<float> > net 对象):

  1. 执行网络转发来处理输入:net->Forward() 。 这一步有一个Data net层读取输入图像。因此,如果在您自己的应用程序/代码中您想要将图像读取到 cv::Mat image并将其输入net ,您可以编写如下代码:

    // for data preprocess
    shared_ptr<caffe::DataTransformer<float> > data_transformer;
    caffe::TransformationParameter trans_para;
    // set mean
    trans_para.set_mean_file("/path/to/image_mean.binaryproto");
    // set crop size, e.g.here is cropping 227x227
    trans_para.set_crop_size(227);
    // instantiate a DataTransformer using trans_para for image preprocess
    data_transformer.reset(new caffe::DataTransformer<float>(trans_para, caffe::TEST));
    const std::vector<caffe::Blob<float> *> net_input = net->input_blobs();
    // maybe you need to resize image before this step
    data_transformer->Transform(image, *net_input[0]);
    net->Forward();
    

    还有net.prototxt应该有 Input层作为第一层,例如这个deploy.prototxt

  2. 根据名称获取特征 blob:const boost::shared_ptr<Blob<Dtype> > feature_blob = net->blob_by_name(blob_names[i])
  3. 从您获得的blob中提取特征数据到您想要的结构中,例如一个arry,一个简单的示例代码可以是:

    count = feature_blob->channels() * feature_blob->height() * 
        feature_blob->width();
    float* feature_array = new float[count]; 
    const float* feature_blob_data = feature_blob->cpu_data() +
        feature_blob->offset(n); // feature data generated from 
                                 // the nth input image within a batch 
    memcpy(feature_array, feature_blob_data, count * sizeof(float)); 
    ...// other operations
    delete [] feature_array;        
    

请注意,数据存储自 feature_blob_data位于 row-major order .


extract_feature.cpp对于您的任务来说,其用法应该如下所示:

path/to/extract_features your_pretrained_model.caffemodel \
    net.prototxt 4096_dim_feature_blob_name,1000_dim_class_feature_blob_name \
    saved_4096_dim_feature_database,saved_1000_dim_class_feature_database \
    num_mini_batches(times for forward pass) lmdb(or leveldb) GPU(or CPU)

net.prototxt应包含一个可以读取输入图像数据的数据层。

运行时,会首先从net.prototxt内的数据层读取图像数据。并执行num_mini_batches前向传递次数并提取 2 个两个特征 blob 4096_dim_feature_blob_name , 1000_dim_class_feature_blob_name的数据转换为 Datum 类型的结构然后序列化保存到数据库saved_4096_dim_feature_database , saved_1000_dim_class_feature_database其类型为 lmdbleveldb

完成后,您可以从saved_4096_dim_feature_database读取保存的特征数据。 , saved_1000_dim_class_feature_database使用 net.prototxt 中的数据层分别。

顺便说一句,datum是一个最多可以存储4D数据以及数据的形状和标签信息等的结构。它在caffe.proto中定义。 ,使用 google protobuf 生成方便caffe与数据库之间的数据交换,如LMDBLEVELDB .

关于machine-learning - 如何在caffe中使用c++从多个层获取特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40938372/

相关文章:

python-3.x - 将具有相同含义的单词分类

tensorflow - 输出层的 softmax 和 sigmoid 函数

python - db_lmdb.hpp :15] Check failed: mdb_status == 0 (2 vs. 0) 没有这样的文件或目录

python - Conda 命令静默失败

python - Caffe:尽可能简单地从快照预测图像

machine-learning - 为什么不累积查询损失,然后使用 Pytorch 和 Upper 在 MAML 中求导呢?

machine-learning - Caffe "top"Accuracy"` 层的第二个 `"

machine-learning - 如何计算AUC(曲线下面积)以进行推荐系统评估

deep-learning - caffe中的Softmax和SoftmaxWithLoss层有什么区别?

keras - 在 keras 中连接多个 CNN 模型