物体検出の推論のサンプルについて

364 views
Skip to first unread message

k.ishi

unread,
Jun 1, 2021, 2:24:53 AM6/1/21
to Neural Network Console Users (JP)

皆様、お世話になっております。

synthetic_image_object_detection.sdcproj プロジェクトで得られた学習結果の nnp ファイルを使用して推論を実行したいと思っています。
pythonではなくC++で推論したいのですが、mnist画像分類のサンプルはスターターガイドでも案内頂いているgithubで見つけたのですが、物体検出の推論のC++サンプルが見つけられずにいます。
どこか、参考になる情報はございませんでしょうか?

小林由幸

unread,
Jun 8, 2021, 6:07:56 AM6/8/21
to Neural Network Console Users (JP)
残念ながら物体検出についての 直接的な  C++サンプルはありませんが、C++ APIの使用法自体はMNISTの場合と同じになります。
MNISTは1枚のモノクロ画像を入力し、各クラスの確率を出力するよう構成するところ、物体検出は1枚のカラー画像を入力し、物体の有無、物体の種類、位置と大きさの3つの出力を得るよう実装します。

2021年6月1日火曜日 15:24:53 UTC+9 k.ishi:

k.ishi

unread,
Jun 9, 2021, 3:33:48 AM6/9/21
to Neural Network Console Users (JP)
小林様

ご回答ありがとうございます。

mnist画像分類のC++APIサンプルでは推論結果の先頭ポインタが得られているようなので、そこから
output_result.csv の順番に習って
1.カテゴリー (カテゴリー数 x グリッド幅数 x グリッド高さ数 x アンカー数)(floatサイズ)
2.バウンディングボックス (ボックス4項目 x グリッド幅数 x グリッド高さ数 x アンカー数) (floatサイズ)
3.スコア (グリッド幅数 x グリッド高さ数 x アンカー数) ( floatサイズ)
で割り振れば良いでしょうか?


2021年6月8日火曜日 19:07:56 UTC+9 小林由幸:

小林由幸

unread,
Jun 9, 2021, 5:10:45 AM6/9/21
to Neural Network Console Users (JP)
C++推論にて2つ以上の出力を得る方法ですが、以下の MNISTのC++サンプルコード

https://github.com/sony/nnabla/blob/835898be829eea1d1126a65c9e165c27221248b0/examples/cpp/mnist_runtime/mnist_runtime.cpp#L161

の、

nbla::CgVariablePtr y = executor->get_output_variables().at(0).variable;

と1つの出力を取得している箇所について、物体検出の場合3つの出力がありますので、

nbla::CgVariablePtr y1 = executor->get_output_variables().at(0).variable;
nbla::CgVariablePtr y2 = executor->get_output_variables().at(1).variable;
nbla::CgVariablePtr y3 = executor->get_output_variables().at(2).variable;

などとして3つの出力変数を取得するイメージになります。
2021年6月9日水曜日 16:33:48 UTC+9 k.ishi:

k.ishi

unread,
Jun 16, 2021, 2:34:27 AM6/16/21
to Neural Network Console Users (JP)
小林様

お忙しいところ、ご回答ありがとうございます。

ご回答頂いた y1 がカテゴリー (カテゴリー数 x グリッド幅数 x グリッド高さ数 x アンカー数)(floatサイズ)
y2 がバウンディングボックス (ボックス4項目 x グリッド幅数 x グリッド高さ数 x アンカー数) (floatサイズ)
y3 がスコア (グリッド幅数 x グリッド高さ数 x アンカー数) ( floatサイズ)
との理解で良いでしょうか?


2021年6月9日水曜日 18:10:45 UTC+9 小林由幸:

小林由幸

unread,
Jan 12, 2022, 11:28:55 PM1/12/22
to Neural Network Console Users (JP)
executor->get_output_variables().at(i).variable;
において、上記iがどの出力が該当するかはネットワーク定義時の順序に依存しますが、
物体検出サンプルプロジェクトにおいては、書かれている通りです。

学習済みモデルの出力の何番目の変数に何が書き出されているかについては
以下の手順で確認することができます。
  1. 学習済みモデルであるnnpファイルの拡張子をzipに変更して解凍
  2. zipファイルに含まれるnet.nntxtをテキストエディタで開く
  3. executor {からはじまるセクションの、output_variableの順を確認する(この順が出力のIndexを表す)
executor {
  name: "Executor"
  network_name: "Runtime"
  num_evaluations: 1
  repeat_evaluation_type: "mean"
  need_back_propagation: false
  no_image_normalization: true
  data_variable {
    variable_name: "Input"
    data_name: "x"
  }
  output_variable {
    variable_name: "category'"
    data_name: "category'"
  }
  output_variable {
    variable_name: "r'"
    data_name: "r'"
  }
  output_variable {
    variable_name: "score'"
    data_name: "score'"
  }

ちなみに同executorセクションのdata_variableが入力のIndexを表しています。
2021年6月16日水曜日 15:34:27 UTC+9 k.ishi:

k.ishi

unread,
Jan 17, 2022, 4:24:44 AM1/17/22
to Neural Network Console Users (JP)
小林様

ご回答ありがとうございます。

2022年1月13日木曜日 13:28:55 UTC+9 小林由幸:
Reply all
Reply to author
Forward
0 new messages