標準データセットでの既存モデルのテスト¶
モデルの精度を評価するには、通常、いくつかの標準データセットでモデルをテストします。データセットの準備については、データセットの準備ガイド を参照してください。
このセクションでは、サポートされているデータセットで既存のモデルをテストする方法を示します。
既存モデルのテスト¶
既存のモデルを全体のデータセット(COCO、PASCAL VOC、Cityscapesなど)で評価するためのテストスクリプトを提供しています。次のテスト環境がサポートされています。
シングルGPU
CPU
シングルノードマルチGPU
マルチノード
テスト環境に応じて、適切なスクリプトを選択してテストを実行してください。
# Single-gpu testing
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--show]
# CPU: disable GPUs and run single-gpu testing script
export CUDA_VISIBLE_DEVICES=-1
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--show]
# Multi-gpu testing
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
[--out ${RESULT_FILE}]
tools/dist_test.sh
はマルチノードテストもサポートしていますが、PyTorchのlaunchユーティリティに依存しています。
オプション引数
RESULT_FILE
: pickle形式の出力結果のファイル名。指定しない場合、結果はファイルに保存されません。--show
: 指定すると、検出結果は画像にプロットされ、新しいウィンドウに表示されます。シングルGPUテストにのみ適用され、デバッグと可視化に使用されます。環境でGUIが使用可能になっていることを確認してください。そうでない場合、「cannot connect to X server
」のようなエラーが発生する可能性があります。--show-dir
: 指定すると、検出結果は画像にプロットされ、指定したディレクトリに保存されます。シングルGPUテストにのみ適用され、デバッグと可視化に使用されます。このオプションを使用するために、環境でGUIを使用可能にする必要はありません。--work-dir
: 指定すると、評価指標を含む検出結果は指定したディレクトリに保存されます。--cfg-options
: 指定すると、キーバリューペアのオプションcfgが設定ファイルにマージされます。
例¶
チェックポイントを既にcheckpoints/
ディレクトリにダウンロード済みであると仮定します。
RTMDetをテストし、結果を可視化します。次の画像を表示するには、任意のキーを押します。設定ファイルとチェックポイントファイルはこちらにあります。
python tools/test.py \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \ --show
RTMDetをテストし、今後の可視化のために描画された画像を保存します。設定ファイルとチェックポイントファイルはこちらにあります。
python tools/test.py \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \ --show-dir faster_rcnn_r50_fpn_1x_results
PASCAL VOCでFaster R-CNNをテストします(テスト結果は保存しません)。設定ファイルとチェックポイントファイルはこちらにあります。
python tools/test.py \ configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py \ checkpoints/faster_rcnn_r50_fpn_1x_voc0712_20200624-c9895d40.pth
8つのGPUでMask R-CNNをテストし、評価します。設定ファイルとチェックポイントファイルはこちらにあります。
./tools/dist_test.sh \ configs/mask-rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8 \ --out results.pkl
8つのGPUでMask R-CNNをテストし、指標を**クラスごとに**評価します。設定ファイルとチェックポイントファイルはこちらにあります。
./tools/dist_test.sh \ configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8 \ --out results.pkl \ --cfg-options test_evaluator.classwise=True
8つのGPUでCOCO test-devでMask R-CNNをテストし、公式評価サーバーに提出するためのJSONファイルを生成します。設定ファイルとチェックポイントファイルはこちらにあります。
設定ファイルのコメント内の元のtest_evaluatorとtest_dataloaderをtest_evaluatorとtest_dataloaderに置き換え、実行します。
./tools/dist_test.sh \ configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8
このコマンドは、
./work_dirs/coco_instance/test.bbox.json
と./work_dirs/coco_instance/test.segm.json
という2つのJSONファイルを生成します。8つのGPUでCityscapes testでMask R-CNNをテストし、公式評価サーバーに提出するためのtxtファイルとpngファイルを生成します。設定ファイルとチェックポイントファイルはこちらにあります。
設定ファイルのコメント内の元のtest_evaluatorとtest_dataloaderをtest_evaluatorとtest_dataloaderに置き換え、実行します。
./tools/dist_test.sh \ configs/cityscapes/mask-rcnn_r50_fpn_1x_cityscapes.py \ checkpoints/mask_rcnn_r50_fpn_1x_cityscapes_20200227-afe51d5a.pth \ 8
生成されたpngとtxtは
./work_dirs/cityscapes_metric/
ディレクトリにあります。
正解アノテーションなしでのテスト¶
MMDetectionは、CocoDataset
を使用して正解アノテーションなしでモデルをテストすることをサポートしています。データセット形式がCOCO形式でない場合は、COCO形式に変換してください。たとえば、データセット形式がVOCの場合は、tools内のスクリプトを使用して直接COCO形式に変換できます。データセット形式がCityscapesの場合は、tools内のスクリプトを使用して直接COCO形式に変換できます。残りの形式はこのスクリプトを使用して変換できます。
python tools/dataset_converters/images2coco.py \
${IMG_PATH} \
${CLASSES} \
${OUT} \
[--exclude-extensions]
引数
IMG_PATH
: 画像のルートパス。CLASSES
: カテゴリのリストを含むテキストファイル。OUT
: 出力アノテーションJSONファイル名。IMG_PATH
と同じディレクトリに保存されます。exclude-extensions
: 除外する画像のサフィックス(例:「png」、「bmp」)。
変換が完了したら、設定ファイル(現在の設定が対応する「configs/_base_/datasets」内のデータセットを見つける)のコメント内の元のtest_evaluatorとtest_dataloaderをtest_evaluatorとtest_dataloaderに置き換え、実行します。
# Single-gpu testing
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--show]
# CPU: disable GPUs and run single-gpu testing script
export CUDA_VISIBLE_DEVICES=-1
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--show]
# Multi-gpu testing
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
[--show]
モデル動物園のチェックポイントがcheckpoints/
ディレクトリにダウンロード済みであると仮定すると、次のコマンドを使用して、8つのGPUでCOCO test-devでMask R-CNNをテストし、JSONファイルを生成できます。
./tools/dist_test.sh \
configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py \
checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \
8
このコマンドは、./work_dirs/coco_instance/test.bbox.json
と./work_dirs/coco_instance/test.segm.json
という2つのJSONファイルを生成します。
バッチ推論¶
MMDetectionは、テストモードで単一画像またはバッチ画像による推論をサポートしています。デフォルトでは単一画像推論を使用しており、テストデータの構成ファイル内のsamples_per_gpu
を変更することでバッチ推論を使用できます。以下の手順で構成ファイルを修正することで実行できます。
data = dict(train_dataloader=dict(...), val_dataloader=dict(...), test_dataloader=dict(batch_size=2, ...))
または、--cfg-options test_dataloader.batch_size=2
のように--cfg-options
を使用して設定することもできます。
テスト時データ拡張 (TTA)¶
テスト時データ拡張(TTA)は、テストフェーズで使用されるデータ拡張戦略です。フリップやスケーリングなどの異なる拡張を同じ画像に適用してモデル推論を行い、その後、各拡張画像の予測をマージしてより正確な予測を得ます。ユーザーがTTAをより簡単に使用できるように、MMEngineはBaseTTAModelクラスを提供しており、ユーザーは必要に応じてBaseTTAModelクラスを拡張することで、さまざまなTTA戦略を実装できます。
MMDetectionでは、BaseTTAModelを継承したDetTTAModelクラスを提供しています。
ユースケース¶
TTAを使用するには、2つの手順が必要です。まず、構成ファイルにtta_model
とtta_pipeline
を追加する必要があります。
tta_model = dict(
type='DetTTAModel',
tta_cfg=dict(nms=dict(
type='nms',
iou_threshold=0.5),
max_per_img=100))
tta_pipeline = [
dict(type='LoadImageFromFile',
backend_args=None),
dict(
type='TestTimeAug',
transforms=[[
dict(type='Resize', scale=(1333, 800), keep_ratio=True)
], [ # It uses 2 flipping transformations (flipping and not flipping).
dict(type='RandomFlip', prob=1.),
dict(type='RandomFlip', prob=0.)
], [
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape',
'img_shape', 'scale_factor', 'flip',
'flip_direction'))
]])]
次に、テストスクリプトを実行する際に、以下の例のように--tta
を設定します。
# Single-gpu testing
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--tta]
# CPU: disable GPUs and run single-gpu testing script
export CUDA_VISIBLE_DEVICES=-1
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--tta]
# Multi-gpu testing
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
[--tta]
スケーリングの強化を追加するなど、TTA構成を自分で変更することもできます。
tta_model = dict(
type='DetTTAModel',
tta_cfg=dict(nms=dict(
type='nms',
iou_threshold=0.5),
max_per_img=100))
img_scales = [(1333, 800), (666, 400), (2000, 1200)]
tta_pipeline = [
dict(type='LoadImageFromFile',
backend_args=None),
dict(
type='TestTimeAug',
transforms=[[
dict(type='Resize', scale=s, keep_ratio=True) for s in img_scales
], [
dict(type='RandomFlip', prob=1.),
dict(type='RandomFlip', prob=0.)
], [
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape',
'img_shape', 'scale_factor', 'flip',
'flip_direction'))
]])]
上記のデータ拡張パイプラインは、まず画像に対して3つのマルチスケーリング変換を行い、次に2つのフリップ変換(フリップとフリップなし)を行います。最後に、PackDetInputsを使用して画像を最終結果にパッケージングします。
参考として、さらに多くのTTAユースケースを以下に示します。
TTAの詳細な使用方法とデータフローについては、MMEngineを参照してください。インスタンスセグメンテーションTTAは後日対応予定です。