【发布时间】:2019-01-15 19:59:16
【问题描述】:
我正在使用 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 中很重要...
【问题讨论】:
-
您可以在 net.prototxt 中使用 ImageData 层。该层可以读取您的图像列表并像数据层一样进行一些转换。