2017-08-02 69 views
1

對於我的一個項目,我對Caffe感興趣,並且更加深入地學習。幾個小時後,我設法將Caffe安裝在我的電腦上。我現在試圖讓我們做到這一點。Caffe C++在輸入圖層中設置數據

所以我已經加載了網絡如下:

std::string model_file = "/home/CXX/Desktop/caffemodel/deploy.prototxt"; 
std::string trained_file = "/home/CXX/Desktop/caffemodel/modelWeights.caffemodel"; 

Caffe::set_mode(Caffe::CPU); 
boost::shared_ptr<Net<float>> net_; 
net_.reset(new Net<float>(model_file, TEST)); 
net_->CopyTrainedLayersFrom(trained_file); 

加載的網絡和權重是不是我的。請找到輸入層和輸出層的結構如下:

name: "simple_conv-dense" 
input: "data" 
input_dim: 1 
input_dim: 1 
input_dim: 250 
input_dim: 250 
layer { 
    name: "conv1" 
    bottom: "data" 
    type: "Convolution" 
    top: "conv1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 

的輸入是一個單一的250 * 250的深度(0之間歸一化值和1)「圖像」。預處理已經完成,我的數據存儲在一個Matrix(個人圖書館,指向std :: vector元素的指針)中,以便您可以像2D數組(數據[i] [j])那樣訪問它

網絡的輸出被以該順序組成:[NbBlob] [NbClass] [outHeight] [outWidth],在我的情況給予[1] [46] [250] [250]

我有已經編寫的代碼來檢索輸出:

Blob<float>* output_layer = net_->output_blobs()[0]; 
const float* begin = output_layer->cpu_data(); 
for (int k = 0; k < 46; k++) 
    for (int h = 0; h < 250; h++) 
     for (int w = 0; w < 250; w++){ 
      currentprob = *(begin + ((k * 250 + h) * 250 + w)); 

此代碼已被選中,和總結了逐像素46類predections,明顯賦予1作爲用於單個像素的結果。

我的問題是,我不知道如何在網絡中提供我的數據。我首先通過該方法檢索輸入層:

Blob<float>* input_layer = net_->input_blobs()[0]; 

從調試器,我知道input_layer具有屬性名爲capacity_其具有預期值(62 500,作爲250 * 250)。

所以這裏是我的問題:如何將他的數據輸入到輸入層?我花了很多時間看自己,但我不知道該往哪裏看。

請注意,我沒有使用OpenCV,而且我幾乎沒有任何深度學習背景(學士學位)。

謝謝你花時間幫助我。任何形式的幫助(文檔,僞代碼,代碼,解釋)都非常受歡迎。 PS:使用命名空間caffe;使用命名空間caffe;使用命名空間caffe;使用命名空間caffe;使用命名空間caffe;使用命名空間caffe;

編輯:增加了更多的輸入圖層信息。錯別字。

+0

更換嵌套循環有一個Q&A [SO:使用C++在CAFFE中設置輸入層](https://stackoverflow.com/q/38637053/7478597)。 – Scheff

+0

@Scheff感謝您的回答。我之前看到過這個問題,並且認爲它不夠接近我的情況(我不是從通常的圖像格式加載,而是從二進制文件加載)。然而,我看着它,並看到MemoryDataLayer是我需要從可用的輸入層。我更新了CNN輸入部分,因爲我認爲我意識到了一些東西(這正是我的原型文本的第一行)。所有者離開第一行一般,以便可以爲他的案例定義最合適的輸入圖層,對吧? 另外,我不能達到caffe :: MemoryDataLayer,只有caffe :: MemoryDataParameter – Antoine

+0

我GOOGLE了一下,偶然發現['caffe :: MemoryDataLayer'](http://caffe.berkeleyvision.org/tutorial/layers/memorydata。 HTML)。此外,還有一個[帶有MemoryData輸入的Caffe C++ helloworld示例](https://medium.com/@shiyan/caffe-c-helloworld-example-with-memorydata-input-20c692a82a22)。 – Scheff

回答

0

我會嘗試直接將數據推送到網:

Blob<float>* input_layer = net_->input_blobs()[0]; 
float* input_data = input_layer->mutable_cpu_data(); // get pointer to Blob's data storage 
for (int i=0; i < 250; i++) { 
    for (int j=0; j < 250; j++) { 
     input_data[i*250 + j] = data[i][j]; // I hope I did not filp anything here... 
    } 
} 
net_->forward(); // do forward pass 

根據您的data如何佈置,你也許可以用更優雅memcpy ...

+0

我首先嚐試了這種方法,但'blob * input_layer = net _-> input_blobs()[0];'崩潰了程序,我不知道爲什麼。如上所示,我目前正在研究'caffe :: MemoryDataLayer'。 修正'std :: memcpy',非常感謝您的建議,它看起來完全適應我的數據(在內存中相鄰)。 – Antoine

+1

好吧,我知道了,我不得不修改prototxt模型以在頂部有一個合適的輸入層。你的方法現在正在工作。坦克很多。 – Antoine

+0

@AntoineMerlet很高興我能幫上忙 – Shai