Я был следуя примеру Меня упоминали о том, как конвертировать OpenCV Mat
в объект Кафе, из которого я мог делать предсказания. Из того, что я понимаю, первый раздел масштабирует изображение, а затем инициализирует класс caffe TransformationParameter
:
const float img_to_net_scale = 0.0039215684;
TransformationParameter input_xform_param;
input_xform_param.set_scale( img_to_net_scale );
DataTransformer<float> input_xformer( input_xform_param, TEST );
Затем «патч» OpenCV Mat преобразуется в «input_blob». Я изменил эту часть, потому что я загружал свое изображение в оттенках серого вместо цвета.
cv::Mat patch = cv::imread( input_file_str, CV_LOAD_IMAG_GRAYSCALE );
Blob<float> input_blob;
input_blob.Reshape(1, patch.channels(), patch.rows, patch.cols );
input_xformer.Transform( patch, &input_blob );
Наконец, я не слишком уверен, что делает этот раздел — если у меня уже есть мой OpenCV Mat, преобразованный в BLOB-объект Caffe, почему мне нужно отодвинуть вектор «input» и передать его в сеть? Разве я не могу передать input_blob прямо в сеть, чтобы вернуть мой прогноз?
std::vector<Blob<float>*> input;
input.push_back( &input_blob );
std::vector<Blob<float>*> output = net->Forward( input );
Вам нужно push_back
ваш input_blob
чтобы передать его net
поскольку net
ожидает своего вклада в качестве std::vector
из Blobs
(в принципе, может быть net
с которым требуется более одного входного блоба для вывода).
Обратите внимание, что вы не копируете input_blob
во входной вектор, а скорее передавая указатель на него.