原文链接Tutorial 1: Inference with existing models — mmflow documentation
教程1:用现有的模型推理(预测)
MMFlow在“模型园”Model Zoo(Model Zoo Statistics — mmflow documentation)中提供了预训练模型可以用于估计光流,并且支持多个标准数据集,包括FlyingChairs和Sintel等。这个笔记将展示如何在标准数据集上利用现有的预训练模型执行一些公共的任务,具体包括“
*使用现有模型对给定的图像进行光流的推理(预测)
*在标准数据集上测试现有模型
对给定图像进行推理/预测
MMFlow提供了高级Python API用于推理图像。下面是一个对给定图像构建模型并推理的例子:
from mmflow.apis import init_model, inference_model
from mmflow.datasets import visualize_flow, write_flow
import mmcv
# 指定配置文件和预训练模型参数文件的路径
config_file = 'configs/pwcnet/pwcnet_8x1_slong_flyingchairs_384x448.py'
checkpoint_file = 'checkpoints/pwcnet_8x1_slong_flyingchairs_384x448.pth'
# 根据配置文件和预训练参数构建模型
model = init_model(config_file, checkpoint_file, device='cuda:0')
# 测试图像对并保存结果
img1='demo/frame_0001.png'
img2='demo/frame_0002.png'
result = inference_model(model, img1, img2)
# 保存光流文件
write_flow(result, flow_file='flow.flo')
# 保存可视化图
flow_map = visualize_flow(result, save_file='flow_map.png')
在demo/image_demp.py中有一个示例。
##这里插播一下:将光流的.flo文件转为tiff的代码网上有很多,我自己的博客可参考将.flo文件转tiff_IcarusXinchen的博客-CSDN博客##
在标准数据集上评价现有的模型
测试现有的模型
我们提供了测试脚本用于在整个数据集上评估一个现有的模型。支持的测试环境如下:
单GPU
CPU
单节点多GPU
多节点
根据测试环境选择合适的脚本进行测试。
# 单GPU测试
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--eval ${EVAL_METRICS}] \
[--out-dir ${OUTPUT_DIRECTORY}] \
[--show-dir ${VISUALIZATION_DIRECTORY}]
# CPU:禁用GPU并运行单GPU测试脚本(就是上面那个=_=)
export CUDA_VISIBLE_DEVICES=-1
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--eval ${EVAL_METRICS}] \
[--show]
# 多GPU测试(=_=没有钱啊)
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
[--eval ${EVAL_METRICS}] \
[--out-dir ${OUTPUT_DIRECTORY}]
tools/dist_test.sh也支持多节点测试,但是依赖于Pytorch的启动工具Distributed communication package - torch.distributed — PyTorch 1.13 documentation
Slurm Workload Manager - Documentation Slurm是一个用于计算集群的优秀的任务调度系统。在Slurm管理的集群上,你可以使用slurm_test.sh来分发测试任务,支持单节点和多节点测试。
[GPUS=${GPUS}] ./tools/slurm_test.sh ${PARTITION} ${JOB_NAME} \
${CONFIG_FILE} ${CHECKPOINT_FILE} \
[--eval ${EVAL_METRICS}] \
[--out-dir ${OUTPUT_DIRECTORY}]
可选参数:
-
--eval
: 评价准则,例如 端点误差, “EPE”. -
--fuse-conv-bn
: 是否融合卷积和batch normalization, 会轻微加速推理速度. -
--out-dir
: 给定的话,预测的光流将保存在这里. -
--show-dir
: 给定的话,可视化的光流将保存在这里. -
--cfg-options
: 给定的话,给定的键值对将被添加到配置文件中,例如 ‘–cfg-option model.encoder.in_channels=6’.
下面是多GPU测试的可选参数:
-
--gpu_collect
: 给定的话,识别结果将通过gpu间的通讯来收集。否则,它将在不同的gpu上保存到临时目录,然后由等级0的设备收集; -
--tmpdir
: 用于收集结果的临时目录,--gpu_collect
没有被给定是才有用; -
--launcher
: 分布式任务初始化启动器的项. 可选的有none
,pytorch
,slurm
,mpi
. 设为None时,将不会在分布式模式下测试; -
--local_rank
: 本地等级的ID. 不指定默认为0.
例子:
假定你已经下载了预训练参数文件到 checkpoints/目录,然后在Sintel clean和final sub-datasets数据集上测试PWC-Net,不保存预测的光流文件并且评估EPE。
python tools/test.py configs/pwc_net_8x1_sfine_sintel_384x768.py \
checkpoints/pwcnet_8x1_sfine_sintel_384x768.pth --eval EPE
我们推荐在评价模型时使用单GPU并且batch_size设为1,必须确保数据集样本数量可以被batch_size整除,所以即使在slurm上测试,我们还是使用单GPU测试。假定用户名是Test,任务名是test_pwc,则有如下例子:
GPUS=1 GPUS_PER_NODE=1 CPUS_PER_TASK=2 ./tools/slurm_test.sh Test test_pwc \
configs/pwc_net_8x1_sfine_sintel_384x768.py \
checkpoints/pwcnet_8x1_sfine_sintel_384x768.pth --eval EPE