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