序章
論文: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2203.03605
コード: https://link.zhihu.com/?target=https%3A//github.com /IDEACVR/DINO
DINO: 物体検出に Transformer を組み込む
主な特徴:
- SOTA パフォーマンス: 比較的小さなデータとモデル (以前の SwinV2 と比較して~ 1/10) を持つ大規模なモデルで最良の検出結果を達成しました。ResNet-50の標準設定で51.3APを達成。
- End2end (エンドツーエンド学習可能) : DINO は DETR タイプの検出器に属し、エンドツーエンドで学習可能で、従来の検出器で手動で設計する必要がある多くのモジュール (NMS など) を回避します。
- 高速収束: 標準の ResNet-50 設定では、5 スケール機能 (5 スケール) を使用する DINO は、12 エポックで49.4 AP、 24 エポックで51.3 AP を達成します。4 スケール機能 (4 スケール) を使用する DINO は同様のパフォーマンスを達成し、23 FPS で実行できます。
構成環境
ダウンロードコード
git clone https://github.com/IDEA-Research/DINO.git
cd DINO
Pytorch環境をインストールする
# an example:
conda install -c pytorch pytorch torchvision
コード環境をインストールする
pip install -r requirements.txt
CUDA 演算子をコンパイルする
cd models/dino/ops
python setup.py build install
# unit test (should see all checking is True)
python test.py
cd ../../..
知らせ:
- Cocoapi/panopticapi/MultiScaleDeformableAttend のコンパイルとインストールが失敗する場合は、コンピュータに完全な C++ コンパイル環境があるかどうかを確認してください。ない場合は、対応するコンパイル環境をインストールしてください。Win の場合は、 「Microsoft Visualの解決方法」を参照してください。C++ 14.0以降が必要です。「Microsoft C++ Build Tools」で入手してください。
- CUDA オペレーターをコンパイルするには、Pytorch と CUDA のバージョンが高くても低くなく、一貫している必要があります。そうでない場合は、バージョンが同じになるまで調整してください。
- 実行後に MultiScaleDeformableAttendant パッケージが見つからない
python test.py
場合は、CUDA オペレーターのコンパイルとインストールが失敗したことを意味しますが、ビデオ メモリ/メモリ オーバーフローのエラーがある場合は正常です。
PS: 実際には、Pytorch より高い CUDA は動作に影響しませんが、コンパイルできないため、それよりも低いバージョンの CUDA 環境を持つコンピュータを使用して、MultiScaleDeformableAttendance を WHL バージョンにコンパイルし、ローカルにインストールすることもできます。 。コンパイルを正常に完了できない場合は、対応するパッケージの WHL バージョンを使用してインストールしてみてください。ここでは、Python3.8 および CUDA11.7 環境に基づいてコンパイルした、いくつかの一般的なパッケージの WHL バージョンをいくつか示します。
Baidu ネットワーク ディスク
抽出コード: z4ia
訓練
COCO データセット
実行してscripts/DINO_train.sh /path/to/your/COCODIR
トレーニングを開始する
か、
python main.py --output_dir ./logs/DINO/R50_IP102_finetune -c ./config/DINO/DINO_4scale.py --coco_path ./coco_path --options dn_scalar=100 embed_init_tgt=TRUE dn_label_coef=1.0 dn_bbox_coef=1.0 use_ema=False dn_box_noise_scale=1.0
カスタムデータセット
DINO は COCO 標準データセットを採用しており、ディレクトリ構造は次のとおりです。
COCODIR/
├── train2017/
├── val2017/
└── annotations/
├── instances_train2017.json
└── instances_val2017.json
1. データセットを準備する
トレーニングの前に、まずデータセットを COCO 標準に変換する必要があります。YOLO
標準または VOC 標準を使用している場合は、データセット変換ツールを自分で検索してください。
2. num_classes を変更する
データセットを変更した後、パラメータスクリプトDINO_4scale.pyを最大カテゴリ ID+1に変更する必要があります(混乱を避けるために、ここで新しいスクリプトをコピーして作成することをお勧めします)。これは最大カテゴリ ID+1 である必要があることに注意してください。ここでの num_classes は曖昧であり、必ずしもデータセット内のカテゴリの数を指すわけではありません。たとえば、COCO データセットには 80 カテゴリしかありませんが、category_id の範囲は 1 ~ 90 であるため、ここでのデフォルトの num_classes は 90 です+1. 0 からかどうか 開始や隙間の有無は関係ない詳細はnum_classes 108 に関する混乱を参照してください。num_classes
次に、models/dino.py の 717 行目を次のコードに変更します。
match_unstable_error = args.match_unstable_error
dn_labelbook_size = args.dn_labelbook_size
if dn_labelbook_size < num_classes:
dn_labelbook_size = num_classes
dn_labelbook_size のデフォルトは 91 ですが、num_classes 以上である必要があります。
3. Win環境における特定のエラーを修正
ここでは、Win 環境のみを変更する必要があるため、
util/slconfig.py の 83 行目のコードを次の形式に変更します。
if filename.lower().endswith('.py'):
with tempfile.TemporaryDirectory() as temp_config_dir:
temp_config_dir = "C:/tempDir/"
temp_config_file = tempfile.NamedTemporaryFile(
dir=temp_config_dir, suffix='.py')
temp_config_file = open('C:/tempDir/temp.py', 'w+b')
temp_config_name = osp.basename(temp_config_file.name)
shutil.copyfile(filename,
osp.join(temp_config_dir, temp_config_name))
temp_module_name = osp.splitext(temp_config_name)[0]
sys.path.insert(0, temp_config_dir)
SLConfig._validate_py_syntax(filename)
mod = import_module(temp_module_name)
sys.path.pop(0)
cfg_dict = {
name: value
for name, value in mod.__dict__.items()
if not name.startswith('__')
}
# delete imported module
del sys.modules[temp_module_name]
# close temp file
temp_config_file.close()
- 一時フォルダーを作成し、そのフォルダーの下に一時ファイルを作成します
temp_config_dir
一時フォルダーに変更されますtemp_config_file
一時ファイルに変更されます
4. トレーニング
4.1 ゼロから始める
python main.py --output_dir logs/DINO/R50_custom_finetune -c ./config/DINO/DINO_4scale_custom.py --coco_path ./coco_path --options dn_scalar=100 embed_init_tgt=TRUE dn_label_coef=1.0 dn_bbox_coef=1.0 use_ema=False dn_box_noise_scale=1.0
4.2 微調整
python main.py --output_dir logs/DINO/R50_custom_finetune -c config/DINO/DINO_4scale_custom.py --coco_path ./coco_path --options dn_scalar=100 embed_init_tgt=TRUE dn_label_coef=1.0 dn_bbox_coef=1.0 use_ema=False dn_box_noise_scale=1.0 --pretrain_model_path./checkpoint0033_4scale.pth --finetune_ignore label_enc.weight class_embed