我正在使用 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/