2016-07-22 10 views
1

私の訓練したCaffeネットをC++のデータで使用しようとしました。私はデプロイのための標準的な例文classification.cppを実装しました。 Pythonスクリプトを使用した電車/テスト段階では、達成された精度は0.93でしたが、今すぐ展開すると奇妙な結果が得られました。私は2つのクラスがあります。C++から訓練されたcaffeネットを使用した結果が間違っています

  • 環境
  • オブジェクト

を、私は、オブジェクト検出のPROBを取得する必要があります。私は、FC層(prob1 + prob2 == 1.0f)に2つの出力がある場合には、結果がSoftmaxの出力ブロブに2つのprobの形で表示されると信じていましたが、その結果は困惑しています。出力ベクトルでは、すべての画像に対してという2つの同一の値が得られます。

layer { 
    name: "data" 
    top: "data" 
    type: "Input" 
    input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 }} 
} 
layer { 
    name: "fc6" 
    top: "fc6" 
    type: "InnerProduct" 
    bottom: "drop5" 
    inner_product_param { 
     num_output: 2 
     weight_filler { 
      type: "xavier" 
      std: 0.1 
     } 
    } 
} 
layer { 
    name: "prob" 
    top: "prob" 
    type: "Softmax" 
    bottom: "fc6" 
} 

マイC++定期的に使用するためのサンプルコード:

Blob<float>* input_layer = m_net->input_blobs()[0]; 
input_layer->Reshape(1, m_numChannels, m_inputGeometry.height, m_inputGeometry.width); 
m_net->Reshape(); 
std::vector<cv::Mat> input_channels; 
Blob<float>* input_layer = m_net->input_blobs()[0]; 
int width = input_layer->width(); 
int height = input_layer->height(); 
float* input_data = input_layer->mutable_cpu_data(); 

for(int i = 0; i < input_layer->channels(); ++i){ 
    cv::Mat channel(height, width, CV_32FC1, input_data); 
    input_channels->push_back(channel); 
    input_data += width * height; 
} 

cv::split(image_float, *input_channels); 
m_net->Forward(); 
Blob<float>* output_layer = m_net->output_blobs()[0]; 
const float* begin = output_layer->cpu_data(); 
const float* end = begin + output_layer->channels(); 
QVector<float> output = QVector<float>(end - begin, *begin); 

はまた、結果は、ランダム(各クラスの複製)と同様であり、最小の確率ここで、入力と出力層であります値は魔法0.443142です。この値は出力ベクトルによく見られます。私は間違って何をしていますか?

+0

あなたの入力データが正しい画像ですか?なぜ完全に接続されたレイヤーだけを使用していますか?畳み込みレイヤーははるかに良く動作します。 –

+0

@Matiasここでは、入力レイヤーと出力レイヤーについてのみ説明します。ネットワークにも畳み込みレイヤが含まれています。私は自分の問題は正確さではないと思う。 – esterlein

答えて

1

問題はこのトピックの範囲を超えています。 STLとQtベクトルの違いです。 オリジナルコード

std::vector<float> output(begin, end); 

代わりの

QVector<float> output(end - begin, *begin); 

問題を解決します。

関連する問題