2015-08-25 85 views
0

我一直在following an example我被提及如何將OpenCV Mat轉換成我可以預測的Caffe對象。據我瞭解,首節縮放圖像,然後初始化的朱古力類TransformationParameter將OpenCV灰度墊轉換成Caffe blob

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的墊「補丁」轉換成「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墊轉換爲來自Caffe BLOB,爲什麼我要回推「輸入」矢量並將它傳遞給互聯網?我無法直接將input_blob傳遞到網絡中以獲取我的預測嗎?

std::vector<Blob<float>*> input; 
input.push_back(&input_blob); 

std::vector<Blob<float>*> output = net->Forward(input); 

回答

2

您需要push_backinput_blob,以便將它傳遞給net因爲net期待其輸入爲Blobs一個std::vector(原則上,有可能是net s表示需要比單輸入斑點多生產產量)。
請注意,您不是將input_blob複製到輸入向量中,而是將指針傳遞給它。

+0

非常感謝!順便說一下,如果我想在Mat對象上自己執行縮放步驟,那麼我應該只將圖像的多個像素乘以0.0039215684? –

+0

@JackSimpson我不是100%確定。你應該能夠在調試模式下自己檢查它。 – Shai