This is my code to convert the data into blob deploy a forward pass:
Please suggest if there is a better way.
-------------------------------------------------------------------------------------------
/// fcn segmentation
/// step 1: prepare data for the neural networks
//get datum
caffe::Datum datum;
CVMatToDatum(src, &datum);
//get the blob
Blob<float>* blob = new Blob<float>(1, datum.channels(), datum.height(), datum.width());
//get the blobproto
caffe::BlobProto blob_proto;
blob_proto.set_num(1);
blob_proto.set_channels(datum.channels());
blob_proto.set_height(datum.height());
blob_proto.set_width(datum.width());
int size_in_datum = std::max<int>(datum.data().size(),
datum.float_data_size());
for (int i = 0; i < size_in_datum; ++i) {
blob_proto.add_data(0.);
}
const string& data = datum.data();
if (data.size() != 0) {
for (int i = 0; i < size_in_datum; ++i) {
blob_proto.set_data(i, blob_proto.data(i) + (uint8_t)data[i]);
}
}
//set data into blob
blob->FromProto(blob_proto); // the blob is always in float!!
//fill the vector
src.convertTo(src, CV_32FC3, 1/255.0); //for scaling
float* input_data = blob->mutable_cpu_data();
for (int i = 0; i<blob->channels()*blob->height()*blob->width();i++){
input_data[i] = input_data[i]/255;
}
vector<Blob<float>*> bottom_vec;
bottom_vec.push_back(blob);
float iter_loss;
/// step 2: forward pass
const vector<Blob<float>*>& result =
caffe_net.Forward(bottom_vec, &iter_loss);
const float* result_vec = result[0]->cpu_data();
-------------------------------------------------------------------------
All the best
Jianyu