在标准数据集上测试现有模型¶
为了评估模型的准确性,通常需要在一些标准数据集上测试模型,请参考 数据集准备指南 来准备数据集。
本节将展示如何在支持的数据集上测试现有模型。
测试现有模型¶
我们提供了测试脚本,用于在整个数据集(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/
目录中。
测试 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
此命令将生成两个 JSON 文件:
./work_dirs/coco_instance/test.bbox.json
和./work_dirs/coco_instance/test.segm.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/
目录中,我们可以使用以下命令在 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_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。