c++ - 使用 C++ 在 CAFFE 中设置输入层

标签 c++ caffe

我正在使用 CAFFE 编写 C++ 代码来预测单个(目前)图像。图片已经过预处理,格式为.png。我创建了一个 Net 对象并读入了经过训练的模型。现在,我需要使用 .png 图像作为输入层并调用 net.Forward() - 但有人可以帮我弄清楚如何设置输入层吗?

我在网上找到了几个示例,但没有一个有效,而且几乎所有示例都使用了已弃用的功能。根据:Berkeley's Net API ,不推荐使用“ForwardPrefilled”,不推荐使用“Forward(vector, float*)”。 API 表明应该“设置输入 blob,然后改用 Forward()”。这是有道理的,但是“设置输入 blob”部分没有展开,而且我找不到一个很好的 C++ 示例来说明如何做到这一点。

我不确定使用 caffe::Datum 是否正确,但我一直在玩这个:

float lossVal = 0.0;
caffe::Datum datum;
caffe::ReadImageToDatum("myImg.png", 1, imgDims[0], imgDims[1], &datum);
caffe::Blob< float > *imgBlob = new caffe::Blob< float >(1, datum.channels(), datum.height(), datum.width());
//How to get the image data into the blob, and the blob into the net as input layer???
const vector< caffe::Blob< float >* > &result = caffeNet.Forward(&lossVal);

同样,我想按照 API 的指示设置输入 blob,然后使用(未弃用的)caffeNet.Forward(&lossVal) 获取结果,而不是使用已弃用的内容。

编辑:

根据下面的回答,我更新了这个:

caffe::MemoryDataLayer<unsigned char> *memory_data_layer = (caffe::MemoryDataLayer<unsigned char> *)caffeNet.layer_by_name("input").get();
vector< caffe::Datum > datumVec;
datumVec.push_back(datum);
memory_data_layer->AddDatumVector(datumVec);

但是现在对 AddDatumVector 的调用出现段错误。我想知道这是否与我的 prototxt 格式有关?这是我的 prototxt 的顶部:

name: "deploy"  

input: "data"
input_shape {
dim: 1
dim: 3
dim: 100
dim: 100
}

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"

我将这部分问题基于 this discussion关于在 prototxt 中重要的“源”字段......

最佳答案

caffe::Datum datum;
caffe::ReadImageToDatum("myImg.png", 1, imgDims[0], imgDims[1], &datum);
MemoryDataLayer<float> *memory_data_layer = (MemoryDataLayer<float> *)caffeNet->layer_by_name("data").get();
memory_data_layer->AddDatumVector(datum);
const vector< caffe::Blob< float >* > &result = caffeNet.Forward(&lossVal);

像这样的东西可能会有用。在这里,您将不得不使用 MemoryData 层作为输入层。我希望图层名称被命名为 data

datum 变量的使用方式可能不正确。如果我没记错的话,我想,您必须使用基准数据 vector 。

我认为这应该可以帮助您入门。

快乐酿造。 :D

关于c++ - 使用 C++ 在 CAFFE 中设置输入层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38637053/

相关文章:

c++ - 与 friend 一起使用父类(super class)的私有(private)变量

matlab - 将数据转换为 leveldb for caffe

neural-network - 如何防止收敛到CNN回归问题的均值解?

machine-learning - 使用caffe从图像回归年龄时如何设计损失层

c++ - 编程语言开发实践,如何将golang风格的接口(interface)编译为c++?

c++ - 为什么我不能将这些整数打包在一起?

caffe - 使用 caffe.NetSpec() 定义网络时,有没有办法从给定的 prototxt 中获取 "append"?

tensorflow - 将 TensorFlow 模型转换为 Caffe 模型

C++ 我可以使用什么代替 sleep() 函数?

c++ - 错误 LNK2019 : unresolved external symbol _soap_ssl_init