ショートカット

既存モデルでの推論

MMDetectionは、モデル動物園に何百もの事前学習済み検出モデルを提供しています。このノートでは、推論、つまり学習済みモデルを使用して画像上のオブジェクトを検出する方法を示します。

MMDetectionでは、モデルは構成ファイルによって定義され、既存のモデルパラメータはチェックポイントファイルに保存されます。

まず、この構成ファイルとこのチェックポイントファイルRTMDetを使用することをお勧めします。チェックポイントファイルをcheckpointsディレクトリにダウンロードすることをお勧めします。

推論用の高レベルAPI - Inferencer

OpenMMLabでは、すべての推論操作が新しいインターフェースであるInferencerに統合されています。Inferencerは、ユーザーに簡潔でシンプルなAPIを提供し、異なるOpenMMLabライブラリ間で非常に類似したインターフェースを共有するように設計されています。ノートブックのデモは、demo/inference_demo.ipynbにあります。

基本的な使い方

わずか3行のコードで、画像の推論結果を取得できます。

from mmdet.apis import DetInferencer

# Initialize the DetInferencer
inferencer = DetInferencer('rtmdet_tiny_8xb32-300e_coco')

# Perform inference
inferencer('demo/demo.jpg', show=True)

結果の出力は新しいウィンドウに表示されます。

注記

GUIのないサーバー上でMMDetectionを実行している場合や、X11転送が無効になっているSSHトンネルを介して実行している場合は、showオプションは機能しません。ただし、out_dir引数を設定することで、視覚化をファイルに保存できます。詳細については、結果のダンプをお読みください。

初期化

各Inferencerはモデルで初期化する必要があります。初期化中に推論デバイスを選択することもできます。

モデルの初期化

  • MMDetectionの事前学習済みモデルで推論するには、その名前を引数modelに渡すと機能します。重みは自動的にダウンロードされ、OpenMMLabのモデル動物園からロードされます。

    inferencer = DetInferencer(model='rtmdet_tiny_8xb32-300e_coco')
    

    MMDetectionのすべてのモデル名をリストするのは非常に簡単です。

    # models is a list of model names, and them will print automatically
    models = DetInferencer.list_models('mmdet')
    

    パス/URLをweightsに渡すことで、別の重みをロードできます。

    inferencer = DetInferencer(model='rtmdet_tiny_8xb32-300e_coco', weights='path/to/rtmdet.pth')
    
  • カスタムの構成と重みをロードするには、構成ファイルへのパスをmodelに、重みへのパスをweightsに渡すことができます。

    inferencer = DetInferencer(model='path/to/rtmdet_config.py', weights='path/to/rtmdet.pth')
    
  • デフォルトでは、MMEngineは構成を重みにダンプします。MMEngineで学習した重みがある場合は、modelを指定せずに、重みファイルへのパスをweightsに渡すこともできます。

    # It will raise an error if the config file cannot be found in the weight. Currently, within the MMDetection model repository, only the weights of ddq-detr-4scale_r50 can be loaded in this manner.
    inferencer = DetInferencer(weights='https://download.openmmlab.com/mmdetection/v3.0/ddq/ddq-detr-4scale_r50_8xb2-12e_coco/ddq-detr-4scale_r50_8xb2-12e_coco_20230809_170711-42528127.pth')
    
  • weightを指定せずに構成ファイルをmodelに渡すと、ランダムに初期化されたモデルになります。

デバイス

各Inferencerインスタンスはデバイスにバインドされます。デフォルトでは、最適なデバイスはMMEngineによって自動的に決定されます。また、device引数を指定することでデバイスを変更することもできます。たとえば、次のコードを使用してGPU 1でInferencerを作成できます。

inferencer = DetInferencer(model='rtmdet_tiny_8xb32-300e_coco', device='cuda:1')

CPUでInferencerを作成するには

inferencer = DetInferencer(model='rtmdet_tiny_8xb32-300e_coco', device='cpu')

サポートされているすべての形式については、torch.deviceを参照してください。

推論

Inferencerが初期化されたら、推論する生のデータを直接渡して、戻り値から推論結果を取得できます。

入力

入力は次のいずれかの型にできます

  • str: 画像へのパス/URL。

    inferencer('demo/demo.jpg')
    
  • array: numpy配列の画像。BGR順である必要があります。

    import mmcv
    array = mmcv.imread('demo/demo.jpg')
    inferencer(array)
    
  • list: 上記の基本型のリスト。リストの各要素は個別に処理されます。

    inferencer(['img_1.jpg', 'img_2.jpg])
    # You can even mix the types
    inferencer(['img_1.jpg', array])
    
  • str: ディレクトリへのパス。ディレクトリ内のすべての画像が処理されます。

    inferencer('path/to/your_imgs/')
    

出力

デフォルトでは、各Inferencerは予測結果を辞書形式で返します。

  • visualizationには、視覚化された予測が含まれています。

  • predictionsには、jsonシリアル化可能な形式の予測結果が含まれています。ただし、return_vis=Trueでない限り、デフォルトでは空のリストです。

{
      'predictions' : [
        # Each instance corresponds to an input image
        {
          'labels': [...],  # int list of length (N, )
          'scores': [...],  # float list of length (N, )
          'bboxes': [...],  # 2d list of shape (N, 4), format: [min_x, min_y, max_x, max_y]
        },
        ...
      ],
      'visualization' : [
        array(..., dtype=uint8),
      ]
  }

モデルから生の出力を取得したい場合は、return_datasamplesTrueに設定して、元のDataSampleを取得できます。これはpredictionsに保存されます。

結果のダンプ

戻り値から予測を取得するだけでなく、out_dirno_save_pred/no_save_vis引数を設定することで、予測/視覚化をファイルにエクスポートすることもできます。

inferencer('demo/demo.jpg', out_dir='outputs/', no_save_pred=False)

ディレクトリ構造のような結果

outputs
├── preds
│   └── demo.json
└── vis
    └── demo.jpg

各ファイルのファイル名は、対応する入力画像のファイル名と同じです。入力画像が配列の場合、ファイル名は0から始まる数値になります。

バッチ推論

batch_sizeを設定することで、バッチサイズをカスタマイズできます。デフォルトのバッチサイズは1です。

API

使用できるパラメータの詳細なリストを次に示します。

  • DetInferencer.__init__()

引数 説明
model str, オプション なし 構成ファイルまたはメタファイルで定義されたモデル名へのパス。たとえば、'rtmdet-s'、'rtmdet_s_8xb32-300e_coco'、または'configs/rtmdet/rtmdet_s_8xb32-300e_coco.py'などになります。モデルが指定されていない場合、ユーザーはMMEngineによって保存された、構成文字列を含むweightsを提供する必要があります。
weights str, オプション なし チェックポイントへのパス。指定されておらず、modelがメタファイルのモデル名である場合、重みはメタファイルからロードされます。
device str, オプション なし 推論に使用するデバイス。torch.deviceで許可されているすべての文字列を受け入れます。例: 'cuda:0'または'cpu'。Noneの場合、利用可能なデバイスが自動的に使用されます。
scope str, オプション 'mmdet' モデルのスコープ。
palette str 'なし' 可視化に使用するカラーパレット。優先順位は palette -> config -> checkpoint です。
show_progress bool True 推論処理中にプログレスバーを表示するかどうかを制御します。
  • DetInferencer.__call__()

引数 デフォルト 説明
inputs str/list/tuple/np.array 必須 画像/フォルダへのパス、np配列、またはリスト/タプル(画像パスまたはnp配列を含む)を指定できます。
batch_size int 1 推論バッチサイズ。
print_result bool False 推論結果をコンソールに出力するかどうか。
show bool False 可視化結果をポップアップウィンドウで表示するかどうか。
wait_time float 0 表示間隔(秒)。
no_save_vis bool False 予測可視化結果の保存を強制的に行わないかどうか。
draw_pred bool True 予測された境界ボックスを描画するかどうか。
pred_score_thr float 0.3 描画する境界ボックスの最小スコア。
return_datasamples bool False 結果をDataSamplesとして返すかどうか。Falseの場合、結果は辞書にまとめられます。
print_result bool False 推論結果をコンソールに出力するかどうか。
no_save_pred bool True 予測結果の保存を強制的に行わないかどうか。
out_dir str '' 結果の出力ディレクトリ。
texts str/list[str]、オプション なし テキストプロンプト。
stuff_texts str/list[str]、オプション なし オープンパノプティックタスクのスタッフィングテキストプロンプト。
custom_entities bool False カスタムエンティティを使用するかどうか。GLIPでのみ使用されます。
**kwargs :meth:preprocess、:meth:forward、:meth:visualize、:meth:postprocess に渡されるその他のキーワード引数。kwargs内の各キーは、対応する preprocess_kwargsforward_kwargsvisualize_kwargspostprocess_kwargs のセットにある必要があります。

デモ

また、高レベルAPIとサポート機能コードを使用して実装された4つのデモスクリプトを提供しています。ソースコードはこちらで入手できます。

画像デモ

このスクリプトは、単一の画像に対して推論を実行します。

python demo/image_demo.py \
    ${IMAGE_FILE} \
    ${CONFIG_FILE} \
    [--weights ${WEIGHTS}] \
    [--device ${GPU_ID}] \
    [--pred-score-thr ${SCORE_THR}]

python demo/image_demo.py demo/demo.jpg \
    configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
    --weights checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \
    --device cpu

Webカメラデモ

これは、Webカメラからのライブデモです。

python demo/webcam_demo.py \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--camera-id ${CAMERA-ID}] \
    [--score-thr ${SCORE_THR}]

python demo/webcam_demo.py \
    configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
    checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth

ビデオデモ

このスクリプトは、ビデオに対して推論を実行します。

python demo/video_demo.py \
    ${VIDEO_FILE} \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--score-thr ${SCORE_THR}] \
    [--out ${OUT_FILE}] \
    [--show] \
    [--wait-time ${WAIT_TIME}]

python demo/video_demo.py demo/demo.mp4 \
    configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
    checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \
    --out result.mp4

GPUアクセラレーション付きビデオデモ

このスクリプトは、GPUアクセラレーションを使用してビデオに対して推論を実行します。

python demo/video_gpuaccel_demo.py \
    ${VIDEO_FILE} \
    ${CONFIG_FILE} \
    ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] \
    [--score-thr ${SCORE_THR}] \
    [--nvdecode] \
    [--out ${OUT_FILE}] \
    [--show] \
    [--wait-time ${WAIT_TIME}]

python demo/video_gpuaccel_demo.py demo/demo.mp4 \
    configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
    checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \
    --nvdecode --out result.mp4

大画像推論デモ

これは、大きな画像でスライシング推論を行うためのスクリプトです。

python demo/large_image_demo.py \
	${IMG_PATH} \
	${CONFIG_FILE} \
	${CHECKPOINT_FILE} \
	--device ${GPU_ID}  \
	--show \
	--tta  \
	--score-thr ${SCORE_THR} \
	--patch-size ${PATCH_SIZE} \
	--patch-overlap-ratio ${PATCH_OVERLAP_RATIO} \
	--merge-iou-thr ${MERGE_IOU_THR} \
	--merge-nms-type ${MERGE_NMS_TYPE} \
	--batch-size ${BATCH_SIZE} \
	--debug \
	--save-patch

# inferecnce without tta
wget -P checkpoint https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth

python demo/large_image_demo.py \
    demo/large_image.jpg \
    configs/faster_rcnn/faster-rcnn_r101_fpn_2x_coco.py \
    checkpoint/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth

# inference with tta
wget -P checkpoint https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth

python demo/large_image_demo.py \
    demo/large_image.jpg \
    configs/retinanet/retinanet_r50_fpn_1x_coco.py \
    checkpoint/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth --tta

マルチモーダルアルゴリズム推論デモと評価

マルチモーダルビジョンアルゴリズムが進化し続けるにつれて、MMDetectionもそのようなアルゴリズムをサポートしてきました。このセクションでは、GLIPアルゴリズムとモデルを例として使用して、マルチモーダルアルゴリズムに対応するデモおよび評価スクリプトを使用する方法を説明します。さらに、MMDetectionはgradio_demo プロジェクトを統合し、開発者はローカルデバイス上のMMDetectionのすべての画像入力タスクをすばやく試すことができます。詳細については、ドキュメントを確認してください。

準備

まず、正しい依存関係がインストールされていることを確認してください

# if source
pip install -r requirements/multimodal.txt

# if wheel
mim install mmdet[multimodal]

MMDetectionはすでにGLIPアルゴリズムを実装し、重みを提供しています。URLから直接ダウンロードできます。

cd mmdetection
wget https://download.openmmlab.com/mmdetection/v3.0/glip/glip_tiny_a_mmdet-b3654169.pth

推論

モデルが正常にダウンロードされたら、demo/image_demo.pyスクリプトを使用して推論を実行できます。

python demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts bench

デモの結果は次のようになります

複数のターゲットを検出したい場合は、--textsの後にxx. xxの形式で宣言してください。

python demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts 'bench. car'

そして、結果は次のようになります

たとえば、--textsフィールドの入力プロンプトとして文を使用することもできます

python demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts 'There are a lot of cars here.'

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

評価

MMDetectionでのGLIPの実装にはパフォーマンスの低下はありません。私たちのベンチマークは次のとおりです

モデル 公式mAP mmdet mAP
glip_A_Swin_T_O365.yaml 42.9 43.0
glip_Swin_T_O365.yaml 44.9 44.9
glip_Swin_L.yaml 51.4 51.3

ユーザーは、私たちが提供したテストスクリプトを使用して評価を実行することもできます。基本的な例を次に示します。

# 1 gpu
python tools/test.py configs/glip/glip_atss_swin-t_fpn_dyhead_pretrain_obj365.py glip_tiny_a_mmdet-b3654169.pth

# 8 GPU
./tools/dist_test.sh configs/glip/glip_atss_swin-t_fpn_dyhead_pretrain_obj365.py glip_tiny_a_mmdet-b3654169.pth 8