エンドツーエンドのGPU最適化を備えた高速で正確なシングルステージオブジェクト検出。
ODTKは、さまざまなバックボーンと検出ヘッドを備えたシングルショットオブジェクト検出器です。これにより、パフォーマンス/精度のトレードオフが可能になります。
以下を使用したエンドツーエンドGPU処理に最適化されています。
このレポは、回転した境界ボックス検出をサポートするようになりました。回転した検出トレーニングと回転検出の推論文書を参照してください。 --rotated-bboxコマンドの使用方法の詳細については。
境界ボックスアノテーションは[x, y, w, h, theta]によって説明されています。
検出パイプラインを使用すると、ユーザーは、レイテンシのアクセラシーのトレードオフに応じて特定のバックボーンを選択できます。
完全なトレーニングスケジュール後のCOCO 2017(列車/VAL)のODTKレチナネットモデルの精度と推論レイテンシおよびFPS(秒あたりのフレーム)。推論の結果には、FP16 Tensortエンジンで--with-dali使用して--resize 800を使用して測定されたバッチサイズのバッチサイズのプロセッシング後の境界ボックスが含まれます。
| バックボーン | map @[iou = 0.50:0.95] | DGX1Vでのトレーニング時間 | V100の推論レイテンシーFP16 | T4の推論レイテンシーINT8 | A100の推論レイテンシーFP16 | A100の推論レイテンシーINT8 |
|---|---|---|---|---|---|---|
| resnet18fpn | 0.318 | 5時間 | 14ミリ秒; 71 fps | 18ミリ秒; 56 fps | 9ミリ秒; 110 fps | 7ミリ秒; 141 fps |
| mobilenetv2fpn | 0.333 | 14ミリ秒; 74 fps | 18ミリ秒; 56 fps | 9ミリ秒; 114 fps | 7ミリ秒; 138 fps | |
| resnet34fpn | 0.343 | 6時間 | 16ミリ秒; 64 fps | 20ミリ秒; 50 fps | 10ミリ秒; 103 fps | 7ミリ秒; 142 fps |
| resnet50fpn | 0.358 | 7時間 | 18ミリ秒; 56 fps | 22ミリ秒; 45 fps | 11ミリ秒; 93 fps | 8ミリ秒; 129 fps |
| resnet101fpn | 0.376 | 10時間 | 22ミリ秒; 46 fps | 27ミリ秒; 37 fps | 13ミリ秒; 78 fps | 9ミリ秒; 117 fps |
| resnet152fpn | 0.393 | 12時間 | 26ミリ秒; 38 fps | 33ミリ秒; 31 fps | 15ミリ秒; 66 fps | 10ミリ秒; 103 fps |
最高のパフォーマンスには、最新のPytorch NGC Dockerコンテナを使用してください。このリポジトリをクローンし、独自の画像を構築して実行します。
git clone https://github.com/nvidia/retinanet-examples
docker build -t odtk:latest retinanet-examples/
docker run --gpus all --rm --ipc=host -it odtk:latestトレーニング、推論、評価、モデルのエクスポートは、 odtkユーティリティを通じて行うことができます。パラメーターのリストを含む詳細については、トレーニングと推論のドキュメントを参照してください。
事前に訓練されたバックボーンからCOCO 2017の検出モデルをトレーニングします。
odtk train retinanet_rn50fpn.pth --backbone ResNet50FPN
--images /coco/images/train2017/ --annotations /coco/annotations/instances_train2017.json
--val-images /coco/images/val2017/ --val-annotations /coco/annotations/instances_val2017.jsonデータセットで事前に訓練されたモデルを微調整します。以下の例では、JSONアノテーションでPascal Vocを使用します。
odtk train model_mydataset.pth --backbone ResNet50FPN
--fine-tune retinanet_rn50fpn.pth
--classes 20 --iters 10000 --val-iters 1000 --lr 0.0005
--resize 512 --jitter 480 640 --images /voc/JPEGImages/
--annotations /voc/pascal_train2012.json --val-annotations /voc/pascal_val2012.json注:入力画像の短い側は、長い側がmax-sizeよりも大きくならない限り、 resizeに変更されます。トレーニング中、画像はjitter範囲内の新しいサイズにランダムに変更されます。
COCO 2017で検出モデルを評価します。
odtk infer retinanet_rn50fpn.pth --images /coco/images/val2017/ --annotations /coco/annotations/instances_val2017.jsonデータセットで推論を実行します:
odtk infer retinanet_rn50fpn.pth --images /dataset/val --output detections.jsonより速い推論のために、検出モデルを最適化されたFP16 TENSORTエンジンにエクスポートします。
odtk export model.pth engine.planCOCO 2017のTensortRtバックエンドでモデルを評価します:
odtk infer engine.plan --images /coco/images/val2017/ --annotations /coco/annotations/instances_val2017.jsonさらに速い推論のために、INT8キャリブレーションを実行して、最適化されたINT8 TENSORTエンジンを作成します。
odtk export model.pth engine.plan --int8 --calibration-images /coco/images/val2017/これにより、キャリブレーションを行う必要なく、後で同じモデルのINT8 TENSORTエンジンを作成するために使用できるINT8CALIBRATIONTABLEファイルが作成されます。
または、キャッシュされたキャリブレーションテーブルを使用して、最適化されたINT8 TENSORTエンジンを作成します。
odtk export model.pth engine.plan --int8 --calibration-table /path/to/INT8CalibrationTableRetinanetは、Coco JSON形式の注釈をサポートしています。アノテーションを独自のデータセットからJSONに変換する場合、次のエントリが必要です。
{
"images": [{
"id" : int,
"file_name" : str
}],
"annotations": [{
"id" : int,
"image_id" : int,
"category_id" : int,
"bbox" : [x, y, w, h] # all floats
"area": float # w * h. Required for validation scores
"iscrowd": 0 # Required for validation scores
}],
"categories": [{
"id" : int
]}
}
回転した検出に--rotated-bboxフラグを使用する場合は、注釈に追加のフロートthetaを追加します。検証スコアを取得するには、 segmentationセクションに記入する必要もあります。
"bbox" : [x, y, w, h, theta] # all floats, where theta is measured in radians anti-clockwise from the x-axis.
"segmentation" : [[x1, y1, x2, y2, x3, y3, x4, y4]]
# Required for validation scores.
これは、公式のNvidia製品ではなく、研究プロジェクトです。
このブランチはTensort 7を使用します。Pytorchを使用してモデルをトレーニングおよび推測している場合、またはTesla GPU(V100、T4など)にTensortエンジンを作成している場合は、このブランチを使用する必要があります。
Jetsonバージョン4.3を実行しているJetsonデバイス(例:Jetson AGX Xavierなど)にモデルを展開する場合は、このレポの19.10ブランチを使用する必要があります。