快捷键

在标准数据集上测试现有模型

为了评估模型的准确性,通常需要在一些标准数据集上测试模型,请参考 数据集准备指南 来准备数据集。

本节将展示如何在支持的数据集上测试现有模型。

测试现有模型

我们提供了测试脚本,用于在整个数据集(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 的 启动工具.

可选参数

  • RESULT_FILE: 输出结果的 pickle 格式文件名。如果未指定,则结果不会保存到文件。

  • --show: 如果指定,检测结果将被绘制在图像上并在新窗口中显示。它只适用于单 GPU 测试,用于调试和可视化。请确保您的环境中可以使用 GUI。否则,您可能会遇到像 cannot connect to X server 这样的错误。

  • --show-dir: 如果指定,检测结果将被绘制在图像上并保存到指定的目录。它只适用于单 GPU 测试,用于调试和可视化。使用此选项时,您的环境中不需要使用 GUI。

  • --work-dir: 如果指定,包含评估指标的检测结果将保存到指定的目录。

  • --cfg-options: 如果指定,键值对可选配置将合并到配置文件中。

示例

假设您已将检查点下载到 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
    

    此命令将生成两个 JSON 文件:./work_dirs/coco_instance/test.bbox.json./work_dirs/coco_instance/test.segm.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/ 目录中,我们可以使用以下命令在 COCO test-dev 上使用 8 个 GPU 测试 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

此命令将生成两个 JSON 文件:./work_dirs/coco_instance/test.bbox.json./work_dirs/coco_instance/test.segm.json

批量推理

MMDetection 支持在测试模式下使用单个图像或批量图像进行推理。默认情况下,我们使用单图像推理,您可以通过修改测试数据的配置中的 samples_per_gpu 来使用批量推理。您可以通过以下方法修改配置:

data = dict(train_dataloader=dict(...), val_dataloader=dict(...), test_dataloader=dict(batch_size=2, ...))

或者您可以通过 --cfg-options 设置它,例如 --cfg-options test_dataloader.batch_size=2

测试时增强(TTA)

测试时增强(TTA)是在测试阶段使用的一种数据增强策略。它对同一图像应用不同的增强,例如翻转和缩放,以进行模型推理,然后将每个增强图像的预测合并起来,以获得更准确的预测。为了方便用户使用 TTA,MMEngine 提供了 BaseTTAModel 类,允许用户通过简单地扩展 BaseTTAModel 类来实现不同的 TTA 策略,以满足他们的需求。

在 MMDetection 中,我们提供了 DetTTAModel 类,它继承自 BaseTTAModel。

用例

使用 TTA 需要两个步骤。首先,您需要在配置文件中添加 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。