ショートカット

標準データセットでの既存モデルのテスト

モデルの精度を評価するには、通常、いくつかの標準データセットでモデルをテストします。データセットの準備については、データセットの準備ガイド を参照してください。

このセクションでは、サポートされているデータセットで既存のモデルをテストする方法を示します。

既存モデルのテスト

既存のモデルを全体のデータセット(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/ディレクトリにダウンロード済みであると仮定します。

  1. RTMDetをテストし、結果を可視化します。次の画像を表示するには、任意のキーを押します。設定ファイルとチェックポイントファイルはこちらにあります。

    python tools/test.py \
        configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
        checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \
        --show
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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ファイルを生成します。

  7. 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_modeltta_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は後日対応予定です。