2016-03-16 11 views
10

は++私は、代わりにこのグラフにOpenCVのマットを通過したい組み込みアプリケーションについてOpenCV MatをC++ Tensorflowグラフに渡すにはどうすればよいですか? Tensorflow Cで

tensorflow::Node* file_reader = tensorflow::ops::ReadFile(tensorflow::ops::Const(IMAGE_FILE_NAME, b.opts()),b.opts().WithName(input_name)); 
tensorflow::Node* image_reader = tensorflow::ops::DecodePng(file_reader, b.opts().WithAttr("channels", 3).WithName("png_reader")); 
tensorflow::Node* float_caster = tensorflow::ops::Cast(image_reader, tensorflow::DT_FLOAT, b.opts().WithName("float_caster")); 
tensorflow::Node* dims_expander = tensorflow::ops::ExpandDims(float_caster, tensorflow::ops::Const(0, b.opts()), b.opts()); 
tensorflow::Node* resized = tensorflow::ops::ResizeBilinear(dims_expander, tensorflow::ops::Const({input_height, input_width},b.opts().WithName("size")),b.opts()); 

を使用してグラフにイメージファイルをロードすることができます。

matをテンソルに変換するにはどうすればよいですか?tensorflow :: ops :: Castやtensorflow :: ops :: ExpandDimsの入力として使用できますか?

答えて

16

それはCvMatのから直接ではないのですが、あなたはTensorFlow Androidの例では、メモリ内の配列からテンソルを初期化する方法の例を見ることができます: https://github.com/tensorflow/tensorflow/blob/0.6.0/tensorflow/examples/android/jni/tensorflow_jni.cc#L173

あなたは新しいtensorflowを作成することから始めます::テンソルこのような何か(テストされていないすべてのコード)を持つオブジェクト、:これは1のバッチサイズで、浮動小数点値を持つテンソルオブジェクトを作成

tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, height, width, depth}));

、及びwidth X heightのサイズ、とチャンネル。例えば、3つのチャネルを有する128ワイド×64の高画像は、{1, 64, 128, 3}の形状を通過する。バッチサイズは、1回の呼び出しで複数の画像を渡す必要がある場合にのみ使用され、単純な用途の場合は1のままにすることができます。

次に、テンソルの背後にある配列を次のようにします。

auto input_tensor_mapped = input_tensor.tensor<float, 4>();

input_tensor_mappedオブジェクトは、新たに作成したテンソルのデータへのインタフェースであり、あなたはそれに独自のデータをコピーすることができます。ここで私は、たとえば、あなたがあなたの元データへのポインタとしてsource_data設定したと仮定しています:

const float* source_data = some_structure.imageData;

次に、あなたのデータをループし、それをコピーすることができますがあり

for (int y = 0; y < height; ++y) { 
    const float* source_row = source_data + (y * width * depth); 
    for (int x = 0; x < width; ++x) { 
     const float* source_pixel = source_row + (x * depth); 
     for (int c = 0; c < depth; ++c) { 
      const float* source_value = source_pixel + c; 
      input_tensor_mapped(0, y, x, c) = *source_value; 
     } 
    } 
} 

この単純なアプローチを最適化する明白な機会であり、OpenCV側でソースデータを取得する方法を示すためのサンプルコードは用意されていませんが、これが役立つことを願っています。

1

私はopencv Matファイルの開始モデルを実行しようとしていましたが、次のコードはhttps://gist.github.com/kyrs/9adf86366e9e4f04addbのために働いていました。 opencvとtensorflowの統合にはいくつかの問題がありますが。コードは.pngファイルで問題なく動作しましたが、ロードに失敗しました.jpg.jpeg。あなたはこれに続き、より多くの情報を得ることができますhttps://github.com/tensorflow/tensorflow/issues/1924

+0

要点のリンクは機能しません – Pototo

関連する問題