既存モデルでの推論¶
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_datasamples
をTrue
に設定して、元のDataSampleを取得できます。これはpredictions
に保存されます。
結果のダンプ¶
戻り値から予測を取得するだけでなく、out_dir
とno_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_kwargs 、forward_kwargs 、visualize_kwargs 、postprocess_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