English | 简体中文 | 日本語 | English Blog | 中文博客
📄 これは論文の公式実装です:
D-FINE: Redefine Regression Task of DETRs as Fine-grained Distribution Refinement
D-FINE: DETRの回帰タスクを細粒度分布最適化として再定義
Yansong Peng, Hebei Li, Peixi Wu, Yueyi Zhang, Xiaoyan Sun, and Feng Wu
中国科学技術大学
もしD-FINEが気に入ったら、ぜひ⭐をください!あなたのサポートが私たちのモチベーションになります!
D-FINEは、DETRの境界ボックス回帰タスクを細粒度分布最適化(FDR)として再定義し、グローバル最適な位置特定自己蒸留(GO-LSD)を導入することで、追加の推論およびトレーニングコストを増やすことなく、優れたパフォーマンスを実現する強力なリアルタイムオブジェクト検出器です。
ビデオ
D-FINEとYOLO11を使用して、YouTubeの複雑な街並みのビデオでオブジェクト検出を行いました。逆光、モーションブラー、密集した群衆などの厳しい条件にもかかわらず、D-FINE-Xはほぼすべてのターゲットを検出し、バックパック、自転車、信号機などの微妙な小さなオブジェクトも含まれます。その信頼スコアとぼやけたエッジの位置特定精度はYOLO11よりもはるかに高いです。
video_vis.mp4
- [2024.10.18] D-FINEシリーズをリリース。
- [2024.10.25] カスタムデータセットの微調整設定を追加 (#7)。
- [2024.10.30] D-FINE-L (E25) 事前トレーニングモデルを更新し、パフォーマンスが2.0%向上。
- [2024.11.07] D-FINE-N をリリース, COCO で 42.8% の APval を達成 @ 472 FPST4!
モデル | データセット | APval | パラメータ数 | レイテンシ | GFLOPs | config | checkpoint | logs |
---|---|---|---|---|---|---|---|---|
D‑FINE‑N | COCO | 42.8 | 4M | 2.12ms | 7 | yml | 42.8 | url |
D‑FINE‑S | COCO | 48.5 | 10M | 3.49ms | 25 | yml | 48.5 | url |
D‑FINE‑M | COCO | 52.3 | 19M | 5.62ms | 57 | yml | 52.3 | url |
D‑FINE‑L | COCO | 54.0 | 31M | 8.07ms | 91 | yml | 54.0 | url |
D‑FINE‑X | COCO | 55.8 | 62M | 12.89ms | 202 | yml | 55.8 | url |
モデル | データセット | APval | パラメータ数 | レイテンシ | GFLOPs | config | checkpoint | logs |
---|---|---|---|---|---|---|---|---|
D‑FINE‑S | Objects365+COCO | 50.7 | 10M | 3.49ms | 25 | yml | 50.7 | url |
D‑FINE‑M | Objects365+COCO | 55.1 | 19M | 5.62ms | 57 | yml | 55.1 | url |
D‑FINE‑L | Objects365+COCO | 57.3 | 31M | 8.07ms | 91 | yml | 57.3 | url |
D‑FINE‑X | Objects365+COCO | 59.3 | 62M | 12.89ms | 202 | yml | 59.3 | url |
微調整のために Objects365 の事前学習モデルを使用することを強くお勧めします:
🔥 Objects365で事前トレーニングされたモデル(最良の汎化性能)
モデル | データセット | APval | AP5000 | パラメータ数 | レイテンシ | GFLOPs | config | checkpoint | logs |
---|---|---|---|---|---|---|---|---|---|
D‑FINE‑S | Objects365 | 31.0 | 30.5 | 10M | 3.49ms | 25 | yml | 30.5 | url |
D‑FINE‑M | Objects365 | 38.6 | 37.4 | 19M | 5.62ms | 57 | yml | 37.4 | url |
D‑FINE‑L | Objects365 | - | 40.6 | 31M | 8.07ms | 91 | yml | 40.6 | url |
D‑FINE‑L (E25) | Objects365 | 44.7 | 42.6 | 31M | 8.07ms | 91 | yml | 42.6 | url |
D‑FINE‑X | Objects365 | 49.5 | 46.5 | 62M | 12.89ms | 202 | yml | 46.5 | url |
- E25: 再トレーニングし、事前トレーニングを25エポックに延長。
- APval は Objects365 のフルバリデーションセットで評価されます。
- AP5000 は Objects365 検証セットの最初の5000サンプルで評価されます。
注意事項:
- APval は MSCOCO val2017 データセットで評価されます。
-
レイテンシ は単一のT4 GPUで
$batch\_size = 1$ ,$fp16$ , および$TensorRT==10.4.0$ で評価されます。 - Objects365+COCO は Objects365 で事前トレーニングされた重みを使用して COCO で微調整されたモデルを意味します。
conda create -n dfine python=3.11.9
conda activate dfine
pip install -r requirements.txt
COCO2017 データセット
-
OpenDataLab または COCO からCOCO2017をダウンロードします。
-
coco_detection.yml のパスを修正します。
train_dataloader: img_folder: /data/COCO2017/train2017/ ann_file: /data/COCO2017/annotations/instances_train2017.json val_dataloader: img_folder: /data/COCO2017/val2017/ ann_file: /data/COCO2017/annotations/instances_val2017.json
Objects365 データセット
-
OpenDataLab からObjects365をダウンロードします。
-
ベースディレクトリを設定します:
export BASE_DIR=/data/Objects365/data
- ダウンロードしたファイルを解凍し、以下のディレクトリ構造に整理します:
${BASE_DIR}/train
├── images
│ ├── v1
│ │ ├── patch0
│ │ │ ├── 000000000.jpg
│ │ │ ├── 000000001.jpg
│ │ │ └── ... (more images)
│ ├── v2
│ │ ├── patchx
│ │ │ ├── 000000000.jpg
│ │ │ ├── 000000001.jpg
│ │ │ └── ... (more images)
├── zhiyuan_objv2_train.json
${BASE_DIR}/val
├── images
│ ├── v1
│ │ ├── patch0
│ │ │ ├── 000000000.jpg
│ │ │ └── ... (more images)
│ ├── v2
│ │ ├── patchx
│ │ │ ├── 000000000.jpg
│ │ │ └── ... (more images)
├── zhiyuan_objv2_val.json
- 検証セットの画像を保存する新しいディレクトリを作成します:
mkdir -p ${BASE_DIR}/train/images_from_val
- valディレクトリのv1およびv2フォルダをtrain/images_from_valディレクトリにコピーします
cp -r ${BASE_DIR}/val/images/v1 ${BASE_DIR}/train/images_from_val/
cp -r ${BASE_DIR}/val/images/v2 ${BASE_DIR}/train/images_from_val/
- remap_obj365.pyを実行して、検証セットの一部をトレーニングセットにマージします。具体的には、このスクリプトはインデックスが5000から800000のサンプルを検証セットからトレーニングセットに移動します。
python tools/remap_obj365.py --base_dir ${BASE_DIR}
- resize_obj365.pyスクリプトを実行して、データセット内の最大エッジ長が640ピクセルを超える画像をリサイズします。ステップ5で生成された更新されたJSONファイルを使用してサンプルデータを処理します。トレーニングセットと検証セットの両方の画像をリサイズして、一貫性を保ちます。
python tools/resize_obj365.py --base_dir ${BASE_DIR}
-
obj365_detection.yml のパスを修正します。
train_dataloader: img_folder: /data/Objects365/data/train ann_file: /data/Objects365/data/train/new_zhiyuan_objv2_train_resized.json val_dataloader: img_folder: /data/Objects365/data/val/ ann_file: /data/Objects365/data/val/new_zhiyuan_objv2_val_resized.json
CrowdHuman
こちらからCOCOフォーマットのデータセットをダウンロードしてください:リンク
カスタムデータセット
カスタムデータセットでトレーニングするには、COCO形式で整理する必要があります。以下の手順に従ってデータセットを準備してください:
-
remap_mscoco_category
をFalse
に設定します:これにより、カテゴリIDがMSCOCOカテゴリに自動的にマッピングされるのを防ぎます。
remap_mscoco_category: False
-
画像を整理します:
データセットディレクトリを以下のように構造化します:
dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... │ ├── val/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... └── annotations/ ├── instances_train.json ├── instances_val.json └── ...
images/train/
: すべてのトレーニング画像を含みます。images/val/
: すべての検証画像を含みます。annotations/
: COCO形式の注釈ファイルを含みます。
-
注釈をCOCO形式に変換します:
注釈がまだCOCO形式でない場合は、変換する必要があります。以下のPythonスクリプトを参考にするか、既存のツールを利用してください:
import json def convert_to_coco(input_annotations, output_annotations): # 変換ロジックをここに実装します pass if __name__ == "__main__": convert_to_coco('path/to/your_annotations.json', 'dataset/annotations/instances_train.json')
-
設定ファイルを更新します:
custom_detection.yml を修正します。
task: detection evaluator: type: CocoEvaluator iou_types: ['bbox', ] num_classes: 777 # データセットのクラス数 remap_mscoco_category: False train_dataloader: type: DataLoader dataset: type: CocoDetection img_folder: /data/yourdataset/train ann_file: /data/yourdataset/train/train.json return_masks: False transforms: type: Compose ops: ~ shuffle: True num_workers: 4 drop_last: True collate_fn: type: BatchImageCollateFunction val_dataloader: type: DataLoader dataset: type: CocoDetection img_folder: /data/yourdataset/val ann_file: /data/yourdataset/val/ann.json return_masks: False transforms: type: Compose ops: ~ shuffle: False num_workers: 4 drop_last: False collate_fn: type: BatchImageCollateFunction
COCO2017
- モデルを設定します
export model=l # n s m l x
- トレーニング
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml --use-amp --seed=0
- テスト
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml --test-only -r model.pth
- 微調整
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml --use-amp --seed=0 -t model.pth
Objects365からCOCO2017へ
- モデルを設定します
export model=l # n s m l x
- Objects365でトレーニング
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/objects365/dfine_hgnetv2_${model}_obj365.yml --use-amp --seed=0
- COCO2017で微調整
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/objects365/dfine_hgnetv2_${model}_obj2coco.yml --use-amp --seed=0 -t model.pth
- テスト
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml --test-only -r model.pth
カスタムデータセット
- モデルを設定します
export model=l # n s m l x
- カスタムデータセットでトレーニング
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/custom/dfine_hgnetv2_${model}_custom.yml --use-amp --seed=0
- テスト
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/custom/dfine_hgnetv2_${model}_custom.yml --test-only -r model.pth
- カスタムデータセットで微調整
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/custom/objects365/dfine_hgnetv2_${model}_obj2custom.yml --use-amp --seed=0 -t model.pth
- [オプション] クラスマッピングを変更します:
Objects365の事前トレーニング済みの重みを使用してカスタムデータセットでトレーニングする場合、例ではデータセットに 'Person'
と 'Car'
クラスのみが含まれていると仮定しています。特定のタスクに対して収束を早めるために、src/solver/_solver.py
の self.obj365_ids
を以下のように変更できます:
self.obj365_ids = [0, 5] # Person, Cars
これらをデータセットの対応するクラスに置き換えることができます。Objects365クラスとその対応IDのリスト: https://github.com/Peterande/D-FINE/blob/352a94ece291e26e1957df81277bef00fe88a8e3/src/solver/_solver.py#L330
新しいトレーニングコマンド:
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/custom/dfine_hgnetv2_${model}_custom.yml --use-amp --seed=0 -t model.pth
ただし、クラスマッピングを変更したくない場合、事前トレーニング済みのObjects365の重みは変更なしでそのまま使用できます。クラスマッピングの変更はオプションであり、特定のタスクに対して収束を早める可能性があります。
バッチサイズのカスタマイズ
例えば、COCO2017でD-FINE-Lをトレーニングする際にバッチサイズを2倍にしたい場合、以下の手順に従ってください:
-
dataloader.yml を修正して
total_batch_size
を増やします:train_dataloader: total_batch_size: 64 # 以前は32、今は2倍
-
dfine_hgnetv2_l_coco.yml を修正します。以下のように主要なパラメータを調整します:
optimizer: type: AdamW params: - params: '^(?=.*backbone)(?!.*norm|bn).*$' lr: 0.000025 # 2倍、線形スケーリング法則 - params: '^(?=.*(?:encoder|decoder))(?=.*(?:norm|bn)).*$' weight_decay: 0. lr: 0.0005 # 2倍、線形スケーリング法則 betas: [0.9, 0.999] weight_decay: 0.0001 # グリッドサーチが必要です ema: # EMA設定を追加 decay: 0.9998 # 1 - (1 - decay) * 2 によって調整 warmups: 500 # 半分 lr_warmup_scheduler: warmup_duration: 250 # 半分
入力サイズのカスタマイズ
COCO2017で D-FINE-L を320x320の入力サイズでトレーニングしたい場合、以下の手順に従ってください:
-
dataloader.yml を修正します:
train_dataloader: dataset: transforms: ops: - {type: Resize, size: [320, 320], } collate_fn: base_size: 320 dataset: transforms: ops: - {type: Resize, size: [320, 320], }
-
dfine_hgnetv2.yml を修正します:
eval_spatial_size: [320, 320]
デプロイ
- セットアップ
pip install onnx onnxsim
export model=l # n s m l x
- onnxのエクスポート
python tools/deployment/export_onnx.py --check -c configs/dfine/dfine_hgnetv2_${model}_coco.yml -r model.pth
- tensorrt のエクスポート
trtexec --onnx="model.onnx" --saveEngine="model.engine" --fp16
推論(可視化)
- セットアップ
pip install -r tools/inference/requirements.txt
export model=l # n s m l x
- 推論 (onnxruntime / tensorrt / torch)
現在、画像とビデオの推論がサポートされています。
python tools/inference/onnx_inf.py --onnx model.onnx --input image.jpg # video.mp4
python tools/inference/trt_inf.py --trt model.engine --input image.jpg
python tools/inference/torch_inf.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml -r model.pth --input image.jpg --device cuda:0
ベンチマーク
- セットアップ
pip install -r tools/benchmark/requirements.txt
export model=l # n s m l x
- モデルのFLOPs、MACs、およびパラメータ数
python tools/benchmark/get_info.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml
- TensorRTのレイテンシ
python tools/benchmark/trt_benchmark.py --COCO_dir path/to/COCO2017 --engine_dir model.engine
Fiftyoneの可視化
- セットアップ
pip install fiftyone
export model=l # n s m l x
- Voxel51 Fiftyoneの可視化 (fiftyone)
python tools/visualization/fiftyone_vis.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml -r model.pth
その他
- 自動再開トレーニング
bash reference/safe_training.sh
- モデルの重みの変換
python reference/convert_weight.py model.pth
FDRとGO-LSD
- FDRを搭載したD-FINEの概要。より細粒度の中間表現として機能する確率分布は、残差的にデコーダ層によって逐次最適化されます。 不均一な重み付け関数が適用され、より細かい位置特定が可能になります。
- GO-LSDプロセスの概要。最終層の最適化された分布からの位置特定知識は、デカップリングされた重み付け戦略を使用してDDF損失を通じて前の層に蒸留されます。
難しいケース
以下の可視化は、さまざまな複雑な検出シナリオにおけるD-FINEの予測を示しています。これらのシナリオには、遮蔽、低光条件、モーションブラー、被写界深度効果、および密集したシーンが含まれます。これらの課題にもかかわらず、D-FINEは一貫して正確な位置特定結果を生成します。
もしD-FINE
やその方法をあなたの仕事で使用する場合、以下のBibTeXエントリを引用してください:
bibtex
@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}
}
私たちの仕事は RT-DETR に基づいています。 RT-DETR, GFocal, LD, および YOLOv9 からのインスピレーションに感謝します。
✨ 貢献を歓迎し、質問があればお気軽にお問い合わせください! ✨