D-FINE
ボックス回帰を各ボックス辺の確率分布として再定式化し、デコーダー層を通じて改良する検出Transformerです。LibreYOLOは物体検出とインスタンスセグメンテーションでD-FINEをサポートします。
- タスク
- detection, instance segmentation
- サイズ
- n, s, m, l, x at 640 px
- インストール
pip install libreyolo- サポートティア
- コア、v1.1.0以降。学習可能なコア検出器:機能は同じリリースサイクルでフラッグシップに続いて実装されます。
- ライセンス
- コード:Apache-2.0、重み:Apache-2.0。商用利用
インストール
D-FINEにオプションの追加パッケージは不要です。インポートするものはすべて基本インストールに含まれています。
pip install libreyololora=Trueによるアダプターのファインチューニングは例外で、lora追加パッケージが必要です。
pip install "libreyolo[lora]"推論
重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # ファイル名の -seg サフィックスでマスクヘッドを選択するため task# 引数は不要model = LibreYOLO("LibreDFINEn-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)返されるResultsオブジェクトはすべてのファミリーに共通するため、別の検出器への切り替えは1行の変更で済みます。ファイル名に-segがあるとセグメンテーションタスクとして自動的に解決され、result.masksにはボックスとともにインスタンスマスクが格納されます。confとmax_detはクエリ選択をフィルタリングします。デコーダーはNMSステップを持たない集合予測器なので、iouはAPIの互換性のため受け付けられますが効果はありません。ソース、ストリーミング、結果の処理については推論を参照してください。
バリアント
5つのサイズがあります。すべて同じ入力解像度で動作するため、表ではパラメータ数と精度で区別しています。
| チェックポイント | 入力(px) | mAP 50-95 | パラメータ(M) |
|---|---|---|---|
| LibreDFINEl | 640 | 60.0 | 31.24 |
| LibreDFINEm | 640 | 57.8 | 19.59 |
| LibreDFINEn | 640 | 45.8 | 3.78 |
| LibreDFINEs | 640 | 53.4 | 10.32 |
| LibreDFINEx | 640 | 61.4 | 62.62 |
COCO val2017, 500 images。LibreYOLOベンチマークハーネスで測定し、Vision Analysisで公開しています。そこではハードウェアおよびランタイム別のレイテンシを比較でき、完全な実行記録も確認できます。
セグメンテーションは検出のバックボーン、エンコーダー、デコーダーを再利用し、マスクヘッドを追加します。そのため、-segチェックポイントは対応する検出チェックポイントと同じ引数を受け取ります。LibreYOLOのRT-DETRv4ファミリーはD-FINEラッパーのサブクラスとして実装されています。このデコーダー系統を継承したうえで、マスクヘッドを持たないためタスクリストを検出のみに固定し直します。
学習
どちらのタスクも公開済みチェックポイントから学習を開始します。
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 imgsz=640 batch=8 lr0=2e-4# 公開済みセグメンテーション重みから継続しマスクヘッドも含むlibreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \ task=segment epochs=50 imgsz=640# 検出重みにマスクヘッドはないため明示的な転移を実行# ヘッドは未学習で始まり学習後にのみ有用になる# ここで task=segment を指定すると転移を許可libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ task=segment epochs=50 imgsz=640from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 device=0,1 batch=16設定を変更しなければ、トレーナーはlr0=2e-4、amp=False、バッチサイズ16で132エポック実行し、改善がない状態が50エポック続くと早期終了します。検出重みはセグメンテーション学習の有効な開始点ですが、明示的な転移としてのみ使用できます。マスクヘッドは未学習で始まり、そのままでは意味のないマスクを返すためです。CLIにtask=segmentを渡すことで転移を許可します。Python経由の手順にはさらに制限があります。LibreYOLO()ファクトリーは該当する引数を受け取らないため、allow_detect_to_segment_transfer=Trueを指定してLibreDFINEを直接構築する必要があります。また、直接構築ではダウンロードされないため、重みファイルがすでにディスク上になければなりません。
lora=Trueは検出に適用されます。セグメンテーション学習では拒否され、代わりにfreeze='backbone'を案内します。マスクヘッドがアダプターでテストされていないためです。Apple siliconでは、トレーナーが実行全体をCPUに移します。Integralのビン分割行列乗算の逆伝播でMetalのコンパイルエラーが発生するためです。MPSでの推論には影響しません。
データセット、データ拡張、マルチGPU、ロガーについては学習を参照してください。
検証
val()はメトリクス名をキーとする辞書を返し、verboseを有効のままにするとクラス別の結果を表示します。
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreDFINEn.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # マスクprint(metrics["metrics/mAP50-95(B)"]) # ボックス-segチェックポイントを対象にすると、通常のmetrics/mAP50-95キーにはマスクのスコアが格納されます。同じ実行で(B)のボックスと(M)のマスクも報告されるため、1回の処理で両方を取得できます。
エクスポート
| タスク | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX:対応 | Detection to TorchScript:対応 | Detection to ExecuTorch:非対応 | Detection to TensorRT:対応 | Detection to OpenVINO:対応 | Detection to Paddle:対応 | Detection to MNN:対応 | Detection to RKNN:非対応 | Detection to ncnn:非対応 | Detection to TFLite:非対応 | Detection to CoreML:非対応 | Detection to Core AI:対応 |
| Instance segmentation | Instance segmentation to ONNX:対応 | Instance segmentation to TorchScript:対応 | Instance segmentation to ExecuTorch:非対応 | Instance segmentation to TensorRT:対応 | Instance segmentation to OpenVINO:対応 | Instance segmentation to Paddle:非対応 | Instance segmentation to MNN:非対応 | Instance segmentation to RKNN:非対応 | Instance segmentation to ncnn:非対応 | Instance segmentation to TFLite:非対応 | Instance segmentation to CoreML:非対応 | Instance segmentation to Core AI:非対応 |
エクスポートした成果物は、ファイルサフィックスに基づいてLibreYOLO()から再度読み込めます。そのため、.onnxまたは.engineファイルはチェックポイントと同様に動作し、同じResultsを返します。OpenVINO、Paddle、MNN、Core AIへのエクスポートでは、動的形状ではなく固定キャンバスを使用します。各形式が受け付ける引数と、一部の形式に追加される引数についてはエクスポートを参照してください。
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # ファクトリーはファイルサフィックスで振り分けるためエクスポート成果物も# 任意のチェックポイントと同様に読み込まれ同じ Results オブジェクトを返すmodel = LibreYOLO("LibreDFINEn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)チェックポイント
このファミリーで公開されているすべての重みファイルです。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| Detection | ||
| LibreDFINEn.pt | 640 | apache-2.0 |
| LibreDFINEs.pt | 640 | apache-2.0 |
| LibreDFINEm.pt | 640 | apache-2.0 |
| LibreDFINEl.pt | 640 | apache-2.0 |
| LibreDFINEx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreDFINEn-seg.pt | 640 | apache-2.0 |
| LibreDFINEs-seg.pt | 640 | apache-2.0 |
| LibreDFINEm-seg.pt | 640 | apache-2.0 |
| LibreDFINEl-seg.pt | 640 | apache-2.0 |
| LibreDFINEx-seg.pt | 640 | apache-2.0 |
上記のすべてのファイルは現在LibreYOLO orgにあり、初回使用時にダウンロードされます。
ライセンス
ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。
これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。
- 原著作物
- D-FINE, University of Science and Technology of China
- アップストリームのライセンス
- Apache-2.0
- アップストリームのソース
- github.com/Peterande/D-FINE
- LibreYOLOのコード
- MIT
- 重み
- Apache-2.0、huggingface.co/LibreYOLOで再公開
- 解釈
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.
セグメンテーション重みには2つ目のアップストリームがあります。マスクデコーダー、マスクマッチング、マスク損失は、同じくApache-2.0のArgoHA/D-FINE-segに由来し、そのメンテナーは帰属表示を伴う再利用を承認しています。
引用
@misc{peng2024dfine,
title={D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement},
author={Yansong Peng and Hebei Li and Peixi Wu and Yueyi Zhang and Xiaoyan Sun and Feng Wu},
year={2024},
eprint={2410.13842},
archivePrefix={arXiv},
primaryClass={cs.CV}
}著者によるgithub.com/Peterande/D-FINE#citationの引用ブロックからコピーしています。