Shortcuts

模型评测

模型评测过程会分别在 ValLoopTestLoop 中被执行,用户可以在训练期间或使用配置文件中简单设置的测试脚本进行模型性能评估。ValLoopTestLoop 属于 Runner,它们会在第一次被调用时构建。由于 dataloaderevaluator 是必需的参数,所以要成功构建 ValLoop,在构建 Runner 时必须设置 val_dataloaderval_evaluatorTestLoop 亦然。有关 Runner 设计的更多信息,请参阅 MMEngine文档

测试/验证 数据流

在 MMSegmentation 中,默认情况下,我们将 dataloader 和 metrics 的设置写在数据集配置文件中,并将 evaluation loop 的配置写在 schedule_x 配置文件中。

例如,在 ADE20K 配置文件 configs/_base_/dataset/ADE20K.py 中,在第37到48行,我们配置了 val_dataloader,在第51行,我们选择 IoUMetric 作为 evaluator,并设置 mIoU 作为指标:

val_dataloader = dict(
    batch_size=1,
    num_workers=4,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        data_prefix=dict(
            img_path='images/validation',
            seg_map_path='annotations/validation'),
        pipeline=test_pipeline))

val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'])

为了能够在训练期间进行评估模型,我们将评估配置添加到了 configs/schedules/schedule_40k.py 文件的第15至16行:

train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000)
val_cfg = dict(type='ValLoop')

使用以上两种设置,MMSegmentation 在 40K 迭代训练期间,每 4000 次迭代进行一次模型 mIoU 指标的评估。

如果我们希望在训练后测试模型,则需要将 test_dataloadertest_evaluatortest_cfg 配置添加到配置文件中。

test_dataloader = dict(
    batch_size=1,
    num_workers=4,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        data_prefix=dict(
            img_path='images/validation',
            seg_map_path='annotations/validation'),
        pipeline=test_pipeline))

test_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'])
test_cfg = dict(type='TestLoop')

在 MMSegmentation 中,默认情况下,test_dataloadertest_evaluator 的设置与 ValLoop 的 dataloader 和 evaluator 相同,我们可以修改这些设置以满足我们的需要。

IoUMetric

MMSegmentation 基于 MMEngine 提供的 BaseMetric 实现 IoUMetricCityscapesMetric,以评估模型的性能。有关统一评估接口的更多详细信息,请参阅文档

这里我们简要介绍 IoUMetric 的参数和两种主要方法。

除了 collect_deviceprefix 之外,IoUMetric 的构建还包含一些其他参数。

构造函数的参数:

  • ignore_index(int)- 将在评估中忽略的类别索引。默认值:255。

  • iou_metrics(list[str] | str)- 需要计算的指标,可选项包括 ‘mIoU’、’mDice’ 和 ‘mFscore’。

  • nan_to_num(int,可选)- 如果指定,NaN 值将被用户定义的数字替换。默认值:None。

  • beta(int)- 决定综合评分中 recall 的权重。默认值:1。

  • collect_device(str)- 用于在分布式训练期间从不同进程收集结果的设备名称。必须是 ‘cpu’ 或 ‘gpu’。默认为 ‘cpu’。

  • prefix(str,可选)- 将添加到指标名称中的前缀,以消除不同 evaluator 的同名指标的歧义。如果参数中未提供前缀,则将使用 self.default_prefix 进行替代。默认为 None。

IoUMetric 实现 IoU 指标的计算,IoUMetric 的两个核心方法是 processcompute_metrics

  • process 方法处理一批 data 和 data_samples。

  • compute_metrics 方法根据处理的结果计算指标。

IoUMetric.process

参数:

  • data_batch(Any)- 来自 dataloader 的一批数据。

  • data_samples(Sequence[dict])- 模型的一批输出。

返回值:

此方法没有返回值,因为处理的结果将存储在 self.results 中,以在处理完所有批次后进行指标的计算。

IoUMetric.compute_metrics

参数:

  • results(list)- 每个批次的处理结果。

返回值:

  • Dict[str,float] - 计算的指标。指标的名称为 key,值是相应的结果。key 主要包括 aAccmIoUmAccmDicemFscoremPrecisionmPrecall

CityscapesMetric

CityscapesMetric 使用由 Cityscapes 官方提供的 CityscapesScripts 进行模型性能的评估。

使用方法

在使用之前,请先安装 cityscapesscripts 包:

pip install cityscapesscripts

由于 IoUMetric 在 MMSegmentation 中作为默认的 evaluator 使用,如果您想使用 CityscapesMetric,则需要自定义配置文件。在自定义配置文件中,应按如下方式替换默认 evaluator。

val_evaluator = dict(type='CityscapesMetric', output_dir='tmp')
test_evaluator = val_evaluator

接口

构造函数的参数:

  • output_dir (str) - 预测结果输出的路径

  • ignore_index (int) - 将在评估中忽略的类别索引。默认值:255。

  • format_only (bool) - 只为提交进行结果格式化而不进行评估。当您希望将结果格式化为特定格式并将其提交给测试服务器时有用。默认为 False。

  • keep_results (bool) - 是否保留结果。当 format_only 为 True 时,keep_results 必须为 True。默认为 False。

  • collect_device (str) - 用于在分布式训练期间从不同进程收集结果的设备名称。必须是 ‘cpu’ 或 ‘gpu’。默认为 ‘cpu’。

  • prefix (str,可选) - 将添加到指标名称中的前缀,以消除不同 evaluator 的同名指标的歧义。如果参数中未提供前缀,则将使用 self.default_prefix 进行替代。默认为 None。

CityscapesMetric.process

该方法将在图像上绘制 mask,并将绘制的图像保存到 work_dir 中。

参数:

  • data_batch(dict)- 来自 dataloader 的一批数据。

  • data_samples(Sequence[dict])- 模型的一批输出。

返回值:

此方法没有返回值,因为处理的结果将存储在 self.results 中,以在处理完所有批次后进行指标的计算。

CityscapesMetric.compute_metrics

此方法将调用 cityscapessscripts.evaluation.evalPixelLevelSemanticLabeling 工具来计算指标。

参数:

  • results(list)- 数据集的测试结果。

返回值:

  • dict[str:float] - Cityscapes 评测结果。