资讯动态

MMagic 1.x 评估与测试设置迁移指南:从 evaluation/test_cfg 到 val_evaluator/test_evaluator 的完整实战解析

发布时间:2026/10/8 14:23:37 来源:尧图企业网站定制
媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载导读MMagic 1.x 基于 MMEngine 对训练、验证、测试的全套流程进行了重构其中评估与测试设置的改动尤为关键旧的evaluation、test_cfg字段被拆分为val_evaluator与test_evaluator评估间隔interval被移入train_cfg.val_interval模型最优权重的保存逻辑save_best则交由default_hooks.checkpoint统一管理。本文以 docs/zh_cn/migration/eval_test.md 为核心骨架结合仓库中的真实配置与源码实现mmagic/evaluation/evaluator.py、mmagic/engine/runner/multi_loops.py系统讲解从 0.x 到 1.x 评估与测试配置的迁移方法、新旧字段的对应关系以及重建类PSNR/SSIM与生成类FID/IS任务各自需要掌握的关键细节帮助你快速把旧配置迁移到可运行的 1.x 格式。迁移背景评估设置为什么需要重构MMagic 1.x 将评估设置做了两项核心调整这也是迁移时最容易踩坑的地方评估字段被分为val_evaluator和test_evaluatorinterval被移动到train_cfg.val_interval评估指标从test_cfg移至val_evaluator和test_evaluator。此外MMGeneration 1.x 已被合并到 MMagic 中因此原本在 MMGeneration 中使用的生成式评估钩子GenerativeEvalHook也需要一并迁移到新的字段体系下。迁移后的配置统一由 MMEngine 的 Runner、Loop 与 Hook 机制接管语义更清晰val_evaluator/test_evaluator只负责用什么指标评估而什么时候评估以什么循环方式评估分别由train_cfg.val_interval与val_cfg/test_cfg负责。从 test_cfg evaluation 到 val_evaluator test_evaluator重建类任务以超分、去噪、修复等重建类任务为例0.x 时代通常把测试指标写在test_cfg.metrics中把评估间隔、是否保存图像等参数写在独立的evaluation字段中。迁移后的写法如下原评估配置0.x新评估配置1.xpythontrain_cfg None # 训练配置字典变量设为 None test_cfg dict( # 测试配置字典变量 metrics[PSNR], # 测试期间使用的指标 PSNR峰值信噪比 crop_borderscale) # 评估期间裁剪边框evaluation dict( # 构建评估钩子的配置字典变量 interval5000, # 评价间隔 save_imageTrue, # 评估期间保存图像 gpu_collectTrue) # 使用 GPU 收集|python val_evaluator [ dict(typePSNR, crop_borderscale), # 要评估的指标名称 ] test_evaluator val_evaluatortrain_cfg dict( typeIterBasedTrainLoop, max_iters300000, val_interval5000) # 训练循环类型配置 val_cfg dict(typeValLoop) # 验证循环类型的名称 test_cfg dict(typeTestLoop) # 测试循环类型的名称对照这张表可以梳理出四条清晰的迁移规则 1. **指标定义位置改变**test_cfg.metrics 中的指标如 PSNR不再以字符串列表形式出现而是作为 dict(typePSNR, ...) 配置对象放入 val_evaluator / test_evaluator。test_evaluator 通常直接复用 val_evaluator 的取值。 2. **评估间隔改变归属**evaluation.interval 移入 train_cfg.val_interval配合 train_cfg.typeIterBasedTrainLoop 与 max_iters 一起声明训练循环。 3. **循环类型显式化**新增 val_cfg 与 test_cfg 两个字段明确验证与测试阶段运行的 Loop 类型。 4. **旧钩子参数被移除**save_image、gpu_collect 等 evaluation 钩子参数不再由评估配置承载。 ### 指标参数的来源以 PSNR 为例 迁移后 crop_border 直接成为指标构造参数。在 [mmagic/evaluation/metrics/psnr.py](https://link.gitcode.com/i/99ac4c15bd8a7612dfc89d3423f600bb) 中可以看到 PSNR 的完整参数签名 - gt_key真值图像在输出字典中的键默认 gt_img - pred_key预测图像键默认 pred_img - crop_border评估时每边裁剪的像素数默认 0。超分任务中通常设为放大倍率 scale因为边缘像素受 padding 影响较大 - input_order输入是 HWC 还是 CHW默认 CHW - convert_to是否转换颜色空间如计算 Y 通道 PSNR 时设为 Y此时图像按 BGR 顺序处理 - prefix指标名前缀用于区分不同数据集/评估器上的同名指标。 ### 仓库中的真实迁移实例 [configs/basicvsr/basicvsr_2xb4_reds4.py](https://link.gitcode.com/i/f6f4992b73cc20e552e19f8d0b3a675b) 是 1.x 风格的完整示例恰好演示了本文所述的全部字段 python val_evaluator dict( typeEvaluator, metrics[ dict(typePSNR), dict(typeSSIM), ]) train_cfg dict( typeIterBasedTrainLoop, max_iters300_000, val_interval5000) val_cfg dict(typeMultiValLoop)注意这里val_cfg使用的是MultiValLoop而非上表中的ValLoop这是因为 MMagic 的MultiValLoop支持同时评估多个数据集属于重建类任务在 MMagic 中的推荐循环类型。关于循环的细节见下文第四节。生成类任务的评估迁移FID/IS 与 save_best生成类任务GAN、扩散模型等在 0.x 时代通过GenerativeEvalHook完成评估其配置中包含 FID、IS 等生成式指标以及最优权重选择逻辑。MMGeneration 1.x 合并进 MMagic 后这部分配置同样被重构0.x 版本1.x 新版本pythonevaluation dict( typeGenerativeEvalHook, interval10000, metrics[ dict( typeFID, num_images50000, bgr2rgbTrue, inception_argsdict(typeStyleGAN)), dict(typeIS, num_images50000) ], best_metric[fid, is], sample_kwargsdict(sample_modelema))|python val_evaluator dict( typeEvaluator, metrics[ dict( typeFID, prefixFID-Full-50k, fake_nums50000, inception_styleStyleGAN, sample_modelorig), dict( typeIS, prefixIS-50k, fake_nums50000)])设置最佳配置default_hooks dict( checkpointdict( typeCheckpointHook, interval10000, by_epochFalse, less_keys[FID-Full-50k/fid], greater_keys[IS-50k/is], save_optimizerTrue, save_best[FID-Full-50k/fid, IS-50k/is], rule[less, greater])) test_evaluator val_evaluator### 关键参数对应关系 逐项对照旧版与新版的差异 | 0.x 参数 | 1.x 参数 | 说明 | | --- | --- | --- | | interval10000 | train_cfg.val_interval10000 | 评估间隔统一由训练循环管理 | | num_images50000 | fake_nums50000 | 生成样本数量语义更明确 | | bgr2rgbTrue | 由 data_preprocessor 处理 | 颜色顺序转换不再由指标承担而是由 Evaluator 在 prepare_metrics 阶段从 data preprocessor 解析后下发给各指标见第五节源码分析 | | inception_argsdict(typeStyleGAN) | inception_styleStyleGAN | Inception 网络加载风格直接作为参数 | | sample_kwargsdict(sample_modelema) | sample_modelorig | 采样模型从 kwargs 提升为指标自身的参数 | | best_metric[fid, is] | save_best / rule / less_keys / greater_keys | 最优权重保存逻辑全部迁移至 CheckpointHook | save_best 的迁移规则值得单独强调**评估字段不再支持 interval 和 save_best 参数**。interval 移至 train_cfg.val_interval详见[调度设置](https://link.gitcode.com/i/053962c5a6149d1c820cdd8c016faad8)而 save_best 移至 default_hooks.checkpoint.save_best。上面的示例展示了多个最优指标的写法FID 越小越好rulelessIS 越大越好rulegreater因此需要同时给出 less_keys 与 greater_keys 来声明各指标键的方向再用 save_best 列出需要跟踪的完整指标键名含前缀rule 按相同顺序给出对应的大小关系。 ### 从源码理解 sample_model 与 prefix 在 [mmagic/evaluation/metrics/base_gen_metric.py](https://link.gitcode.com/i/3b2925ac34ab914309eadf645d32a49e) 中GenMetric 的构造函数直接接收 fake_nums、real_nums、sample_model支持 orig 与 ema、prefix 等参数GenerativeMetric生成式指标基类在此基础上增加 sample_kwargs 与 need_cond_input。其中 sample_model 决定生成图像时使用原始生成器还是 EMA 平滑后的权重在 StyleGAN 等带 EMA 的模型中会显著影响 FID 数值迁移时务必核对。 prefix 的作用是区分同名指标生成式指标的计算结果键形如 {prefix}/{metric_name}如 FID-Full-50k/fid、IS-50k/is这正是 save_best 中必须写全键名的原因。在 [mmagic/evaluation/evaluator.py](https://link.gitcode.com/i/a430eff50701fc83a0e05501ffd33b8d) 中可以看到Evaluator 汇总结果时会检查指标名冲突若多个指标产生相同键名会直接抛出 ValueError因此为不同指标组设置不同 prefix 是硬性要求。 ### 仓库中的真实生成式评估配置 [configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py](https://link.gitcode.com/i/4acb02b551fbc4e37462c994ac03640f) 展示了 1.x 风格下的 FID 评估配置 python # METRICS metrics [ dict( typeFrechetInceptionDistance, prefixFID-50k, fake_nums50000, real_nums50000, inception_styleStyleGAN, sample_modelema), dict(typePrecisionAndRecall, fake_nums50000, prefixPR-50K), dict(typePerceptualPathLength, fake_nums50000, prefixppl-w) ] default_hooks dict(checkpointdict(save_bestFID-50k/fid)) val_evaluator dict(metricsmetrics) test_evaluator dict(metricsmetrics)FrechetInceptionDistance的实现位于 mmagic/evaluation/metrics/fid.py其构造参数还包括real_nums真实图像数量-1表示使用数据集全部图像、inception_path预训练 Inception 权重路径、inception_pkl预计算的参考分布 pickle可避免每次评估重复计算真实分布统计量等。此外该指标注册了FID与FID-Full两个别名旧配置中的typeFID依旧可用。另外在 configs/base/default_runtime.py 中可以观察到save_best在重建类任务中的默认形态checkpointdict(typeCheckpointHook, interval5000, out_dirsave_dir, by_epochFalse, max_keep_ckpts10, save_bestPSNR, rulegreater)即默认按 PSNR 越大越好保存最优 checkpoint。通过 val_cfg / test_cfg 指定专用循环迁移到 1.x 后验证与测试不再由钩子驱动而是由 Runner 中的 Loop 对象驱动。为了正确评估和测试模型我们需要在val_cfg和test_cfg中设置特定的循环。以基于迭代训练的静态模型为例0.x 版本中的静态模型1.x 版本中的静态模型pythontotal_iters 1000000runner dict( typeDynamicIterBasedRunner, is_dynamic_ddpFalse, pass_training_statusTrue)|python train_cfg dict( by_epochFalse, # 使用基于迭代的训练 max_iters1000000, # 最大训练迭代次数 val_begin1, val_interval10000) # 评价间隔 val_cfg dict(typeMultiValLoop) # 验证中的特定循环 test_cfg dict(typeMultiTestLoop) # 测试中的特定循环迁移要点 - 0.x 的 runnerDynamicIterBasedRunner整体被 1.x 的 train_cfg/val_cfg/test_cfg 三件套取代 - total_iters 变为 train_cfg.max_iters配合 by_epochFalse 声明迭代式训练 - 新增 val_begin从第几次迭代开始验证与 val_interval验证间隔控制验证时机 - 生成式模型推荐使用 MultiValLoop / MultiTestLoop而不是 MMEngine 默认的 ValLoop / TestLoop。 ### MultiValLoop / MultiTestLoop 源码解析 MultiValLoop 与 MultiTestLoop 的实现位于 [mmagic/engine/runner/multi_loops.py](https://link.gitcode.com/i/0be1b4b7ca8ff9ee96bdca7e13190dfe)。从类注释[multi_loops.py#L19-L77](https://link.gitcode.com/i/0be1b4b7ca8ff9ee96bdca7e13190dfe#L19-L77)可以看到它们支持两类评估场景 - **场景一单一数据集上的多个指标**例如在 DIV2K 上同时计算 PSNR 与 SSIMval_evaluator 写成单个 dict内部 metrics 为指标列表 - **场景二不同数据集上的不同指标**例如在 DIV2K 上算 SSIM、在 Set5 上同时算 PSNR 和 SSIM。此时 val_evaluator 与 val_dataloader 都必须写成**列表**且每个指标组必须设置不同的 prefix否则评估结果汇总时会发生键名冲突[multi_loops.py#L240-L244](https://link.gitcode.com/i/0be1b4b7ca8ff9ee96bdca7e13190dfe#L240-L244) 会抛出 ValueError。 两个 Loop 的 run() 流程高度一致[multi_loops.py#L167-L248](https://link.gitcode.com/i/0be1b4b7ca8ff9ee96bdca7e13190dfe#L167-L248) 1. 对每个 evaluator 调用 prepare_metrics(module, dataloader)让指标预先计算真实图像的统计量如 FID 的 Inception 特征均值/协方差 2. 调用 prepare_samplers(module, dataloader) 按采样模式分组并构建共享采样器 3. 遍历采样器生成/取回图像通过 run_iter 调用模型的 val_step/test_step 并将输出送入对应指标run_iter 中支持 fp16 的 autocast 4. 调用 evaluator.evaluate() 汇总所有指标并写入 multi_metric最终通过 after_val_epoch/after_test_epoch 钩子输出。 正是由于生成式指标的输入差异FID 需要随机噪声生成图像、PPL 需要沿隐空间路径采集成对图像、PSNR 需要真实低分辨率输入MMagic 才需要 MultiValLoop 这种为每组指标定制采样器的循环结构这也是迁移时不能沿用默认 ValLoop 的根本原因。 ## Evaluator 源码级原理生成式评估如何工作 迁移后的 val_evaluator/test_evaluator 在 MMagic 中统一由 [mmagic/evaluation/evaluator.py](https://link.gitcode.com/i/87f6b6dfb92d8144ca20657e0e64a8fd) 中注册的 Evaluator 类构建。它继承自 MMEngine 的 Evaluator并针对生成式任务补充了两个关键方法 - prepare_metrics(module, dataloader)[evaluator.py#L53-L80](https://link.gitcode.com/i/87f6b6dfb92d8144ca20657e0e64a8fd#L53-L80)评估开始前从模型的 data preprocessor 解析输出颜色顺序并设置给各指标再把 dataloader 传给指标做预计算例如 FID 预计算真实图像特征。执行完成后 is_ready 置为 True重复调用直接返回避免重复计算。 - prepare_samplers(module, dataloader)[evaluator.py#L97-L135](https://link.gitcode.com/i/87f6b6dfb92d8144ca20657e0e64a8fd#L97-L135)依据每个指标的 SAMPLER_MODE 与 sample_model 计算哈希值_cal_metric_hash将采样模式相同的指标分组并为每组构建一个共享采样器。这正是前面提到的 FID/IS 共用随机噪声采样、PPL 独占成对采样路径的实现基础。 SAMPLER_MODE 定义在指标基类中GenMetric 的 SAMPLER_MODE normal直接复用真实数据 dataloader见 [base_gen_metric.py#L145-L175](https://link.gitcode.com/i/b4a491b6a53aed69552b514ae1aac33b)而 GenerativeMetric 的 SAMPLER_MODE Generative返回一个 dummy_iterator每次迭代产出 dict(inputsdict(sample_model..., num_batches..., sample_kwargs...)) 驱动模型生成图像见 [base_gen_metric.py#L253-L328](https://link.gitcode.com/i/33d336349172e4bcd74af745ca246fe1)。因此 - PSNR、SSIM 等重建类指标属于 normal 模式直接消费 val_dataloader 的真实数据 - FID、IS、PPL 等生成式指标属于 Generative 模式通过 dummy_iterator 批量生成假图像并按 fake_nums_per_device 在分布式环境下自动切分每个 rank 需要生成的图像数量[base_gen_metric.py#L68-L71](https://link.gitcode.com/i/700fa35bffcb97cb49542547b39140e9)。 ## 迁移核对清单 完成配置迁移后建议按以下清单逐项检查 1. **指标位置**所有指标已从 test_cfg.metrics / evaluation.metrics 移入 val_evaluator / test_evaluator且 test_evaluator 已正确赋值可直接复用 val_evaluator 2. **评估时机**interval 已移入 train_cfg.val_interval并确认 train_cfg 中声明了正确的 typeIterBasedTrainLoop 或 EpochBasedTrainLoop与 max_iters 3. **循环类型**val_cfg / test_cfg 已设置为 MultiValLoop / MultiTestLoop重建类任务同样适用生成式任务切勿沿用默认 ValLoop 4. **最优权重保存**save_best 已迁移至 default_hooks.checkpoint.save_best多指标场景同时配置 rule 与 less_keys / greater_keys指标键名需写全 prefix/metric 形式 5. **生成式指标参数**num_images → fake_nums、inception_args → inception_style、bgr2rgb 已交由 data preprocessor 处理、sample_model 已作为指标直接参数确认无误 6. **多数据集场景**若 val_evaluator 为列表多数据集评估每个指标组必须设置不同的 prefix且 val_dataloader 也需按相同顺序写成列表。 对照 [docs/zh_cn/migration/eval_test.md](https://link.gitcode.com/i/f7b56d083442764606fb337575ed528b) 中的三张新旧对照表完成上述检查后即可将 0.x / MMGeneration 1.x 的评估测试配置平滑迁移至 MMagic 1.x并通过 [tools/train.py](https://link.gitcode.com/i/937b71d7adb01b0ad92f2f5829d1092b) 与 [tools/test.py](https://link.gitcode.com/i/97db38186adedfe47193069cc00540d5) 直接运行验证。赞分享媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载相关推荐MMagic 1.x 评估与测试配置迁移指南val_evaluator / test_evaluator 与训练循环解耦实践MMagic 1.x 评估与测试配置迁移指南val_evaluator / test_evaluator 与训练循环解耦实践 本文是 MMagicOpenM媒体生成计算机视觉深度学习人工智能大模型MMagic 1.x 模型迁移指南从 pretrained 字段到 train_cfg / test_cfg / data_preprocessor 的重构解读MMagic 1.x 模型迁移指南从 pretrained 字段到 train_cfg / test_cfg / data_preprocessor 的重构解媒体生成计算机视觉深度学习人工智能大模型MMagic 1.x 运行设置迁移指南default_hooks、resume 与 env_cfg 完全解析MMagic 1.x 运行设置迁移指南default_hooks、resume 与 env_cfg 完全解析 本文是 MMagicOpenMMLab 多模态媒体生成计算机视觉深度学习人工智能大模型上一篇Agent-Reach Twitter 高级功能配置指南twitter-cli 安装、Cookie 认证与多后端路由实战下一篇Spinnaker Deck 的 Oracle 提供商包spinnaker/oracle从变更日志解读版本演进与实现细节创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑