質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

565閲覧

Tensorflow C++ API カラー画像を入力に与えたい

_Victorique__

総合スコア1392

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/28 07:36

編集2022/01/12 10:55

TensorFlow C++ APIを使って学習済みモデルから予測を行おうとしています。
ネットにあるサンプルはどれもグレースケール画像のものばかりで読み込みかたが分かりません。
TensorShapeやsesion->Run等のコードも参考にしましたがよく分かりませんでした。
カラー画像を読み込む方法を教えていただけないでしょうか?
以下、実装中のソースコードになります。

C++

1 2using namespace tensorflow; 3 4int main(int argc, char* argv[]) { 5 Session* session; 6 Status status = NewSession(SessionOptions(), &session); 7 if (!status.ok()) { 8 std::cout << status.ToString() << "\n"; 9 return 1; 10 } 11 12 GraphDef graph_def; 13 status = ReadBinaryProto(Env::Default(), "graph.pb", &graph_def); 14 if (!status.ok()) { 15 std::cout << status.ToString() << "\n"; 16 return 1; 17 } 18 19 status = session->Create(graph_def); 20 if (!status.ok()) { 21 std::cout << status.ToString() << "\n"; 22 return 1; 23 } 24//********************************************************************// 25// std::vector<std::pair<string, tensorflow::Tensor>> inputs = {}; 26// 27//                        ここでカラー画像を読み込みたい 28// 29//********************************************************************// 30 std::vector<tensorflow::Tensor> outputs; 31 32 status = session->Run(inputs, {"c"}, {}, &outputs); 33 if (!status.ok()) { 34 std::cout << status.ToString() << "\n"; 35 return 1; 36 } 37 38 auto output_c = outputs[0].scalar<float>(); 39 std::cout << outputs[0].DebugString() << "\n"; // Tensor<type: float shape: [] values: 30> 40 std::cout << output_c() << "\n"; // 30 41 42 session->Close(); 43 return 0; 44}

###追記
入力を作る処理のサンプルを載せておきます。
カラー画像の場合、RGBの3チャネルあるはずなのでこのサンプル通りにはならないと思います。

C++

1 auto tensor = tensorflow::Tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({N_data, N_vec})); 2 auto mat = tensor.tensor<float, 2>(); 3 mat.setZero(); 4 5 std::ifstream fin(filename, std::ios_base::in | std::ios_base::binary); 6 assert(!fin.fail()); 7 boost::iostreams::filtering_istream s; 8 s.push(fin); 9 char c; 10 11 for (int i=0; i<N_header; ++i) { 12 s.get(c); 13 } 14 for (int n=0; n<N_data; ++n) { 15 for (int h=0; h<N_height; ++h) { 16 for (int w=0; w<N_width; ++w) { 17 s.get(c); 18 mat(n, h*N_width + w) = static_cast<float>(static_cast<uint8_t>(c)) / 255.0; 19 } 20 } 21 } 22 return tensor

tensor.h内の記述を見てみると、

C++

1 /// Example: 2 /// 3 /// ```c++ 4 /// 5 /// typedef float T; 6 /// Tensor my_mat(...built with Shape{rows: 3, cols: 5}...); 7 /// auto mat = my_mat.matrix<T>(); // 2D Eigen::Tensor, 3 x 5. 8 /// auto mat = my_mat.tensor<T, 2>(); // 2D Eigen::Tensor, 3 x 5. 9 /// auto vec = my_mat.vec<T>(); // CHECK fails as my_mat is 2D. 10 /// auto vec = my_mat.tensor<T, 3>(); // CHECK fails as my_mat is 2D. 11 /// auto mat = my_mat.matrix<int32>();// CHECK fails as type mismatch. 12 /// 13 /// ```

この中で言えば

C++

1auto vec = my_mat.tensor<T, 3>(); // CHECK fails as my_mat is 2D.

に該当するのかなと考えましたがそれを確証づけることができませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/08/13 01:43

グレースケール画像とカラー画像の違いは、あるピクセル値が 1つの値 or 3つの値 から構成されるか否かだけです。理論上は n, h, w の3重ループに、さらに3チャネル分のループを加えて4重ループ構造が必要になります。具体的な読み込み処理は、入力画像データ形式に強く依存します(掲示コードからは読み取れませんでした)。また「学習済みモデルから予測」とありますが、このモデルがカラー画像から学習したものでなければ、カラー画像を入力しても役に立ちません(期待通り動作しません)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問