BoxDecode デコードの種類
nodes::SimaBoxDecode は、生の検出ヘッドのテンソルを検出結果に変換します。これはモデル推論の後に実行され、選択されたモデルファミリーのデコード計算を適用し、信頼度の低いボックスをフィルタリングし、NMS(Non-Maximum Suppression)を実行し、デコードされたボックスから始まるテンソルペイロードを出力します。検出モデルは、そのペイロードをボックスとして解析できます。姿勢およびセグメンテーションモデルも、ボックスの後に続くキーポイントまたはマスクを解析できます。
通常のモデルパックの使用では、Model を認識するコンストラクタを使用することを推奨します。モデルアーカイブは、デコーダーに必要なテンソルの順序、レイアウト、量子化、クラス数、リサイズメタデータ、およびスコアドメインのヒントを提供します。通常、アプリケーションはデコードファミリーとフィルタリングの閾値を選択するだけです。
クイックスタート
using namespace simaai::neat;
Model model("/path/to/yolov8_model.tar.gz");
auto boxdecode = nodes::SimaBoxDecode(
model,
BoxDecodeType::YoloV8,
/* detection_threshold */ 0.25,
/* nms_iou_threshold */ 0.45,
/* top_k */ 100);
スタンドアロンのステージで使用する場合:
simaai::neat::stages::BoxDecodeOptions opt(simaai::neat::BoxDecodeType::YoloV8);
opt.detection_threshold = 0.25;
opt.nms_iou_threshold = 0.45;
opt.top_k = 100;
引数
| 引数 | 意味 |
|---|---|
decode_type | モデルファミリー/ヘッド形式。例:BoxDecodeType::YoloV8 または BoxDecodeType::YoloX。必須。 |
detection_threshold | 検出結果を維持するために必要な最小スコア。0.25などの、モデルに適した値を設定してください。 |
nms_iou_threshold | 非最大値抑制で使用されるIoU(Intersection over Union)の閾値。 |
top_k | 維持する検出結果の最大数。0 は、バックエンド/モデルのデフォルト値を使用します。 |
original_width x original_height | は、生のジオメトリコンストラクタを使用する際に、座標マッピングに使用するソース画像のサイズです。 |
model_width, model_height | モデルの入力サイズを上書きします。これを使用すると、 Model コンストラクタは、パッケージ化されたテンソルの契約ではなく、空間デコードのパラメータを変更します。 |
resize_mode_override | は、アップストリームのPreprocステージでリサイズメタデータが書き込まれない場合にのみ使用し、必要に応じて、拡大/レターボックス/トリミングの動作を明示的に指定します。 |
decode_type_option | 高度なサブレイアウトセレクター。モデルパックを使用する場合は、Auto のままにしておきます。エクスポートされたヘッドレイアウトを把握している場合にのみ変更してください。 |
入力と出力
入力: モデルからの生の検出テンソル。期待されるテンソルの形状は、モデルの種類によって異なります。MPK/モデルアーカイブを使用する場合、Neat は、パッケージ化されたコントラクトからこれらの詳細を読み取ります。
出力: デコードされた検出を含む 1 つの BoxDecode テンソル。検出モデルは、標準の BBOX ペイロードを使用します。ポーズおよびセグメンテーションモデルは、先頭のボックスを同じままにして、タスク固有のペイロードを追加します。
| モデルタスク | C++ヘルパー | Pythonヘルパー | デコードされ たテンソル |
|---|---|---|---|
| 検出 | decode_bbox(...) | pyneat.decode_bbox(...) | [N, 6] float32 boxes: x1, y1, x2, y2, score, class_id |
| ポーズ | decode_pose(...) | pyneat.decode_pose(...) | ボックス [N, 6] とキーポイント [N, 17, 3] float32: x, y, visibility |
| セグメンテーション | decode_segmentation(...) | pyneat.decode_segmentation(...) | ボックス [N, 6] float32、マスク [N, 160, 160] uint8 |
| SuperPoint | decode_superpoint(...) | pyneat.decode_superpoint(...) | キーポイント [N,2]、スコア [N]、記述子 [N,D] |
検出結果を表示するグラフは、その結果をSimaRenderに渡すことができます。ボックスのみが必要なアプリケーションコードは、引き続きBoxDecodeの出力に対してdecode_bbox(...)を使用できます。
スーパーポイント
SuperPointは、BoxDecode製品の一部として引き続き機能しますが、ボックスであるかのように扱うのではなく、特徴点を出力します。最小限のA65デフォルト設定は次のとおりです。
BoxDecodeOptions options{BoxDecodeType::SuperPoint};
options.superpoint.descriptor_output_dtype = TensorDType::Float32;
auto decoder = nodes::SimaBoxDecode(model, options);
Pythonでも同じデフォルト値が使用されます。
options = pyneat.BoxDecodeOptions(pyneat.BoxDecodeType.SuperPoint)
options.superpoint.descriptor_output_dtype = pyneat.TensorDType.Float32
decoder = pyneat.nodes.sima_box_decode(model, options=options)
A65V1 はデフォルトのプロファイルです。モデルが異なる数値演算を必要とする場合は、別のプロファイルを明示的に選択してください。Neat は、テンソルの形状や値から動作を推測しません。
| プロファイル | 選択するタイミング | 生産状況 |
|---|---|---|
LightGlueV1 | LightGlue互換の検出器、NMS、座標、および記述子の動作 | サポート対象 |
MagicLeapDemoV1 | 固定されたMagic Leapデモの動作 | 対応状況 |
A65V1 | 以前のA65 SuperPointデコーダーとの互換性 | サポート済み。デフォルト設定。 |
PaperBicubicV1 | 将来の完全な双三次補間ポリシーのために予約された数値ID | プロダクショ ンで定義されるまで却下 |
数値の処理方法と出力エンコーディングは独立しています。たとえば、デフォルトのV1出力でA65の数値処理方法を選択できます。
BoxDecodeOptions options{BoxDecodeType::SuperPoint};
options.superpoint.profile = SuperPointProfile::A65V1;
options.superpoint.output_format = SuperPointOutputFormat::FeaturePointsV1;
従来のバイトレイアウトは、オプションで利用でき、いくつかの追加の制約があります。
options.superpoint.profile = SuperPointProfile::A65V1;
options.superpoint.output_format = SuperPointOutputFormat::LegacyA65InterleavedV0;
options.superpoint.descriptor_output_dtype = TensorDType::Int8;
SuperPointProfile::Auto は、まず信頼できるMPKのsuperpoint.profileメタデータを使用します。API(Model::Options.superpoint.profile)またはMPKのいずれからもプロファイルが提供されない場合、A65V1に解決されます。Neatは、テンソルの形状、値、ファイル名、または下流ノードからプロファイルを推測することはありません。
detection_threshold=0.0、top_k=0、nms_radius=-1、およびborder_margin=-1の公開されたデフォルト値が変更されていない場合、それらは選択されたプロファイルから解決されます。A65V1は、閾値0.1、Top-K600、NMS半径4、および境界マージン0に解決されます。LightGlueV1とMagicLeapDemoV1は、それぞれ閾値0.0005と0.015を使用します。どちらもTop-K600、NMS半径4、および境界マージン4を使用し ます。
nms_iou_thresholdはSuperPointには適用されません。代わりに、ピクセル半径であるsuperpoint.nms_radiusを使用してください。デフォルトの出力は、バージョン管理されたFEATURE_POINTS_V1構造化配列ペイロードです。LegacyA65InterleavedV0は、明示的な移行形式であり、256次元のINT8記述子が必要です。decode_bboxまたはBoxDecodeResultsではなく、decode_superpointを使用してください。
バージョン管理されたMPKsuperpointスキーマv1レコードは、エラーが発生した場合に安全に処理されます。これらには、プロファイル名、異なる検出器と記述子テンソルID、64桁の16進数を持つsha256:フィンガープリント、およびサポートされている入力表現raw-logits-65とcoarse-pre-l2が含まれている必要があります。スキーマ0は、移行/手動レコードとしてのみ受け入れられます。省略されたスキーマ0表現フィールドは、これらの2つの生の入力表現に標準化され、診断にデフォルトとして記録されます。不明なスキーマバージョンまたは表現トークンは、コンパイル時にエラーが発生します。APIプロファイルのオーバーライドが、別のMPKプロファイルに対してスタンプされたフィンガープリントと競合する場合、選択されたプロファイルに対してMPKを再スタンプします。Neatは、そのプロビナンスを破棄または再解釈しません。