我正在使用CAFFE编写C++代码来预测单个(目前只有一个)图像。该图像已经被预处理并以.png格式存在。我创建了一个Net对象并读取了训练好的模型。现在,我需要将.png图像用作输入层并调用net.Forward() - 但是有人能帮我弄清楚如何设置输入层吗?
我在网上找到了一些示例,但它们都不起作用,几乎所有示例都使用已弃用的功能。根据伯克利的Net API,使用"ForwardPrefilled"已被弃用,并且使用"Forward(vector, float*)"也已被弃用。API表明应该“设置输入blob,然后使用Forward()”。这很有道理,但是“设置输入blob”部分没有详细说明,我找不到一个好的C++示例来说明如何做到这一点。
我不确定是否使用caffe::Datum是正确的方法,但我一直在尝试:
我根据这个讨论中关于prototxt中“source”字段的重要性,提出了这个问题...
我在网上找到了一些示例,但它们都不起作用,几乎所有示例都使用已弃用的功能。根据伯克利的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的指导,设置输入blobs,然后使用(非废弃的)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"
我根据这个讨论中关于prototxt中“source”字段的重要性,提出了这个问题...