モデル
Model は、コンパイルされたモデルアーカイブを読み込み、Neat が実行できるルートを公開します。
すべての前処理、推論、および後処理の段階を手動で設定するこ となく、モデルを意識した実行を行いたい場合は、Model を使用してください。まず、その仕様を確認してから実行してください。不可解なテンソルは存在しません。
Model は、あなたにどのようなメリットをもたらしますか?
input_specs()とoutput_specs()は、モデルが期待するテンソルの形式と、モデルが出力するテンソルの形式を示します。metadata()、info()、および Python のsummary()を使用すると、読み込まれたモデルを調べることができます。run(...)は、1回の直接推論を実行します。build(...)は、プッシュ/プル実行に使用できる再利用可能なモデルランナーを作成します。graph()は、モデルのルートを再利用可能なGraphの一部として返します。preprocess()、inference()、およびpostprocess()は、高度な構成のためのルート段階を明らかにします。
参考文献:
モデルアーカイブを読み込む
このページの例では、model_path が Model Compiler から生成されたコンパイル済みのモデルアーカイブを指し、通常は Neat を実行するマシンにコピーされた .tar.gz であると想定しています。 まずはデフォルトのオプションを使用し、契約または入力ソースで必要な場合にのみ、ModelOptions を追加してください。
const std::string model_path = "resnet_50_model.tar.gz";
simaai::neat::Model model(model_path);
const auto info = model.info();
const auto inputs = model.input_specs();
const auto outputs = model.output_specs();
この検査ステップで予想外の結果になった場合は、そこで作業を停止してください。より大規模なアプリケーションを構築する前に、モデルのパス、アーティファクト、またはコントラクトを修正してください。
モデルの実行パスを選択してください。
職務に合った方法を選択してください。スモークテストは小規模に保ち、グラフレベルの問題にはグラフレベルの仕組みを使用するようにしてください。
| 必要です | 使用する | 返却 |
|---|---|---|
| モデルへの入力を1回実行する | model.run(...) | テンソルを入力として使用する場合はTensorListを、サンプルを入力として使用する場合はSampleを使用します。 |
| 複数の入力に対して、モデルのルートを再利用する | model.build(...) とモデル実行プログラム | モデルのルート周辺で、押し引き操作を行う |
| モデルの実行時間のみを計測します。 | model.benchmark(...)、または測定されたモデル実行環境 | BenchmarkReportまたはMeasureReport |
| モデルをアプリのワークフローに組み込む | graph.add(model) | Graph ステージ |
| コンポジションのために、ルートの境界を明確にする。 | model.graph(route_options) | 再利用可能なGraphの断片 |
| モデルの特定の段階をデバッグする | model.fragment(ModelStage::...) | ステージ固有のGraphフラグメント |
確実性を高めるために、モデルを直接呼び出す方法を使用してください。モデルがアプリケーションの一部になった場合は、Graphを使用しま す。具体的には、名前付き入力、ソースノード、ブランチ、結合、レンダリング、ビデオ出力、メタデータ出力、または複数のモデルの場合です。
モデルのオプションを選択してください。
まず、デフォルトのModelOptionsから始めます。モデルの契約または入力ソースで必要な場合にのみ、オプションを追加してください。
| 目標 | 利用可能なオプション | 備考 |
|---|---|---|
| デコードされた画像を送信 | preprocess.kind、preprocess.preset、および、リサイズ、カラー、レイアウト、正規化、量子化、またはテッセレーションなどの特定のプリプロセスフィールド。 | アプリがピクセルデータを送信する場合にこれを使用し、Neat がそれらをモデル契約に適合するように調整します。 |
| モデルの公開入力に一致するテンソルを渡す | 前処理オプションを未設定にします。 | リサイズ・正規化済みのFP32入力にも必要なCast/Quant/Tessアダプターを維持します。 |
| 検出結果を解析する。 | decode_type, decode_type_option, score_threshold, nms_iou_threshold, top_k, num_classes | 検出モデルには、明確なデコード意図が必要です。 |
| 抽出した モデルファイルを保管し、必要に応じて確認できるようにします。 | cleanup_extracted_model_data = false | デバッグ時に役立ちます。通常の使用時には、デフォルト設定のままにしておいてください。 |
| 1つのプロセスで複数のモデルのルートを実行する | name_suffixと、グラフ要素名のプレフィックス/サフィックス | 生成された名前と診断結果を読みやすく表示します。 |
| モデルの経路を途中で停止する | inference_terminal | 高度なルーティングデバッグパスです。初回実行時のコードには使用しないでください。 |
| 実行の配置や内部キューを調整します。 | processcvu, processmla, advanced_execution | 高度な設定。調整を行う前に、デフォルトのパスを測定してください。 |
検出機能を備えた画像入力
モデルが画像の前処理を必要とし、YOLO形式の検出結果を出力する場合に、このパターンを使用してください。
simaai::neat::Model::Options options;
options.preprocess.kind = simaai::neat::InputKind::Image;
options.preprocess.preset = simaai::neat::NormalizePreset::COCO_YOLO;
options.decode_type = simaai::neat::BoxDecodeType::YoloV8;
options.score_threshold = 0.25f;
options.nms_iou_threshold = 0.45f;
options.top_k = 100;
simaai::neat::Model model(model_path, options);
設定は簡潔に:必要な契約内容を変更しない限り、デフォルト値や非推奨のフィールドを設定しないでください。テンソルまたは画像のメタデータにすでにソース形式の情報が含まれている場合は、ページでその理由が説明されていない限り、同じ情報を繰り返さないようにしてください。
識別・解析のためのフィールドガイド
ルートが、生の推論テンソルではなく、デコードされたバウンディングボックス、ポーズ結果、またはセグメンテーション結果を返すようにする場合、検出デコードオプションを設定します。生のモデル出力を取得したい場合は、フィールドを未設定のままにします。
| フィールド | 使用する際は | デフォルトの意味 |
|---|---|---|
decode_type | 検出モデルに BoxDecode ステージをアタッチするには、Neat が必要です。 | Unspecified;検出された意図はデコードされませんでした。 |
decode_type_option | 検出ヘッドのテンソル順序には、特定のバリアントが必要です。 | Auto。モデル、契約、およびルートプランナーに判断を任せましょう。 |
score_threshold | デコード処理中に、信頼度の低い候補を排除したいと考えています。 | 0:後で絞り込む前に、候補者を保持しておく。 |
nms_iou_threshold | デコード処理では、非最大値抑制を適用する必要があります。 | 0; モデルにパッケージされた値を保持します。パッケージされた値がない場合、YOLO26はNMSをスキップし、その他のデコーダーは重なりのあるボックスをすべて抑制します。 |
top_k | 1回の出力あたりの検出件数に上限を設けたいのですね。 | 0;上位K件の制限なし。 |
num_classes | クラスヘッドの深さは、例えば単一クラスのYOLO分割ヘッドのように、確実に推測することはできません。 | 0。MPKメタデータまたは従来の推論を使用してください。 |
ほとんどのYOLOスタイルのモデルでは、まずdecode_type、score_threshold、nms_iou_threshold、およびtop_kから始めます。モデルの構造に調整が必要な場合にのみ、num_classesを追加します。テンソルの順序について、特定のセレクターが必要であることがわかっている場合を除き、decode_type_optionをAutoに設定したままにします。
simaai::neat::Model::Options options;
options.decode_type = simaai::neat::BoxDecodeType::YoloV8;
options.score_threshold = 0.25f;
options.nms_iou_threshold = 0.45f;
options.top_k = 100;
options.num_classes = 1; // Set only when the model contract needs the class count.
simaai::neat::Model model(model_path, options);
新しい例では、boxdecode_original_widthまたはboxdecode_original_heightを使用しないでください。座標の反転には、前処理メタデータが使用されます。画像のサイズをハードコーディングする代わりに、そのメタデータを保持してください。
生のテンソル入力
model.input_specs()に一致するテンソルを渡す場合はデフォルトを使います。NeatはMPKに必要なテンソルアダプターを維持します。
simaai::neat::Model model(model_path);
従来のpreprocess.enable = Off設定は、MLAのみの実行を選択したり、MPKに必要なCast/Quant/Tessアダプターを削除したりしません。空でないpreprocess.transformsリストはOffより優先されます。
フィールドガイドの準備
ModelOptions.preprocess どのような種類の入力を提供するか、また Neat 推論前に適応する場合があります。
| 必要です | フィールド |
|---|---|
| 画像またはテンソルを入力として選択してください。 | preprocess.kind |
| 従来の前処理制御(MPKに必要なアダプターは維持) | preprocess.enable |
| 動的な画像の入力を制限する | preprocess.input_max_width, preprocess.input_max_height, preprocess.input_max_depth |
| サイズ変更、トリミング、またはレターボックス表示 | preprocess.resize |
| RGB、BGR、NV12、I420、またはグ レースケールに変換します。 | preprocess.color_convert |
| HWC、CHW、またはその他の軸の順序を変換します。 | preprocess.layout_convert |
| 平均値/標準偏差による正規化を適用します。 | preprocess.normalizeまたはpreprocess.preset |
| 推論前に量子化する | preprocess.quantize |
| 推論の前にテッセレーションを実行する | preprocess.tessellate |
| 順序付きの変換リストで上書きする | preprocess.transforms |
実際に送信する入力内容を最も簡潔に記述するオプションセットを設定します。仕様は契約書であり、決定されたプリプロセス計画は領収書です。
仕様を確認し、直接実行します。
Graphを作成する前に、モデル契約を確認してください。仕様書には、何を割り当て、送信し、デコードするかについて記載されています。
simaai::neat::Model model(model_path, options);
const auto inputs = model.input_specs();
const auto outputs = model.output_specs();
const auto metadata = model.metadata();
const auto info = model.info();
for (const auto& input : inputs) {
const auto& shape = input.shape;
}
for (const auto& output : outputs) {
const auto& shape = output.shape;
}
simaai::neat::Tensor input = simaai::neat::Tensor::from_cv_mat(
frame,
simaai::neat::ImageSpec::PixelFormat::BGR,
simaai::neat::TensorMemory::CPU);
simaai::neat::TensorList result = model.run(
simaai::neat::TensorList{input},
/*timeout_ms=*/2000);
Pythonでは、入力のリストまたはタプルを渡します。model.run([tensor])は「1つのモデル入力」を意味します。バッチ次元は追加されません。
model.run(...)は、毎回再構築するのではなく、一度だけ実行する形式です。最初の呼び出しで、内部ランナーを遅延的に構築し、キャッシュします。以降の呼び出しでは、そのランナーを再利用し、データをプッシュ/プルします。ルーティングオプション、ランタイムオプション、測定、クローズ/ドレイン制御、またはプロデューサー/コンシューマーループが必要な場合は、明示的なmodel.build(...)を使用してください。
OpenCVサポートを使用してC++でビルドする場合、model.run(std::vector<cv::Mat>{frame}, timeout_ms)も公開されます。例でピクセル形式またはメモリの所有権を明示する必要がある場合は、明示的なTensor::from_cv_mat(...)パスを使用してください。