AI・機械学習
D-FINE-seg – 1つのモデルで検出、インスタンス、セマンティックセグメンテーションを実現
D-FINE-seg – detection, instance and semantic segmentation in one model (github.com)
要約
D-FINE-segは、リアルタイムの物体検出、インスタンスセグメンテーション、セマンティックセグメンテーションを単一のコードベースで実現するフレームワークです。1つの設定フラグでタスクを切り替えられ、複数のモデルサイズが用意されています。データ準備からトレーニング、エクスポート、推論までエンドツーエンドのワークフローを提供し、既存モデルと比較して高い精度とリアルタイム性を両立しています。
全文翻訳
D-FINE-seg リアルタイム物体検出、インスタンスおよびセマンティックセグメンテーション クイックスタート • 使用法 • エクスポート • 推論 • ベンチマーク • ビデオチュートリアル • Colab
D-FINE-segは、リアルタイムの物体検出、インスタンスセグメンテーション、セマンティックセグメンテーションのためのフレームワークです。単一のコードベース、単一の設定フラグ(タスク: detect | segment | sem_seg)、5つのモデルサイズ(N -> X)を備えています。
エンドツーエンドのワークフロー - データセット準備 -> トレーニング(DDP、EMA、AMP、モザイク)-> エクスポート(ONNX、TensorRT、OpenVINO、CoreML、LiteRT)-> ベンチマークされたマルチバックエンド推論
精度 - Cityscapesでは、検出とインスタンスセグメンテーションでYOLO26およびRF-DETRを上回り、セマンティックセグメンテーションではmIoUをリードし、リアルタイムのレイテンシでパラメータ数は2〜3倍少なく、TACOおよびVisDrone(TensorRT FP16、エンドツーエンドプロトコル)でもYOLO26より高いF1スコアを達成しています。
論文 - D-FINE-seg: マルチバックエンドデプロイメントを備えた物体検出およびインスタンスセグメンテーションフレームワーク。
フォークではありません。検出コアはD-FINE論文に従い、セグメンテーションヘッド、トレーニング、エクスポート、推論はゼロから実装されています。
1フレーム、3タスク、1つの設定フラグ: 表は以下にあります。
ハイライト
インスタンスセグメンテーションヘッド(タスク: segment)- D-FINEのHybridEncoder PAN出力の上に軽量なマスクヘッドを配置。ストライド8/16/32のフィーチャーを1/4解像度に融合し、クエリごとのマスク埋め込み(3層MLP)と共有マスクフィーチャー間のドット積により、インスタンスごとのマスクを生成します。
セマンティックセグメンテーションヘッド(タスク: sem_seg)- フルフレームフィーチャー上の事前学習済みインスタンスセグメンテーションマスクフューザーを再利用し、その後小型の畳み込みネックと1x1分類器を適用します。クエリやNMSは不要です。
マスクアウェアトレーニング - ボックスクロップBCE + ダイスマスク損失(インスタンスセグメンテーション)およびCE + マルチクラスソフトダイス(ignore_index付き)(セマンティックセグメンテーション)、コントラストティブデノイジング内のマスク監督、ハンガリアンマッチャーにおけるダイス+シグモイドフォーカルマスクコスト - これらはすべてトレーニング時にのみ使用され、推論コストはゼロです。
検出およびインスタンスセグメンテーション用のCOCO事前学習済みウェイトは、初回使用時に自動ダウンロードされます。ファインチューニングはゼロからではなく、学習済みのマスクデコーダーから開始されます。
マルチチャネル入力 - RGB + サーマル/深度/NIRスタック(4チャネル.npy)でトレーニング可能。RGBのみではありません。
モダンなトレーニングスタック - Muonオプティマイザー、DDP、EMA、モザイク+アフィン拡張、OneCycle、早期停止、WandB。
モデルを超えて - ByteTrackトラッキング、SAM3自動ラベリング、Gradioデモ、INT8量子化(OpenVINO / CoreML / LiteRT)。
クイックスタート
インストール
git clone https://github.com/ArgoHA/D-FINE-seg.git
cd D-FINE-seg
uv sync
これにより、uv.lockでピン留めされたすべての依存関係を持つ.venv/が作成されます。.venv/bin/activateでアクティベートするか、uv run ...で実行します(Makefileはすでにこれを行っています)。
事前学習済みウェイトは、初回使用時にHugging Faceからpretrained/に自動ダウンロードされるため、手動セットアップは不要です。手動でダウンロードする場合は、dfine_<size>_<dataset>.pt(size ∈ {n, s, m, l, x}, dataset ∈ {coco, obj2coco})を取得し、pretrained/に配置してください。セグメンテーションウェイトもHugging Faceのモデルカードで利用可能です。
データの準備
2つのアノテーション形式がサポートされています:YOLO(デフォルト)およびCOCO JSON。
セマンティックセグメンテーションは代わりにPNGマスクを使用します(下記参照)。
YOLO形式(デフォルト)
data/dataset/
├── images/ # すべての画像: .jpg, .png など (.npy はマルチチャネル用 - 下記参照)
└── labels/ # すべてのラベル: 画像ごとに1つの.txt(同じファイル名ステム)
検出ラベル: class_id xc yc w h (正規化済み)
セグメンテーションラベル: class_id x1 y1 x2 y2 ... xN yN (正規化済みポリゴン座標)
入力タイプとチャネル順序: 3チャネル.jpg/.png (BGR, cv2.imreadで読み込み)、3チャネル.npy (RGB, np.loadで読み込み)、または4チャネル.npy (RGB+追加情報、例: RGB+サーマル)。
セマンティックセグメンテーションマスク(タスク: sem_seg)
data/dataset/
├── images/ # YOLOレイアウトと同じ
└── labels/ # 画像ごとに1つのシングルチャネルuint8 .png(同じステム)、ピクセル値 = クラスID
すべてのピクセルはlabel_to_nameからクラスを受け取ります(背景を含む)。値 train.sem_seg.ignore_index(デフォルト255)を持つピクセルは、損失とメトリクスから除外され、推論中に255は「背景」または「無視」クラスとなります。
make splitは変更なく機能します。keep_ratio: Trueがサポートされています(letterboxパディングはignore_indexで埋められるため、パディングピクセルは監督されません)。coco_dataset: Trueはこのタスクではサポートされていません。
マルチチャネル入力(RGB + サーマル/深度/NIR/…)
train.in_channels: N(デフォルト3)を設定して、プレーンRGB以外のスタックでトレーニングします。サポートされる範囲はN=3(RGB)またはN=4(RGB + 1つの追加モダリティ、例: サーマル、深度、NIR)です。より多くのチャネル数はサポートされていません - cv2 / Albumentationsのオペレーションは4で上限となります。
レイアウトは同じです。スタックを.npyファイル(uint8 HWC配列)としてドロップします: data/dataset/
├── images/ # サンプルごとに1つの.npy、形状 (H, W, N)、dtype uint8
└── labels/ # YOLO .txt(3チャネルケースと同じ)
ローダーのルール(src/dl/dataset.py参照): np.loadはバイト単位で忠実であり、チャネルは保存したときと全く同じように戻ります。チャネル数がtrain.in_channelsと一致しないファイルは、loguru.warning行(パス+理由)とともにスキップされます。モザイクは自動的にもう1つのインデックスをリサンプリングします。
事前学習済みの3チャネルバックボーンウェイトが再利用されます。ステムの畳み込みは、RGBフィルターをタイリング/平均化することでN入力チャネルに拡張されます(src/d_fine/utils.pyのinflate_stem_weight)。そのため、COCOからのファインチューニングは引き続き機能します。ステムのフリーズ(src/d_fine/configs.pyのfreeze_at)は、in_channels > 3の場合に自動的にバイパスされるため、拡張された追加チャネルのウェイトをトレーニングできます。サイズ設定されたfreeze_atは、プレーンな3チャネルRGBには引き続き適用されます。
チャネル順序の規約: RGBトリプレットを最初の3つのプレーン(チャネル0〜2)に書き込み、事前学習済みのRGBステムと一致するようにします。追加モダリティはチャネル3〜N-1に入ります。
例: RGB + サーマル: [R, G, B, T]としてスタックします。例: src/etl/m3fd_to_yolo.pyは、M3FD RGB+サーマル検出ベンチマーク(PASCAL VOC XML + ペアのVis//Ir/ PNG)をこの正確なレイアウトに変換します。
COCO JSON形式
標準のCOCO JSONアノテーションファイルを画像フォルダの隣に配置します。スプリットはファイル名によって自動的に検出されます: data/dataset/
├── images/ # すべての画像
├── train.json # トレーニングスプリット用のCOCO形式アノテーション
├── val.json # 検証スプリット用のCOCO形式アノテーション
└── test.json # (オプション)テストスプリット用のCOCO形式アノテーション
設定ファイルでcoco_dataset: Trueを設定してCOCOモードを有効にします(下記参照)。CSVスプリット生成ステップは不要です。スプリットはJSONファイルから直接読み込まれます。
設定
config.yamlを編集 - 主要設定:
task: detect # detect | segment | sem_seg
exp_name: my_exp # 実験名(出力パスに使用)
model_name: s # n / s / m / l / x
train:
root: /path/to/project # プロジェクトルート、出力に使用されます
data_path: /path/to/dataset # images/およびlabels/(YOLO)または*.jsonファイル(COCO)を含むフォルダ
coco_dataset: False # COCO JSONアノテーションを使用する場合はTrueに設定(train.json / val.json / test.json)
label_to_name: 0: class_a
1: class_b
epochs: 75
batch_size: 8
img_size: [640, 640] # (h, w)
使用法
make split # トレーニング/検証CSVスプリットを作成(設定されていればテストスプリットも)
make train # モデルをトレーニング
make export # ONNX、TensorRT、OpenVINO、CoreML、LiteRTにエクスポート
make bench # 検証セットでエクスポートされたすべてのモデルをベンチマーク
make infer # テストフォルダで実行、ビジュアライゼーション+YOLO txt予測を保存
make check_errors # 予測とGTを比較、不一致のみを保存(FP/FN)
make test_batching # GPUに最適なバッチサイズを見つける
make ov_int8 # OpenVINO用のINT8精度認識量子化(数時間かかる場合があります)
注記:
YOLO形式: make trainはtrain.data_path(make splitで生成)にtrain.csvおよびval.csvが必要です。COCO形式: coco_dataset: Trueを設定 - train.jsonおよびval.jsonが直接ロードされ、make splitは不要です。
make inferはtrain.path_to_test_dataでTorch推論を実行し、train.infer_pathに書き込みます。
または、シーケンスで実行します:
make # トレーニング -> エクスポート -> ベンチマーク(スプリットは実行しません)
またはCLIから設定を上書きして実行します。
uv run python -m src.dl.train exp_name=my_exp
DDP(マルチGPU)を有効にするには、configでtrain.ddp.enabled: Trueおよびtrain.ddp.n_gpus: Nを設定します。その後、make trainを実行するだけです - torchrunで自動的に起動します。
トレーニング機能
機能 説明
Muonオプティマイザー エンコーダー/デコーダーアテンション+ML用のオプションのニュートン・シュルツオプティマイザー