DETR (DEtection TRansformer) 自己構築データセットに基づくターゲット検出モデルの開発と構築に関する非常に詳細なチュートリアル

ターゲット検出シリーズのアルゴリズム モデルは多岐にわたり、シリーズごとに理論的根拠が異なりますが、DETR のハイライトは、完全にエンドツーエンドの最初のターゲット検出モデルであることです。 Facebook AI Research によって開発された、Transformer ベースのターゲット検出モデルです。エンドツーエンドのアプローチを採用して、物体検出タスクにおける物体の位置特定と分類を同時に実行します。DETR モデルは、Transformer のセルフアテンション メカニズムとエンコーダ/デコーダ構造を組み合わせたものです。画像を入力として受け取り、Transformer デコーダーを使用して予測ボックスと対応するカテゴリを生成します。従来の物体検出方法とは異なり、DETR はアンカー ボックスや領域提案を使用する必要がなく、地球規模の観測から直接予測を生成します。

DETR モデルのトレーニング プロセスには 2 つの段階が含まれます: まず、クロス エントロピー損失関数を使用して予測ボックスとカテゴリを監視し、次にハンガリー アルゴリズムを使用して予測ボックスと実際のボックスを照合し、IoU 損失を計算します。予測結果をさらに最適化するために計算されます。DETR モデルは、物体検出タスクで優れたパフォーマンスを達成し、高い効率と柔軟性を備えています。オブジェクト検出、インスタンスのセグメンテーション、その他のタスクなど、さまざまなシナリオに適用できます。

DETR のプロジェクトの公式アドレスは次とおりです。

 現在、11.4,000 個以上の星があり、これが優れた検出モデルであることを示すのに十分です。

 DETR (DEtection TRansformer) は、PyTorch トレーニング コードと事前トレーニング済みモデルを提供する、Transformer ベースのターゲット検出モデルです。従来の複雑な手動設計のターゲット検出プロセスを Transformer に置き換え、ResNet-50 を使用して Faster R-CNN と比較し、同じパラメータ数と半分の計算量 (FLOP) で COCO データセット上で 42 AP を取得します。 . 正確さ。わずか 50 行の PyTorch コードで推論が可能です。

DETR は、オブジェクト検出を直接的なアンサンブル予測問題として扱うことを特徴としています。これには、2 部グラフ マッチングを通じて一意の予測を強制するアンサンブル ベースのグローバル損失関数と、Transformer エンコーダ/デコーダ アーキテクチャが含まれます。学習されたオブジェクト クエリの固定セットが与えられると、DETR は、オブジェクトとグローバル画像コンテキストの間の関係に従って、最終的な予測結果を並列で直接出力します。この並列性により、DETR は非常に高速かつ効率的です。

コードに関しては、オブジェクトの検出が分類よりも困難であってはならず、複雑なトレーニングや推論ライブラリを必要とするべきではないと考えています。DETR の実装と実験は非常に簡単なので、数行の PyTorch コードで推論に DETR を使用する方法を示すスタンドアロンの Colab Notebook を提供しています。トレーニング コードもこの考え方に従っており、ライブラリではなく、モデルと標準トレーニング ループをインポートするメインの .py ファイルにすぎません。さらに、d2/ フォルダーにある Detectron2 のラッパーも提供しています。詳細については、Readme を参照してください。

次に、DETR に基づいて独自のパーソナライズされたターゲット検出モデルを開発および構築する方法を段階的に見てみましょう。

1.準備プロジェクトをダウンロードする

 赤のボックスで示されているようにページに直接インストールし、次のようにクリックしてソース コード プロジェクトをローカルにダウンロードします。

 解凍するとこんな感じになります。

 ごちゃごちゃしているように見えるので、ここで不要なファイルを削除し、次のように簡略化します。

 この時点で、プロジェクトのダウンロードの準備は完了です。

2. プロジェクトパラメータの変更

これは主に、独自のデータセットに従っていくつかのプロジェクト パラメーターの構成を変更するためのものです。まず、ここにアクセスして、公式の事前トレーニング モデルの重みファイルをダウンロードします。次のように:

 次に、次のコードを記述して、独自のデータセットに適応するように事前トレーニング モデル ファイルを変更します。

import torch

pretrained_weights = torch.load("./detr-r50-e632da11.pth")
num_class = 1 + 1
pretrained_weights["model"]["class_embed.weight"].resize_(num_class+1,256)
pretrained_weights["model"]["class_embed.bias"].resize_(num_class+1)
torch.save(pretrained_weights,'detr_r50_%d.pth'%num_class)

ここのコアは num_class です。ここにはカテゴリが 1 つだけあり、すべて 1 (ターゲットの数) + 1 (背景) です。実際の状況に応じて変更できます。上記のコードを実行すると、事前トレーニング モデルが生成されます独自のデータセットをトレーニングするために使用できます。ファイルは次のようになります。

 次に、以下に示すように、models ディレクトリに入ります。

 detr.pyのソースコードを変更するには:

 修正内容は以下の通りです。

 独自のデータセットの実際の状況に応じて変更することもできます。

公式のサンプルはすべて COCO データセットに基づいています。データセットを直接使用しやすくするために、datasets ディレクトリ内の coco.py モジュールも次のように変更しました。

 yolo シリーズの超詳細なチュートリアルを書いたときに、データ セット ディレクトリのベンチマークとして 0000 ディレクトリを使用することに慣れていたため、ここでは必要ありません。これは実際の状況に応じて行うことができます。

0000/coco/ ディレクトリは次のとおりです。

 注釈ディレクトリは次のとおりです。

 train ディレクトリと val ディレクトリはどちらも画像データ ディレクトリです。

この時点で、すべてのデータセットの準備とパラメータ変更の構成が完了します。

3. モデルのトレーニング

前のステップ 1 とステップ 2 を完了したら、ターミナルに次のコマンドを入力するだけでモデルのトレーニングを開始できます。

python3 main.py --dataset_file "coco" --coco_path "/0000/coco" --epoch 100 --lr=1e-4 --batch_size=2 --num_workers=0 --output_dir="outputs" --resume="weights/detr_r50_2.pth"

ターミナルのログ出力は次のようになります。

 このログ出力の形式がyoloシリーズのモデルスタイルとはかなり異なっているように感じ、初めて使ったときは若干違和感がありました。

静かに待ちます。100 エポックのトレーニングが完了すると、結果のディレクトリは次のようになります。

 ここでは、次のようにエポックの結果データを確認します。

{"train_lr": 0.00010000000000000072, "train_class_error": 8.246314652760823, "train_loss": 11.92804820438226, "train_loss_ce": 0.45436179675161836, "train_loss_bbox": 0.19398587183095514, "train_loss_giou": 1.2654916323721408, "train_loss_ce_0": 0.6175143427525958, "train_loss_bbox_0": 0.21694033461002013, "train_loss_giou_0": 1.3583310965448618, "train_loss_ce_1": 0.5325561841484159, "train_loss_bbox_1": 0.19919901308603585, "train_loss_giou_1": 1.2892874646931887, "train_loss_ce_2": 0.49897560079116376, "train_loss_bbox_2": 0.19595884778536857, "train_loss_giou_2": 1.2676222202057639, "train_loss_ce_3": 0.47517175901836406, "train_loss_bbox_3": 0.19423701039825877, "train_loss_giou_3": 1.2563509756699205, "train_loss_ce_4": 0.457715673193646, "train_loss_bbox_4": 0.19406218592387933, "train_loss_giou_4": 1.2602861863871415, "train_loss_ce_unscaled": 0.45436179675161836, "train_class_error_unscaled": 8.246314652760823, "train_loss_bbox_unscaled": 0.038797174374728155, "train_loss_giou_unscaled": 0.6327458161860704, "train_cardinality_error_unscaled": 25.414583333333333, "train_loss_ce_0_unscaled": 0.6175143427525958, "train_loss_bbox_0_unscaled": 0.04338806696857015, "train_loss_giou_0_unscaled": 0.6791655482724309, "train_cardinality_error_0_unscaled": 29.636458333333334, "train_loss_ce_1_unscaled": 0.5325561841484159, "train_loss_bbox_1_unscaled": 0.03983980262031158, "train_loss_giou_1_unscaled": 0.6446437323465943, "train_cardinality_error_1_unscaled": 27.819791666666667, "train_loss_ce_2_unscaled": 0.49897560079116376, "train_loss_bbox_2_unscaled": 0.03919176950973148, "train_loss_giou_2_unscaled": 0.6338111101028819, "train_cardinality_error_2_unscaled": 27.161458333333332, "train_loss_ce_3_unscaled": 0.47517175901836406, "train_loss_bbox_3_unscaled": 0.03884740209129329, "train_loss_giou_3_unscaled": 0.6281754878349602, "train_cardinality_error_3_unscaled": 26.110416666666666, "train_loss_ce_4_unscaled": 0.457715673193646, "train_loss_bbox_4_unscaled": 0.038812437271311256, "train_loss_giou_4_unscaled": 0.6301430931935708, "train_cardinality_error_4_unscaled": 25.4625, "test_class_error": 3.091428756713867, "test_loss": 10.50865466594696, "test_loss_ce": 0.2767929275830587, "test_loss_bbox": 0.14404282706479232, "test_loss_giou": 1.2663704454898834, "test_loss_ce_0": 0.3979991920292377, "test_loss_bbox_0": 0.16362756925324598, "test_loss_giou_0": 1.36108036339283, "test_loss_ce_1": 0.3436319828033447, "test_loss_bbox_1": 0.1497225967546304, "test_loss_giou_1": 1.3024949004252753, "test_loss_ce_2": 0.30994254574179647, "test_loss_bbox_2": 0.14414388077954451, "test_loss_giou_2": 1.249400516351064, "test_loss_ce_3": 0.2894516279300054, "test_loss_bbox_3": 0.144076735774676, "test_loss_giou_3": 1.270151581366857, "test_loss_ce_4": 0.2760662081340949, "test_loss_bbox_4": 0.1443922327210506, "test_loss_giou_4": 1.2752665122350058, "test_loss_ce_unscaled": 0.2767929275830587, "test_class_error_unscaled": 3.091428756713867, "test_loss_bbox_unscaled": 0.028808565282573303, "test_loss_giou_unscaled": 0.6331852227449417, "test_cardinality_error_unscaled": 31.85, "test_loss_ce_0_unscaled": 0.3979991920292377, "test_loss_bbox_0_unscaled": 0.03272551361781855, "test_loss_giou_0_unscaled": 0.680540181696415, "test_cardinality_error_0_unscaled": 43.225, "test_loss_ce_1_unscaled": 0.3436319828033447, "test_loss_bbox_1_unscaled": 0.02994451941922307, "test_loss_giou_1_unscaled": 0.6512474502126376, "test_cardinality_error_1_unscaled": 39.733333333333334, "test_loss_ce_2_unscaled": 0.30994254574179647, "test_loss_bbox_2_unscaled": 0.02882877611555159, "test_loss_giou_2_unscaled": 0.624700258175532, "test_cardinality_error_2_unscaled": 37.733333333333334, "test_loss_ce_3_unscaled": 0.2894516279300054, "test_loss_bbox_3_unscaled": 0.028815347344304125, "test_loss_giou_3_unscaled": 0.6350757906834285, "test_cardinality_error_3_unscaled": 34.483333333333334, "test_loss_ce_4_unscaled": 0.2760662081340949, "test_loss_bbox_4_unscaled": 0.02887844655973216, "test_loss_giou_4_unscaled": 0.6376332561175029, "test_cardinality_error_4_unscaled": 31.533333333333335, "test_coco_eval_bbox": [0.0784053628963453, 0.27165513666939684, 0.02143312972132683, 0.05011304279117235, 0.10950960486820328, 0.248747506997248, 0.01054397316079559, 0.07481428229091781, 0.18171579199616583, 0.13471350899205353, 0.2401053864168618, 0.3527027027027027], "epoch": 0, "n_parameters": 41279495}

これは標準の辞書データです。

モデルのトレーニングが完了したら、次のコマンドを実行してモデルを評価およびテストできます。

python3 main.py --batch_size 2 --no_aux_loss --eval --resume outputs/checkpoint.pth --coco_path "/0000/coco"

結果の出力は次のようになります。

Accumulating evaluation results...
DONE (t=0.12s).
IoU metric: bbox
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.249
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.614
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.147
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.156
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.548
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.017
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.142
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.362
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.279
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.468
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.622

当初の効果は悪くありませんが、yoloシリーズの模型実験結果と比較するとまだ劣ります。

この時点で、モデルの開発、トレーニング、テスト評価は終了です。

4. トレーニングの視覚化

おそらくここにいる皆さんは、DETR プロジェクトには YOLO のような視覚化機能がないことに気づいていると思います。そのため、視覚的なインジケーターが必要な場合は、やはり自分で視覚的な描画を行う必要があります。

これは私自身の単純な図であり、ご自身のニーズに応じて実現できます。単一エポックのトレーニング ログ データを次のように解析します。

train_lr 0.00010000000000000072
train_class_error 8.246314652760823
train_loss 11.92804820438226
train_loss_ce 0.45436179675161836
train_loss_bbox 0.19398587183095514
train_loss_giou 1.2654916323721408
train_loss_ce_0 0.6175143427525958
train_loss_bbox_0 0.21694033461002013
train_loss_giou_0 1.3583310965448618
train_loss_ce_1 0.5325561841484159
train_loss_bbox_1 0.19919901308603585
train_loss_giou_1 1.2892874646931887
train_loss_ce_2 0.49897560079116376
train_loss_bbox_2 0.19595884778536857
train_loss_giou_2 1.2676222202057639
train_loss_ce_3 0.47517175901836406
train_loss_bbox_3 0.19423701039825877
train_loss_giou_3 1.2563509756699205
train_loss_ce_4 0.457715673193646
train_loss_bbox_4 0.19406218592387933
train_loss_giou_4 1.2602861863871415
train_loss_ce_unscaled 0.45436179675161836
train_class_error_unscaled 8.246314652760823
train_loss_bbox_unscaled 0.038797174374728155
train_loss_giou_unscaled 0.6327458161860704
train_cardinality_error_unscaled 25.414583333333333
train_loss_ce_0_unscaled 0.6175143427525958
train_loss_bbox_0_unscaled 0.04338806696857015
train_loss_giou_0_unscaled 0.6791655482724309
train_cardinality_error_0_unscaled 29.636458333333334
train_loss_ce_1_unscaled 0.5325561841484159
train_loss_bbox_1_unscaled 0.03983980262031158
train_loss_giou_1_unscaled 0.6446437323465943
train_cardinality_error_1_unscaled 27.819791666666667
train_loss_ce_2_unscaled 0.49897560079116376
train_loss_bbox_2_unscaled 0.03919176950973148
train_loss_giou_2_unscaled 0.6338111101028819
train_cardinality_error_2_unscaled 27.161458333333332
train_loss_ce_3_unscaled 0.47517175901836406
train_loss_bbox_3_unscaled 0.03884740209129329
train_loss_giou_3_unscaled 0.6281754878349602
train_cardinality_error_3_unscaled 26.110416666666666
train_loss_ce_4_unscaled 0.457715673193646
train_loss_bbox_4_unscaled 0.038812437271311256
train_loss_giou_4_unscaled 0.6301430931935708
train_cardinality_error_4_unscaled 25.4625
test_class_error 3.091428756713867
test_loss 10.50865466594696
test_loss_ce 0.2767929275830587
test_loss_bbox 0.14404282706479232
test_loss_giou 1.2663704454898834
test_loss_ce_0 0.3979991920292377
test_loss_bbox_0 0.16362756925324598
test_loss_giou_0 1.36108036339283
test_loss_ce_1 0.3436319828033447
test_loss_bbox_1 0.1497225967546304
test_loss_giou_1 1.3024949004252753
test_loss_ce_2 0.30994254574179647
test_loss_bbox_2 0.14414388077954451
test_loss_giou_2 1.249400516351064
test_loss_ce_3 0.2894516279300054
test_loss_bbox_3 0.144076735774676
test_loss_giou_3 1.270151581366857
test_loss_ce_4 0.2760662081340949
test_loss_bbox_4 0.1443922327210506
test_loss_giou_4 1.2752665122350058
test_loss_ce_unscaled 0.2767929275830587
test_class_error_unscaled 3.091428756713867
test_loss_bbox_unscaled 0.028808565282573303
test_loss_giou_unscaled 0.6331852227449417
test_cardinality_error_unscaled 31.85
test_loss_ce_0_unscaled 0.3979991920292377
test_loss_bbox_0_unscaled 0.03272551361781855
test_loss_giou_0_unscaled 0.680540181696415
test_cardinality_error_0_unscaled 43.225
test_loss_ce_1_unscaled 0.3436319828033447
test_loss_bbox_1_unscaled 0.02994451941922307
test_loss_giou_1_unscaled 0.6512474502126376
test_cardinality_error_1_unscaled 39.733333333333334
test_loss_ce_2_unscaled 0.30994254574179647
test_loss_bbox_2_unscaled 0.02882877611555159
test_loss_giou_2_unscaled 0.624700258175532
test_cardinality_error_2_unscaled 37.733333333333334
test_loss_ce_3_unscaled 0.2894516279300054
test_loss_bbox_3_unscaled 0.028815347344304125
test_loss_giou_3_unscaled 0.6350757906834285
test_cardinality_error_3_unscaled 34.483333333333334
test_loss_ce_4_unscaled 0.2760662081340949
test_loss_bbox_4_unscaled 0.02887844655973216
test_loss_giou_4_unscaled 0.6376332561175029
test_cardinality_error_4_unscaled 31.533333333333335
test_coco_eval_bbox [0.0784053628963453, 0.27165513666939684, 0.02143312972132683, 0.05011304279117235, 0.10950960486820328, 0.248747506997248, 0.01054397316079559, 0.07481428229091781, 0.18171579199616583, 0.13471350899205353, 0.2401053864168618, 0.3527027027027027]
epoch 0
n_parameters 41279495

以下に示すように、さまざまなインジケーターが非常に細かく分割されており、単一のインジケーターのコア描画実装は非常にシンプルであることがわかります。

plt.clf()
plt.figure(figsize=(10,8))
plt.plot(one_value)
plt.title(one_key + "cruve")
plt.savefig("outputs/pictures/"+one_key+".jpg")

視覚化の結果を見てください。

 もちろん、他にもたくさんあるので、ここでは 1 つずつ説明しません。自分で実行できます。

 ここで描いているのは非常にシンプルで、インジケーターは 1 枚で、その上に複数のインジケーターを重ねて表示することもできるので、興味のある方はぜひ試してみてください。

最後に、次のように推論検出の例を簡単に見てみましょう。

 この記事の実践方法はここまでです。興味があれば、ぜひ試してみてください。

おすすめ

転載: blog.csdn.net/Together_CZ/article/details/131786013