Skip to content

Latest commit

 

History

History
698 lines (524 loc) · 29.1 KB

README_ja.md

File metadata and controls

698 lines (524 loc) · 29.1 KB

English | 简体中文 | 日本語 | English Blog | 中文博客

D-FINE: Redefine Regression Task of DETRs as Fine‑grained Distribution Refinement

license prs issues arXiv pre-commit.ci status stars

📄 これは論文の公式実装です:
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

中国科学技術大学

sota

もし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!

モデルズー

COCO

モデル データセット 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

Objects365+COCO

モデル データセット 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エポックに延長。
  • APvalObjects365 のフルバリデーションセットで評価されます。
  • AP5000Objects365 検証セットの最初の5000サンプルで評価されます。

注意事項:

  • APvalMSCOCO val2017 データセットで評価されます。
  • レイテンシ は単一のT4 GPUで $batch\_size = 1$, $fp16$, および $TensorRT==10.4.0$ で評価されます。
  • Objects365+COCOObjects365 で事前トレーニングされた重みを使用して COCO で微調整されたモデルを意味します。

クイックスタート

セットアップ

conda create -n dfine python=3.11.9
conda activate dfine
pip install -r requirements.txt

データ準備

COCO2017 データセット
  1. OpenDataLab または COCO からCOCO2017をダウンロードします。

  2. 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 データセット
  1. OpenDataLab からObjects365をダウンロードします。

  2. ベースディレクトリを設定します:

export BASE_DIR=/data/Objects365/data
  1. ダウンロードしたファイルを解凍し、以下のディレクトリ構造に整理します:
${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
  1. 検証セットの画像を保存する新しいディレクトリを作成します:
mkdir -p ${BASE_DIR}/train/images_from_val
  1. 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/
  1. remap_obj365.pyを実行して、検証セットの一部をトレーニングセットにマージします。具体的には、このスクリプトはインデックスが5000から800000のサンプルを検証セットからトレーニングセットに移動します。
python tools/remap_obj365.py --base_dir ${BASE_DIR}
  1. resize_obj365.pyスクリプトを実行して、データセット内の最大エッジ長が640ピクセルを超える画像をリサイズします。ステップ5で生成された更新されたJSONファイルを使用してサンプルデータを処理します。トレーニングセットと検証セットの両方の画像をリサイズして、一貫性を保ちます。
python tools/resize_obj365.py --base_dir ${BASE_DIR}
  1. 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形式で整理する必要があります。以下の手順に従ってデータセットを準備してください:

  1. remap_mscoco_categoryFalse に設定します

    これにより、カテゴリIDがMSCOCOカテゴリに自動的にマッピングされるのを防ぎます。

    remap_mscoco_category: False
  2. 画像を整理します

    データセットディレクトリを以下のように構造化します:

    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形式の注釈ファイルを含みます。
  3. 注釈を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')
  4. 設定ファイルを更新します

    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
  1. モデルを設定します
export model=l  # n s m l x
  1. トレーニング
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
  1. テスト
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
  1. 微調整
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へ
  1. モデルを設定します
export model=l  # n s m l x
  1. 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
  1. 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
  1. テスト
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
カスタムデータセット
  1. モデルを設定します
export model=l  # n s m l x
  1. カスタムデータセットでトレーニング
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
  1. テスト
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
  1. カスタムデータセットで微調整
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
  1. [オプション] クラスマッピングを変更します:

Objects365の事前トレーニング済みの重みを使用してカスタムデータセットでトレーニングする場合、例ではデータセットに 'Person''Car' クラスのみが含まれていると仮定しています。特定のタスクに対して収束を早めるために、src/solver/_solver.pyself.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倍にしたい場合、以下の手順に従ってください:

  1. dataloader.yml を修正して total_batch_size を増やします

    train_dataloader:
        total_batch_size: 64  # 以前は32、今は2倍
  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の入力サイズでトレーニングしたい場合、以下の手順に従ってください:

  1. 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], }
  2. dfine_hgnetv2.yml を修正します

    eval_spatial_size: [320, 320]

ツール

デプロイ
  1. セットアップ
pip install onnx onnxsim
export model=l  # n s m l x
  1. onnxのエクスポート
python tools/deployment/export_onnx.py --check -c configs/dfine/dfine_hgnetv2_${model}_coco.yml -r model.pth
  1. tensorrt のエクスポート
trtexec --onnx="model.onnx" --saveEngine="model.engine" --fp16
推論(可視化)
  1. セットアップ
pip install -r tools/inference/requirements.txt
export model=l  # n s m l x
  1. 推論 (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
ベンチマーク
  1. セットアップ
pip install -r tools/benchmark/requirements.txt
export model=l  # n s m l x
  1. モデルのFLOPs、MACs、およびパラメータ数
python tools/benchmark/get_info.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml
  1. TensorRTのレイテンシ
python tools/benchmark/trt_benchmark.py --COCO_dir path/to/COCO2017 --engine_dir model.engine
Fiftyoneの可視化
  1. セットアップ
pip install fiftyone
export model=l  # n s m l x
  1. Voxel51 Fiftyoneの可視化 (fiftyone)
python tools/visualization/fiftyone_vis.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml -r model.pth
その他
  1. 自動再開トレーニング
bash reference/safe_training.sh
  1. モデルの重みの変換
python reference/convert_weight.py model.pth

図と可視化

FDRとGO-LSD
  1. FDRを搭載したD-FINEの概要。より細粒度の中間表現として機能する確率分布は、残差的にデコーダ層によって逐次最適化されます。 不均一な重み付け関数が適用され、より細かい位置特定が可能になります。

細粒度分布最適化プロセス

  1. GO-LSDプロセスの概要。最終層の最適化された分布からの位置特定知識は、デカップリングされた重み付け戦略を使用してDDF損失を通じて前の層に蒸留されます。

GO-LSDプロセス

分布

初期および最適化された境界ボックスと、未重み付けおよび重み付けされた分布とともに、さまざまな検出シナリオにおけるFDRの可視化。

難しいケース

以下の可視化は、さまざまな複雑な検出シナリオにおけるD-FINEの予測を示しています。これらのシナリオには、遮蔽、低光条件、モーションブラー、被写界深度効果、および密集したシーンが含まれます。これらの課題にもかかわらず、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 からのインスピレーションに感謝します。

✨ 貢献を歓迎し、質問があればお気軽にお問い合わせください! ✨