メインコンテンツまでスキップ

BoxDecode デコードの種類

nodes::SimaBoxDecode は、生の検出ヘッドテンソルを検出結果に変換します。モデル推論の後に、選択したモデルファミリーのデコード計算を適用し、検出をフィルタリングします。NMS と出力形式は選択したファミリーによって異なります。検出モデルはペイロードをボックスとして解析でき、姿勢・セグメンテーションモデルはボックスに続くキーポイントやマスクも解析できます。

通常のモデルパックの使用では、Model を認識するコンストラクタを使用することを推奨します。モデルアーカイブは、デコーダーに必要なテンソルの順序、レイアウト、量子化、クラス数、リサイズメタデータ、およびスコアドメインのヒントを提供します。通常、アプリケーションはデコードファミリーとフィルタリングの閾値を選択するだけです。

ランタイムバックエンド​

BoxDecode と SuperPoint は、検証済みの Kernels 実行ファイルと neatkernelrunner を使います。既存の検出・特徴出力形式は変わりません。YOLO26 の回転ボックスには、別のバージョン付き形式を使います。テンソルを直接入力する場合は、デコードを A65 で実行する場合も共有 CMA テンソル(TensorMemory::EV74)を使ってください。このメモリの選択は DMA-BUF 転送を提供するものであり、実行ターゲットを指定するものではありません。

RCNN ステージ 1 はカーネルが管理するレベル別 top-K 契約を使います。グローバル NMS の後、モデル面積レベルごとに最大 top_k 件を残します。出力は通常の BBOX 形式ではなく、提案用ワイヤ形式です。4 つのグループがあり、それぞれに INT32 の件数と、6 個の FP16 からなる top_k 件のレコード(score, 0, x1, y1, x2, y2)が含まれます。座標変換では最終シリアライズまで小数の幾何情報を保持します。ステージ 2 の提案入力として使い、decode_bbox_tensor() には渡さないでください。従来のプラグインはロードされません。

パディング付きでインターリーブされた INT8、BF16、FP32 の SuperPoint ヘッドは、明示的なピクセルストライドを指定したネイティブ密形式リーダーを使います。Cast ステージや実体化を行わずに、検出器のリダクションと記述子のサンプリングからパディングを除外します。INT8 ポートはそれぞれに設定された量子化を保持します。ネイティブ MLA タイル形式のヘッドは宣言された物理レイアウトを保持し、密形式のスカラーを MLA バイトプレーンとみなすことはありません。

クイックスタート​

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)の閾値。0はモデルにパッケージされた値を保持します。パッケージされた値がない場合、YOLO26はNMSをスキップし、その他のデコーダーは重なりのあるボックスをすべて抑制します。0.45など、モデルに適した値を設定してください。
top_k最大出力数。生のバウンディングボックスのデコードでは、明示的な正の上限が必要です。モデルに結び付けたノードでは、0 は解決済みの Model 上限を継承します。SuperPoint では、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_obb(...)pyneat.decode_obb(...)所有権を持つジオメトリ [N, 5] float32(cx, cy, width, height, angle_radians)、スコア [N] float32、クラス ID [N] int32
ポーズ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
セグメンテーション + ポーズdecode_segmentation_pose(...)pyneat.decode_segmentation_pose(...)ボックス [N, 6] float32、マスク [N, 160, 160] uint8、キーポイント [N, 17, 3] float32
SuperPointdecode_superpoint(...)pyneat.decode_superpoint(...)キーポイント [N,2]、スコア [N]、記述子 [N,D]

軸に平行な検出結果の表示グラフでは、結果を SimaRender に渡せます。decode_bbox(...) は既存のボックス先頭形式にのみ使ってください。これも SimaRender も回転ボックスには対応していません。

従来の DETR​

同じクエリグリッド上にある、4 チャネルのボックスロジットと末尾に背景チャネルを持つクラスロジットには Detr を選択します。decode_type_option は Auto のままにしてください。テンソル名に依存せず、レシピが Softmax を選択します。背景は分母に含まれますが、前景クラス数と出力の選択からは除外されます。ボックス座標には sigmoid が適用されます。既に正規化された focal-loss のボックス用デコーダーではありません。

Stretch と正の top_k を使用してください。NMS は適用されず、前処理メタデータを使って元フレームの座標へ変換します。確率値を指定するレイアウトや矛盾するスコア活性化は拒否されます。

options = pyneat.ModelOptions()
options.decode_type = pyneat.BoxDecodeType.Detr
options.preprocess.resize.mode = pyneat.ResizeMode.Stretch
options.top_k = 100
options.score_threshold = 0.7

Focal loss を用いるクエリ検出器​

正規化済み cx,cy,width,height(深さ4)と独立したクラスロジット(深さN)の順に並ぶ2つのテンソルには、BoxDecodeType::DetrFocal(Python: pyneat.BoxDecodeType.DetrFocal、トークン detr-focal)を使用します。クエリ軸とデータ型は一致し、Nは1~1024です。FP32、BF16、および量子化情報が指定されたINT8ストレージに対応します。

クラスロジットだけにsigmoidを適用し、全クエリ・クラスの組から上位K件を選択します。同じクエリから複数のクラスを出力できます。背景クラス、ボックスへのsigmoid、クエリごとのargmax、NMS、小面積フィルターはありません。正の top_k、フィルタリングなしなら detection_threshold=0、必須の nms_iou_threshold=0 を設定します。Stretchと実際の画像・モデル寸法を使用してください。

既存の BBOX 出力はボックスを画像境界にクリップし、XYWH座標を整数に丸めます。decode_bbox はそれを浮動小数点値として公開しますが、サブピクセル精度は復元しません。クリップしない浮動小数点リファレンスとは別に精度への影響を測定してください。従来の BoxDecodeType::Detr は変更されず、この形式ではなくボックスロジットと背景クラスを含むsoftmaxスコアを期待します。

Pythonでは decode_bbox(..., strict=True) を使用し、既定の縮退ボックス除去を避けて、丸めにより面積がゼロになった行も保持してください。

Python の raw-geometry オーバーロードは C++ ファクトリに対応し、ヘッドテンソルを直接渡す場合に使用します。密な FP32 ヘッドでは、モデルの出力アダプターをすべて保持し、実際のストレージを明示してください。生の MLA 出力で打ち切ったり、パディング済みバイトを密なテンソルとして扱ったりしないでください。

node = pyneat.nodes.sima_box_decode(
pyneat.BoxDecodeType.DetrFocal,
original_width=1280, original_height=720,
model_width=640, model_height=640,
detection_threshold=0.0, nms_iou_threshold=0.0, top_k=300,
decode_type_option=pyneat.BoxDecodeTypeOption.InterleavedByHeadLogit,
source_storage=pyneat.BoxDecodeSourceStorage.DenseHwc,
detess=False, dequant=False,
resize_mode=pyneat.ResizeMode.Stretch,
)

有限の反転サイズは既存の端点クリップで面積ゼロの BBOX レコードになり、選択したペアとスコアを保持します。非有限の座標やロジットは、出力を公開する前に失敗します。

YOLOv8 と YOLO11 の回転ボックス​

BoxDecodeType::YoloV8Obb(Python: pyneat.BoxDecodeType.YoloV8Obb、トークン yolov8-obb または yolo11-obb)を選択します。INT8、BF16、FP32 のヘッド 9 個を役割別にグループ化して渡します。64 チャネルの DFL ボックス、クラスロジット、角度ロジットの各ヘッド 3 個を、ストライド 8、16、32 の順に並べます。完全なクラス数はクラスヘッドから推定されます。

BoxDecode は DFL、クラスの sigmoid、(sigmoid(angle)-0.25)*pi、nms_iou_threshold によるクラス別の回転 Fast-NMS を適用します。入力は生のロジットでなければなりません。ジオメトリと BBOX_OBB_V1 出力は以下の YOLO26 契約に従い、同じ decode_obb ヘルパーを使用します。

YOLO26 の回転ボックス​

BoxDecodeType::YoloV26Obb(Python: pyneat.BoxDecodeType.YoloV26Obb、トークン yolo26-obb)を明示的に選択します。このプロファイルは、ストライド 8、16、32 の 4 チャネル距離ヘッド 3 個、クラスロジットヘッド 3 個、1 チャネルの生の角度ヘッド 3 個を、役割ごとにまとめた 9 個の FP32、BF16、または INT8 ヘッドとして受け取ります。すべてのヘッドで完全なクラス数(1–256)が一致する必要があります。Auto、GroupedByRole、GroupedByRoleLogit はこのグループ化レイアウトを選択します。確率値のクラスヘッドやインターリーブレイアウトは拒否されます。

INT8 ヘッドには、正の有限値を持つテンソル単位の量子化メタデータと INT8 のゼロポイントが必要です。BF16 と FP32 のヘッドでは整数量子化メタデータを使いません。

正の top_k と nms_iou_threshold = 0 を指定します。クラスロジットに sigmoid を適用し、最大の活性化スコアでアンカーを選んだ後、アンカーとクラスのペアを選択します。同点では第 1 段階の順位とクラス順を保持します。スコアの比較は厳密な不等号(score > detection_threshold)です。生の角度はすでにラジアン単位であり、デコーダーは sigmoid の適用や範囲の正規化を行いません。

前処理メタデータには、X/Y のスケールが正かつ等しく、せん断を含まない、モデル座標から元画像座標への明示的で有限な変換が必要です。モデルと同じサイズのタイルでも、明示的な恒等変換が必要です。変換がない場合や異方的な場合は、回転矩形を近似せずに拒否します。符号付きの有限な幅・高さを保持し、画像境界でクリップしません。タイル分割した DOTA 評価では各タイルに恒等変換を使い、タイルのオフセット復元とタイル間のポリゴン抑制はアプリケーションで行ってください。

ソース駆動グラフでは、Core は検証済みの上流 Preproc 契約から初期準備用のジオメトリを導出します。これは準備用の初期値にすぎません。各フレームには引き続き、有限で正の一様なアフィン変換と、モデルに一致するキャンバス寸法が必要です。フレームの変換がない場合はエラーとなり、恒等変換にフォールバックしません。

出力には BBOX_OBB_V1 タグが付きます。32 バイトのバージョン付きヘッダーに、32 バイトのレコードが top_k 個続きます。未使用レコードはゼロです。decode_obb_tensor(tensor) は単一のキャリアを検証し、decode_obb(tensors) はキャリアごとに 1 個の型付き結果を返します。どちらも所有権を持つ CPU テンソルにコピーし、クラス ID は INT32 のままです。例:

result = pyneat.decode_obb(outputs)[0]
geometry = result.geometry.to_numpy() # cx, cy, width, height, angle_radians
scores = result.scores.to_numpy()
class_ids = result.class_ids.to_numpy()

この形式は、意図的に先頭 BBOX の拡張としていません。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 は、テンソルの形状や値から動作を推測しません。

プロファイル選択するタイミング生産状況
LightGlueV1LightGlue互換の検出器、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は、そのプロビナンスを破棄または再解釈しません。

BBOXワイヤーペイロード​

検出デコード処理は、入力フレームごとに1つのテンソルを出力し、そのテンソルにはBBOXというタグが付けられます。このテンソルは、ランク1のUInt8型のバイトバッファーです。

フィールド値
semantic.detection.format"BBOX"
dtypeUInt8
shape[N_bytes]。ここで、N_bytesは、モデルアーカイブから得られる、パックされたバッファーの容量である。

テンソルの形状は、検出回数ではなく、バイト数で表されます。ペイロードはリトルエンディアン形式を使用します。

offset size content
------ ---- -------
0 4 uint32 N = valid detections in this frame
4 24 RawBox[0]
28 24 RawBox[1]
. . ...
. . RawBox[N-1]
trailing bytes are padding and must be ignored

各RawBoxレコードは24バイトです。

オフセットサイズタイプフィールド意味
04int32xソース画像の左上のx座標(ピクセル単位)。
44int32yソース画像の左上の y 座標。
84int32w元画像のピクセル単位での幅。
124int32h元の画像のピクセル単位の高さ。
164float32scoreNMS後の[0.0, 1.0]における信頼度。
204int32class_idモデルで定義されたクラスID。

1つのレコードに対応するPythonのstruct形式は"<iiiifi"です。

座標は、上流のプリプロセス処理メタデータが存在する場合、元の画像のピクセル単位で表されます。座標は[0, 1]に正規化されることも、モデルの内部レターボックス形式の入力空間で表現されることもありません。

セグメンテーション + ポーズの結合ペイロード​

yolox-seg-pose は、3 つの領域を含む単一のバッファーを出力します。すべての領域は同じスロット数 top_k に基づいて配置されます。

領域オフセットストライド内容
ヘッダー04int32 の検出数
ボックス424前述の BoundingBoxOut レコード
マスク4 + 24*top_kmask_w * mask_huint8、スロットごとに 1 平面
ポーズ4 + (24 + mask_w*mask_h)*top_k20417 x {uint32 x, uint32 y, float32 visibility}

decode_segmentation_pose(...) でボックス、マスク、キーポイントを取得します。各テンソルの行 i は同じ検出を表します。ボックスのみが必要な場合は、decode_bbox(...) または BoxDecodeResults(...) を使用してください。

複合デコーダーは従来の BBOX タグも受け付けます。マスクとポーズの同時描画はサポートされません。複合バッファを poseyolo に渡さないでください。このレンダラーはボックスの直後にキーポイントがあることを想定しますが、複合ペイロードではその位置にマスクが格納されます。

検出ごとに 17 個のキーポイントスロットがあります。バックエンドは未使用のスロットと、pose_classes で除外されたクラスのキーポイントを 0 にします。ヘルパーはその値をそのままコピーします。

チャネル 0 が物体性を保持するため、Core はクラスヘッドの深さから 1 を引いて num_classes を求めます。たとえば 30 チャネルなら 29 クラスです。明示する num_classes はこの値と一致する必要があります。

キーポイントのクラス​

キーポイントを持つクラスの ID を設定します。

options = pyneat.BoxDecodeOptions(pyneat.BoxDecodeType.YoloXSegPose)
options.yolox_seg_pose.pose_classes = [0, 5]

ModelOptions.yolox_seg_pose にも同じ設定を指定できます。

  • リストにないクラスのキーポイント座標と可視性は 0 になります。
  • BoxDecodeOptions のリストが空の場合、モデルの設定を継承します。リストを設定しない場合、すべてのクラスにキーポイントが生成されます。
  • ID は重複せず、[0, num_classes) の範囲内である必要があります。このオプションは YoloXSegPose でのみ使用できます。

model.run が生のヘッドを返す場合​

一部のモデルの処理経路では、デコードされたBBOXテンソルではなく、model.run(...)から生の特徴マップヘッドが返されます。これは、処理が失敗したことを意味するのではなく、モデルは正常に実行されたものの、出力の読み取り時にBoxDecodeが処理経路に含まれていなかったことを意味します。

次のルールを使用してください。

  • detections=...またはBBOXテンソル:パックされたBBOXペイロードを解析するか、または使用します。 デコードヘルパー。
  • raw_output_heads=...: BoxDecodeステージを追加するか、モデルのルーティングを検査するか。 モデル固有の後処理を用いて、生のテンソルを処理します。

生のヘッダーをボックスとして解析しないでください。生のテンソルのレイアウトは、エクスポートされたモデルのファミリーとモデルアーカイブの仕様によって異なります。

契約を上書きする​

MPK はテンソル契約とデコードファミリーの情報を提供します。フィルタリングの設定は ModelOptions で行います。SimaBoxDecode(Model, ...) ノードでは、正のフィルタリング引数が解決済み Model 設定を上書きし、ゼロの引数はそれを継承します。ModelOptions.score_threshold = 0.0 は実際にゼロのスコアしきい値を指定するもので、パッケージ内のしきい値を復元する要求ではありません。

ランタイム引数渡された値動作
decode_type空 / Unspecifiedサポートされている場合は、モデルアーカイブまたはルートプランナー推論を保持します。
decode_type具体的な型この実行において、デコード処理を上書きします。
original_width / original_height0パッケージ化されたジオメトリまたは上流のプリプロセスメタデータを保持します。
original_width / original_height正の整数座標マッピングのために、元の画像のサイズを上書きします。
モデルに結び付けたノードの detection_threshold0.0解決済み Model スコアしきい値を継承します。
モデルに結び付けたノードの detection_threshold> 0.0スコアしきい値を上書きします。
モデルに結び付けたノードの nms_iou_threshold0.0解決済み Model の NMS IoU を継承します。
モデルに結び付けたノードの nms_iou_threshold> 0.0NMS IoU を上書きします。
モデルに結び付けたノードの top_k0解決済み Model 出力上限を継承します。
モデルに結び付けたノードの top_k> 0保持する検出数の上限を上書きします。

バウンディングボックスのデコードには、解決後の top_k が正の値である必要があります。ゼロは無制限の出力ストレージを要求するものではありません。Model に結び付けていない生ヘッドでは、グラフ構築前に top_k を設定してください。モデルに結び付けたノードでは、自身の top_k をゼロのままにすることで、正の Model 上限を継承できます。これらの設定は、別の結果読み取りヘルパーには影響しません。ヘルパーの top_k=0 は、すでに上限のある出力に追加の制限を設けないという意味です。スコアしきい値がゼロならゼロのスコアも許可されますが、幾何情報の検証、背景除外、NMS、出力上限は迂回しません。NMS IoU がゼロの場合、YOLO26 は NMS を省略します。NMS が有効なほかの YOLO および SSD プロファイルは、引き続き量子化 IoU による抑制を行います。YOLO26 で正のしきい値を指定すると NMS が有効になります。

num_classes は、呼び出し側が設定した値と、MPK テンソル契約から導出されたクラス数を比較します。

モデルファミリー設定された num_classesMPK から導出された num_classes動作
サポートされる任意のモデル0推論可能な正の値MPK から導出されたクラス数を使用します。
サポートされる任意のモデル正の整数同じ値設定されたクラス数を使用します。
クラス分割が曖昧なモデル正の整数利用不可設定されたクラス数を使用します。単一クラスヘッドの分割を確実に推論できない場合に必要です。
YOLOv5 または YOLO26正の整数異なる値パイプラインの構築前に失敗し、両方の値を報告します。これらの生ヘッドレイアウトは、テンソルの深さからクラス数を導出します。
SSD または YOLO26 より前の姿勢推定以外の YOLO ファミリー正の整数異なる値既存のファミリー固有の明示的オーバーライド動作を適用します。姿勢推定デコーダーと SuperPoint は、ファミリー固有のルールを維持します。

detection_threshold は、BoxDecodeノード/ステージのコンストラクタで使用される名前です。ModelOptions.score_threshold は、同じ制御に渡されるモデルルートオプションです。

デコードタイプのマッピング​

API列挙型バックエンドトークン一般的なモデルファミリー
BoxDecodeType::Yoloyoloモデルのピクセル単位にデコード済みの cx,cy,w,h
BoxDecodeType::YoloV5yolov5YOLOv5による検出
BoxDecodeType::YoloV5Segyolov5-segYOLOv5セグメンテーション
BoxDecodeType::YoloV7yolov7YOLOv7による検出
BoxDecodeType::YoloV7Segyolov7-segYOLOv7セグメンテーション
BoxDecodeType::YoloV8yolov8YOLOv8による検出
BoxDecodeType::YoloV8Segyolov8-segYOLOv8セグメンテーション
BoxDecodeType::YoloV8Poseyolov8-poseYOLOv8 ポーズ
BoxDecodeType::YoloV9yolov9YOLOv9による検出
BoxDecodeType::YoloV9Segyolov9-segYOLOv9セグメンテーション
BoxDecodeType::YoloV10yolov10YOLOv10による検出
BoxDecodeType::YoloV10Segyolov10-segYOLOv10セグメンテーション
BoxDecodeType::YoloV26yolo26YOLO26による検出
BoxDecodeType::YoloV26Poseyolo26-poseYOLO26 ポーズ
BoxDecodeType::YoloV26Segyolo26-segYOLO26セグメンテーション
BoxDecodeType::YoloV26Obbyolo26-obbYOLO26 回転物体検出 (BBOX_OBB_V1)
BoxDecodeType::YoloV6yolov6YOLOv6による検出
BoxDecodeType::YoloXyoloxYOLOXによる検出
BoxDecodeType::YoloXSegPoseyolox-seg-poseボックス、マスク、キーポイントのヘッドをまとめた YOLOX パック形式のエクスポート
BoxDecodeType::Ssdssd注文されたヘッドジオメトリから選択された、正確に準備されたSSD300、SSD-Mobile-300、SSD-Mobile-320、またはSSDlite-Mobile-320の契約。
BoxDecodeType::SuperPointsuperpointSuperPoint検出器および特徴記述子の後処理
BoxDecodeType::DetrdetrDETRスタイルのトランスフォーマーによる検出
BoxDecodeType::EffDeteffdetEfficientDetによる検出
BoxDecodeType::RcnnStage1rcnn-stage1順序付けられた 5 つの RPN ヘッド。グローバル NMS の後に面積レベルごとの top-K を実行
BoxDecodeType::CenternetcenternetCenterNetによる物体検出

BoxDecodeType::Unspecified は未設定のプレースホルダーであり、ランタイム前にエラーが発生します。SSDレシピの識別子は、別の公開デコードタイプやバックエンドトークンではなく、内部のCore契約(ssd300-v1、ssd-mobile-300-v1、ssd-mobile-320-v1、またはssdlite-mobile-320-v1)です。Coreは、最適化処理の前にこれを解決し、インストールされたオブジェクトデコーダーは引き続き、サポートするssd ファミリーのトークンを受け取り、すでに検証済みのヘッドジオメトリから対応する固定実装を選択します。

適切なタイプを選ぶ​

  • エクスポートされたヘッドの契約に従って選択します。YoloV6 は生の l/t/r/b 距離とクラスのロジットを要求します。グラフ内でボックスをデコードする YOLOv6 パックには Yolo を使用します。[bbox_0..2, class_prob_0..2] の順にグループ化された出力では、decode_type_option=GroupedByRoleProbability と学習済みクラス数に合う num_classes を設定します。
  • ボックスが正しく配置または拡大・縮小されていない場合は、画像のサイズ変更ポリシーを確認してください。resize_mode_override は、グラフに、サイズ変更メタデータを書き込む上流の Preproc ステージがない場合にのみ使用してください。
  • カスタムモデルパックを作成する場合は、アーカイブに、検出ヘッドに関する正確な情報(テンソルの順序、論理的な形状、物理的な格納方法、dtype/量子化、スコアの範囲、クラス数、およびスライスされた出力など)が記載されていることを確認してください。アプリケーションコードは、これらの詳細を補正する必要はありません。

形状とレイアウトに関するガイドライン​

異なる検出モデルは、それぞれ異なるヘッドレイアウトを使用します。あるモデルは、各特徴マップレベルに対して1つのテンソルを使用し、別のモデルは、バウンディングボックス、オブジェクトネス、クラス、キーポイント、またはマスクを個別のテンソルに分割します。一部のモデルの出力は、密なHWCテンソルであり、他のモデルの出力は、コンパイラ/ランタイムによってパックまたはスライスされます。

モデルパックフローの場合、これはパッケージ化されたコントラクトによって処理されます。手動で接続されたテンソルの場合、重要なルールは次のとおりです。エクスポートされたヘッド形式と完全に一致させます。ランクまたはチャネル数のみに基づいてデコードタイプを選択しないでください。

高度なテンソルコントラクトルール:

  • YoloV5 検出以外の YOLO ファミリーのデコードタイプ(Yolo、YoloV7、YoloV8、YoloV9、YoloV10、およびセグメンテーション/姿勢推定の派生型)は、分離ヘッド、またはモデルファミリーに一致するパックヘッドのいずれかを想定します。

  • パックされたYOLOヘッドは、クラス数とヘッドの深さを一貫して保つ必要があります。 機能レベル。

  • YoloV5 検出は、P3/P4/P5 の順に並んだ未デコードのパックヘッドをちょうど 3 つ受け取ります。それらのグリッドはストライド 8/16/32 の形状である必要があり、各論理深さは 3 * (num_classes + 5) でなければなりません。BoxDecode はシグモイド、グリッドとストライドの変換、および標準の YOLOv5 アンカー({10,13},{16,30},{33,23}、{30,61},{62,45},{59,119}、{116,90},{156,198},{373,326})を適用します。カスタムの AutoAnchor テーブルや、デコード済みの 6 テンソルのボックス/クラス出力は、別の契約を使用する必要があります。

  • YoloV26は、グループ化された生の左/上/右/下のバウンディングボックスのヘッドと、クラススコアのヘッドを使用します。

  • Ssdは、汎用的なSSDデコーダーではありません。あらかじめ用意された4つのプロファイルのみを処理します。 コンパイル時に、完全な順序で指定されたロケーション/構成のヘッダー/ハードウェア/コンポーネントの署名を使用します。それ以外のヘッダーセットや順序が指定された場合、エラーが発生し、実際に使用された署名とサポートされている署名が表示されます。

    • SSD300 (dboxes300_coco): 300×300の入力サイズ、特徴マップ {38,19,10,5,3,1}、セルごとの事前分布 {4,6,6,6,4,4}、信頼度チャンネルの順序 class*A + anchor、クラスのスコアは、クラス次元に沿ってソフトマックス関数を適用することで算出されます(背景はインデックス0として含みます)。
    • SSD-Mobile-300-v1 (ssd_anchor_generator): 300×300の入力、特徴 マップ {19,10,5,3,2,1}、セルごとの事前分布 {3,6,6,6,6,6}、信頼度チャンネル 順序 anchor*C + class、クラスごとのシグモイド関数を使用してクラスのスコアを算出します(背景は無視されます)。
    • SSD-Mobile-320-v1 (ssd_anchor_generator): 320×320の入力、特徴 マップ {20,10,5,3,2,1}、セルごとの事前分布 {3,6,6,6,6,6}、信頼度チャンネル 順序 anchor*C + class、クラスごとのシグモイド関数を使用してクラスのスコアを算出します(背景は無視されます)。
    • SSDlite-Mobile-320-v1(TorchVision DefaultBoxGenerator):320×320 入力、特徴マップ {20,10,5,3,2,1}、各レベルでセルあたり6つの事前ボックス、 位置合わせの順序 anchor*4 + {dx,dy,dw,dh}、信頼度の順序 anchor*C + class、および背景を含むすべての91クラスに対するソフトマックスによるクラススコア。

    すべてのレシピでは、グループ化されたレベルごとの位置合わせヘッド(深さ = 4 * priors-per-cell)とクラス-信頼度ヘッド(深さ = num_classes * priors-per-cell)がペアになっており、FasterRcnnBoxCoderの分散スケーリング (scale_xy 0.1、scale_wh 0.2)、およびストレッチ(異方性)による前処理リサイズが使用されます。スコア活性化はレシピによって固定されます(デバイス上のデコーダーと一致します)。役割ごとにグループ化されたレイアウトは自動的に選択されます。decode_type_optionをAutoのままにします。グループ化されていないレイアウトトークンは拒否されます。

    モデルフレームは、ヘッドのジオメトリだけでなく、プロファイルの一部です。 SSD300-v1とSSD-Mobile-300-v1では、300×300が必要です。両方の320-v1プロファイルでは、320×320が必要です。解決された前処理リサイズターゲット、またはそれ以外のサイズのモデル次元のオーバーライドは、ビルド時に拒否されます。これは、事前ボックステーブルとストレッチによる逆投影が、そのフレームでのみ有効であるためです。

    生の/スタンドアロンのSimaBoxDecodeの構築では、リサイズモードは決して生成されません。上流のPreprocメタデータ要件を維持するか、明示的な生のオーバーロードを使用して、外部で実行されるResizeMode::Stretchをアサートします。LetterboxとCropは拒否されます。

num_classes契約。 エンコードされたクラス数は、常に信頼度ヘッドの深さ(conf_depth / priors-per-cell、インデックス0に背景が含まれる)から導き出されます。SSD300-v1では、準備された81から8への連続したプレフィックス選択が許可されます。他の3つのプロファイルでは、正確なエンコードされた数が必須です。無効な選択は、ビルド時に拒否されます。設定しない場合は、プロファイルのデフォルトが使用されます。

  • Detr は、最大のヘッド深度からクラスチャネルを推論し、有効なものを必要とします。 クラス:次元。
  • EffDet と Centernetは、それぞれのモデルファミリーの規約を使用します。 YOLOデコードタイプのルーティングを経由させないでください。
  • *-seg デコードタイプは、ボックスの先頭部分の出力と、タスク固有のマスクデータを生成します。

カスタムモデルパックが、いずれかの完全な順序付きシグネチャと一致しない場合は、マッチャーを弱体化させるのではなく、新たに明示的にサポートするプロファイルを作成してください。

Pythonに関するメモ​

Pythonからモデルのオプションを設定する場合、文字列ではなく、型付きの列挙型を使用できる場合はそちらを使用してください。

opt = pyneat.ModelOptions()
opt.decode_type = pyneat.BoxDecodeType.YoloV8

モデルのタスクに合ったヘルパーを使用して、出力を解析します。

outputs = model.run([image])

boxes = pyneat.decode_bbox(outputs)[0].to_numpy()

pose = pyneat.decode_pose(outputs)[0]
pose_boxes = pose.boxes.to_numpy()
keypoints = pose.keypoints.to_numpy()

seg = pyneat.decode_segmentation(outputs)[0]
seg_boxes = seg.boxes.to_numpy()
masks = seg.masks.to_numpy()

アップグレード​

以前の BoxDecode オプションは ABI 6 を導入しました。現在の元の演算オプションには ABI 7 (libsima_neat.so.7) が必要です。対応するヘッダーとライブラリで C++ アプリケーション、プラグイン、Python バインディングを再ビルドし、互換性用シンボリックリンクで ABI 5/6 のバイナリを読み込まないでください。

複合 YOLOX 入力の受け入れ条件​

YoloXSegPose は BF16 と INT8 のヘッド、または連続ストレージか、正で重なりのないストライド付きストレージ(平面 CHW ビューを含む)に置かれたネイティブ FP32 ヘッドを受け付けます。FP32 のアドレスとストライドは 4 バイト境界に整列させる必要があります。チャネルブロック化された FP32 と UINT8 は拒否されます。損失を伴う暗黙の FP32 変換は追加されません。プロトタイプは独自の dtype とテンソル単位の INT8 量子化を持ちますが、各検出ヘッド内の役割間では dtype が一致している必要があります。Core は、最初のヘッドの dtype や量子化をすべてのポートに適用するのではなく、Kernels の受け入れ検証のためにポートごとの情報を保持します。3 つの検出レベルは両軸ともストライド 8、16、32 です。モデルの幅と高さは 32 の倍数である必要がありますが、同じ値である必要はありません。プロトタイプは 160×160×32 のままで、モデル寸法に合わせて暗黙にリサイズされることはありません。

中心からずれたパディングやクロップの座標には、前処理メタデータを使います。アフィン変換の方向はモデル座標から元画像座標へです。この複合プロファイルでは、せん断、回転、ROI リストはサポートされません。クロップには準備時に信頼できるアフィンメタデータが必要です。これは外部で前処理されたテンソルのデコーダー契約であり、Model の前処理でクロップを生成する新機能ではありません。キーポイントが 17 個未満のモデルでも、公開ワイヤ形式は固定の 17 スロットを使い、未使用スロットはゼロに設定されます。