Я пытаюсь преобразовать python код, который предсказывает модель обученного кафе, в c ++, но я получаю разные результаты предсказания.
Входной слой выглядит следующим образом:
name: "*"
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } }
}
теперь код python, использующий преобразователи, подобные следующим:
caffe_transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
caffe_transformer.set_transpose('data', (2, 0, 1)) # move image channels to outermost
caffe_transformer.set_mean('data', np.array([104, 117, 123])) # subtract the dataset-mean value in each channel
caffe_transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255]
caffe_transformer.set_channel_swap('data', (2, 1, 0)) # swap channels from RGB to BGR
Мой код c ++ основан на примере классификации caffe c ++, но я изменил функцию Preprocess:
void CaffeClassification::Preprocess(const cv::Mat& img,
std::vector<cv::Mat>* input_channels)
{
cv::Mat sample;
cv::resize(img, sample, cv::Size(256, 256));
cv::Rect roi(16, 16,
input_geometry_.width, input_geometry_.height);
cv::Mat crop = sample(roi);
crop.convertTo(crop, CV_32FC3);
crop -= cv::Scalar(123, 117, 104);
cv::split(crop, *input_channels);
}
Но python код дает мои правильные результаты, в то время как код C ++ - нет. Что я делаю не так?