# 测试

此文档介绍在数据集上测试预训练模型的方法。

## 使用单 GPU 进行测试

您可以使用 `tools/test.py` 执行单 CPU/GPU 推理。例如，要在 IC15 上评估 DBNet: ( 可以从 [Model Zoo](../../README_zh-CN.md#模型库) 下载预训练模型 )：

```shell
./tools/dist_test.sh configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597.pth --eval hmean-iou
```

下面是脚本的完整用法:

```shell
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [ARGS]
```

````{note}
默认情况下，MMOCR 更偏向于使用 GPU 而非 CPU。如果您想在 CPU 上测试模型，请清空 `CUDA_VISIBLE_DEVICES` 或者将其设置为 -1 以使 GPU(s) 对程序不可见。需要注意的是，运行 CPU 测试需要 **MMCV >= 1.4.4**。

```bash
CUDA_VISIBLE_DEVICES= python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [ARGS]
```

````

| 参数               | 类型                              | 描述                                                                                                                                                  |
| ------------------ | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--out`            | str                               | 以 pickle 格式输出结果文件。                                                                                                                          |
| `--fuse-conv-bn`   | bool                              | 所选 det 模型的自定义配置的路径。                                                                                                                     |
| `--format-only`    | bool                              | 格式化输出结果文件而不执行评估。 当您想将结果格式化为特定格式并将它们提交到测试服务器时，它很有用。                                                   |
| `--gpu-id`         | int                               | 要使用的 GPU ID。仅适用于非分布式训练。                                                                                                               |
| `--eval`           | 'hmean-ic13', 'hmean-iou', 'acc'  | 不同的任务使用不同的评估指标。对于文本检测任务，指标是 'hmean-ic13' 或者 'hmean-iou'。对于文本识别任务，指标是 'acc'。                                |
| `--show`           | bool                              | 是否显示结果。                                                                                                                                        |
| `--show-dir`       | str                               | 将用于保存输出图像的目录。                                                                                                                            |
| `--show-score-thr` | float                             | 分数阈值 (默认值: 0.3)。                                                                                                                              |
| `--gpu-collect`    | bool                              | 是否使用 gpu 收集结果。                                                                                                                               |
| `--tmpdir`         | str                               | 用于从多个 workers 收集结果的 tmp 目录，在未指定 gpu-collect 时可用。                                                                                 |
| `--cfg-options`    | str                               | 覆盖使用的配置中的一些设置，xxx=yyy 格式的键值对将被合并到配置文件中。如果要覆盖的值是一个列表，它应当是 key ="\[a,b\]" 或者 key=a,b 的形式。该参数还允许嵌套列表/元组值，例如 key="\[(a,b),(c,d)\]"。请注意，引号是必需的，并且不允许使用空格。 |
| `--eval-options`   | str                               | 用于评估的自定义选项，xxx=yyy 格式的键值对将是 dataset.evaluate() 函数的 kwargs。                                                                     |
| `--launcher`       | 'none', 'pytorch', 'slurm', 'mpi' | 工作启动器的选项。                                                                                                                                    |

## 使用多 GPU 进行测试

MMOCR 使用 `MMDistributedDataParallel` 实现 **分布式**测试。

您可以使用以下命令测试具有多个 GPU 的数据集。

```shell
[PORT={PORT}] ./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [PY_ARGS]
```

| 参数      | 类型 | 描述                                           |
| --------- | ---- | ---------------------------------------------- |
| `PORT`    | int  | rank 为 0 的机器将使用的主端口。默认为 29500。 |
| `PY_ARGS` | str  | 由 `tools/test.py` 解析的参数。                |

例如，

```shell
./tools/dist_test.sh configs/example_config.py work_dirs/example_exp/example_model_20200202.pth 1 --eval hmean-iou
```

## 使用 Slurm 进行测试

如果您在使用 [Slurm](https://slurm.schedmd.com/) 管理的集群上运行 MMOCR， 则可以使用脚本 `tools/slurm_test.sh`。

```shell
[GPUS=${GPUS}] [GPUS_PER_NODE=${GPUS_PER_NODE}] [SRUN_ARGS=${SRUN_ARGS}] ./tools/slurm_test.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${CHECKPOINT_FILE} [PY_ARGS]
```

| 参数            | 类型 | 描述                                                                             |
| --------------- | ---- | -------------------------------------------------------------------------------- |
| `GPUS`          | int  | 此任务要使用的 GPU 数量。默认为 8。                                              |
| `GPUS_PER_NODE` | int  | 每个节点要分配的 GPU 数量。默认为 8。                                            |
| `SRUN_ARGS`     | str  | srun 解析的参数。可以在[此处](https://slurm.schedmd.com/srun.html)找到可用选项。 |
| `PY_ARGS`       | str  | 由 `tools/test.py` 解析的参数。                                                  |

下面是一个在 "dev" 分区上运行任务的示例。该任务名为 "test_job"，其调用了 8 个 GPU 对示例模型进行评估 。

```shell
GPUS=8 ./tools/slurm_test.sh dev test_job configs/example_config.py work_dirs/example_exp/example_model_20200202.pth --eval hmean-iou
```

## 批量测试

默认情况下，MMOCR 仅对逐张图像进行测试。为了令推理更快，您可以在配置中更改
`data.val_dataloader.samples_per_gpu` 和 `data.test_dataloader.samples_per_gpu` 字段。

例如，

```
data = dict(
    ...
    val_dataloader=dict(samples_per_gpu=16),
    test_dataloader=dict(samples_per_gpu=16),
    ...
)
```

将使用 16 张图像作为一个批大小测试模型。

```{warning}
批量测试时数据预处理管道的行为会有所变化，因而可能导致模型的性能下降。
```
