news 2026/9/30 2:19:36

waifu2x 基准测试指南:用 tools/benchmark.lua 复现 PSNR 与耗时评测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
waifu2x 基准测试指南:用 tools/benchmark.lua 复现 PSNR 与耗时评测
  • 计算机视觉
  • 深度学习

【免费下载链接】waifu2x

Image Super-Resolution for Anime-Style Art

项目地址:https://gitcode.com/gh_mirrors/waifu/waifu2x
点击查看免费下载

本文围绕 waifu2x 仓库自带的基准测试文档(appendix/benchmark.md)展开,系统讲解其评测方法论、测试命令、photo/art 两套模型的 PSNR 与耗时数据,以及 TTA(测试时增强)带来的精度收益。读完本文,你将掌握如何用tools/benchmark.lua复现官方数据、理解 PSNR 的“MATLAB 兼容”计算细节,并能针对自己的数据集跑出一份可对比、可引用的评测报告。

为什么需要一套专门的基准测试

waifu2x 提供了多套预训练模型(vgg_7、upconv_7、upconv_7l、resnet_14l、cunet 等),分别面向照片(photo)与动漫插画(art)两类图像。模型优劣不能靠肉眼观察,必须用统一的评测脚本在同一批测试图像上计算量化指标与运行耗时,才能公平比较。仓库为此提供了:

  • 评测主程序 tools/benchmark.lua:加载模型、构造降采样输入、计算 PSNR/RMSE、统计耗时、可选保存结果图片与评测报告;
  • 一键脚本 appendix/benchmark.sh:封装 photo/art 两套完整评测流程,覆盖多个模型与多种下采样滤波器;
  • 数据生成工具 tools/make_benchmark_input.lua:用于生成低分辨率/高分辨率测试图像对。

官方评测结果集中记录在 appendix/benchmark.md,本文将以该文档为核心逐项解读,并结合源码说明数据是如何算出来的。

评测方法论:PSNR 是怎么算的

MATLAB rgb2ycbcr 兼容的亮度转换

文档明确指出,本基准的 PSNR 使用一个与 MATLABrgb2ycbcr兼容的函数进行灰度转换,动态范围为[16, 235]而非 [0, 255],并坦言“这并非严格意义上的 PSNR,但许多论文使用该指标”。这是对比外部论文数据时必须注意的前提。

对应实现位于 tools/benchmark.lua 的rgb2y_matlab函数:

local function rgb2y_matlab(x) local y = torch.Tensor(1, x:size(2), x:size(3)):zero() x = iproc.byte2float(x) y:add(x[1] * 65.481) y:add(x[2] * 128.553) y:add(x[3] * 24.966) y:add(16.0) return y:byte():float() end

系数 65.481 / 128.553 / 24.966 加常数 16 正是 BT.601 标准的 Y 分量公式,与 MATLABrgb2ycbcr一致;随后转回 byte 类型,等效于把亮度钳位到 [16, 235] 区间再参与误差计算。

PSNR 计算与-range_bug选项

在YMSE(Y 通道均方误差)中,-range_bug决定走哪条分支:

if opt.range_bug == 1 then local x1_2 = rgb2y_matlab(x1) -- MATLAB 兼容(动态范围 16~235) local x2_2 = rgb2y_matlab(x2) return (x1_2 - x2_2):pow(2):mean() else local x1_2 = image.rgb2y(x1):mul(255.0) -- 常规 0~255 动态范围 ...

当-range_bug 1时,由于亮度值被压缩到 [16, 235],像素间差值偏小,测得的 MSE 偏低、PSNR 偏高,这就是文档所称的 “dynamic range bug” 的来源——官方基准刻意复现了这一“缺陷”以便与论文数据对齐。

最终 PSNR 由PSNR/MSE2PSNR计算,注意 MSE 被math.max(mse, 1)钳制在 1 以上,防止除零:

local function PSNR(x1, x2, color) local mse = math.max(MSE(x1, x2, color), 1) return 10 * math.log10((255.0 * 255.0) / mse) end

-color选项(rgb|y|r|g|b)控制指标计算的通道:y走上述 Y 通道流程,r/g/b只取单通道,rgb则对三通道整体求 MSE。官方 photo 与 art 评测统一使用-color y。

评测主程序 tools/benchmark.lua 全参数解读

官方文档给出的 photo 评测命令为:

th tools/benchmark.lua -dir <dataset_dir> -model1_dir <model_dir> -method scale -filter Catrom -color y -range_bug 1 -tta <0|1> -force_cudnn 1

其中各参数在源码中有明确默认值与含义,完整清单如下(摘自 tools/benchmark.lua 的torch.CmdLine定义):

参数默认值说明
-dir./data/test测试图像目录
-file""测试图像文件列表(一行一个路径),与-dir二选一
-model1_dir./models/anime_style_art_rgb第一个模型的目录,内部需包含scale2.0x_model.t7(scale 方法)或noiseN_model.t7(noise 方法)等模型文件
-model2_dir""可选,第二个模型目录,用于双模型对比
-methodscale评测方法:scale(2x 放大)、noise、noise_scale、user(自定义输入输出对)、diff、scale4(4x 放大)
-filterCatrom生成低分辨率输入时使用的下采样滤波器:Box、Lanczos、Catrom(Bicubic)
-resize_blur1.0缩放时的模糊参数,传给iproc.scale
-coloryPSNR 计算通道:rgb、y、r、g、b
-noise_level1噪声模型等级(配合noise/noise_scale方法)
-jpeg_quality75JPEG 压缩质量(noise 相关方法构造退化输入时用)
-jpeg_times1JPEG 压缩次数
-jpeg_quality_down5每次压缩递减的质量值
-range_bug0是否复现 MATLABrgb2ycbcr动态范围 bug(1|0)
-save_image0是否保存转换后的结果图片
-save_baseline_image0是否保存基线(插值放大)结果图片
-output_dir./输出目录(结果图片与评测报告)
-show_progress1是否显示进度条
-baseline_filterCatrom基线插值放大使用的滤波器(Box|Lanczos|Catrom(Bicubic))
-save_info0是否把分数与参数写入benchmark.txt
-save_all0等价于同时开启-save_info、-save_image、-save_baseline_image
-thread-1CPU 线程数,大于 0 时调用torch.setnumthreads
-tta0是否启用 TTA(0|1)
-tta_level8TTA 等级(2|4|8),值越大质量越好但越慢
-crop_size256每次送入网络的分块大小(patch size),显存不足时调小
-batch_size1批大小
-force_cudnn0是否使用 cuDNN 后端(0|1)
-yuv4200是否使用 yuv420 采样 JPEG(noise 退化用)
-name""user 方法下的模型名(对应{name}_model.t7)
-x_dir/-y_dir""user 方法的输入/真值图像目录,两目录文件名必须一致
-x_file/-y_file""user 方法的输入/真值文件列表
-border0计算指标前从边缘裁掉的像素数(去除边界效应)
-metric""自定义指标(目前支持jaccard)

两个与性能强相关的选项值得说明:

  • -force_cudnn 1:模型加载时通过cudnn.convert把 cunn 模型转换为 cuDNN 后端(见 lib/w2nn.lua 的w2nn.load_model)。源码中还在首张图前显式执行一次前向作为 cuDNN benchmark 预热(if opt.force_cudnn and i == 1 then分支),避免把自动调优时间计入评测耗时;
  • -tta 1:启用 TTA 后,benchmark函数会把scale_f/image_f替换为 lib/reconstruct.lua 中的reconstruct.scale_tta/reconstruct.image_tta,输出变为 8 个几何变换结果的均值。

scale 方法的评测流程(源码视角)

-method scale分支的执行逻辑:

  1. 对每张真值图x[i].y先执行transform_scale:用-filter指定滤波器把图像缩小一半(宽高乘 0.5),得到低分辨率输入input;
  2. 用scale_f(model1, 2.0, input, ...)让模型把输入放大 2 倍,得到model1_output;
  3. 用baseline_scale(默认 Catrom 插值)把输入放大 2 倍,作为基线输出baseline_output;
  4. 三者均与原始真值图计算 PSNR(-color y时只比较亮度),并分别累计model1_time与基线/模型的 RMSE、PSNR。

也就是说,官方“2x PSNR”表的语义是:先用指定滤波器把原图降采样到一半,再用模型或插值放大回原尺寸,比较与原始图像的误差。这也是文档中 art 表以 “Filter/Model” 为行维度的原因——不同的下采样滤波器会显著影响重建难度与最终分数。

数据加载时,源码还会对每张图执行iproc.crop_mod4,把宽高裁剪到 4 的整数倍,以保证后续分块与上采样尺寸对齐(见load_data_from_dir)。

Photo 基准:数据集与结果解读

数据集与模型训练背景

文档说明 photo 模型是在kou 的照片集与ukbench的混合数据集上训练的(对应训练脚本见 appendix/train_upconv_7_photo.sh,其中使用-style photo -data_dir ./data/photo -downsampling_filters "Box,Sinc,Catrom"等参数)。评测使用的公开数据集为:

  • BSD100:BSDS300 中的 100 张测试图像;
  • Urban100:来自 SelfExSR 项目,包含大量城市建筑类图像,纹理细节丰富、重建难度更高。

2x PSNR(无 TTA)

Dataset/ModelBicubicvgg_7/photoupconv_7/photoupconv_7l/photoresnet_14l/photo
BSD10029.55831.42731.64031.74931.847
Urban10026.85230.05730.47730.75931.016

可以看出:四个模型均显著超越 Bicubic 插值(BSD100 上约 +1.9 ~ +2.3 dB,Urban100 上约 +3.2 ~ +4.2 dB);同族模型中resnet_14l/photo精度最高,upconv_7l次之。

2x 耗时(秒)

Dataset/Modelvgg_7/photoupconv_7/photoupconv_7l/photoresnet_14l/photo
BSD1004.0572.5094.9476.86
Urban10016.3497.08314.17827.87

upconv_7/photo速度最快(BSD100 上 2.509 秒),而精度最高的resnet_14l/photo耗时约是它的 2.7 倍(BSD100)/ 3.9 倍(Urban100)。Urban100 图像尺寸更大,整体耗时约为 BSD100 的 3~4 倍。精度与速度的权衡是选型时的核心考虑:追求速度选upconv_7,追求精度选resnet_14l。

2x with TTA PSNR

Dataset/ModelBicubicvgg_7/photoupconv_7/photoupconv_7l/photoresnet_14l/photo
BSD10029.55831.47431.70531.81231.915
Urban10026.85230.14030.59930.86831.162

2x with TTA 耗时(秒)

Dataset/Modelvgg_7/photoupconv_7/photoupconv_7l/photoresnet_14l/photo
BSD10036.61120.21942.48660.38
Urban100132.41665.125129.916255.20

对比两组数据可见:TTA 使各模型 PSNR 提升约+0.05 ~ +0.15 dB(文档给出的经验值为 photo 约 +0.1),但耗时膨胀到约 8 倍(例如upconv_7/photo在 BSD100 上从 2.509 秒变为 20.219 秒),与文档“TTA 比非 TTA 慢 8 倍”的说明一致。

Art 基准:多种滤波器下的模型对比

art 评测命令详见 appendix/benchmark.sh,其核心循环为:

benchmark_art() { dir=./benchmarks/${1}/${2}/${3}/${4} mkdir -p ${dir} th tools/benchmark.lua -dir data/${1} -model1_dir models/${2}/art -method scale \ -filter ${3} -color y -range_bug 1 -tta ${4} -output_dir ${dir} \ -save_info 1 -show_progress 0 -force_cudnn 1 } run_benchmark_art() { for tta in 0 1 do for filter in Sinc Lanczos Catrom Box do benchmark_art art_test vgg_7 ${filter} ${tta} benchmark_art art_test upconv_7 ${filter} ${tta} benchmark_art art_test cunet ${filter} ${tta} done done } run_benchmark_art

脚本按benchmarks/{dataset}/{model}/{filter}/{tta}结构组织输出目录,并在-save_info 1下于每个目录写入benchmark.txt与benchmark_details.txt(后者逐图记录 PSNR 与胜负)。输出目录结构示意:

benchmarks/ └── art_test/ ├── vgg_7/ │ ├── Sinc/0/… ├── Sinc/1/… ├── Lanczos/0/… … ├── upconv_7/… └── cunet/…

数据集

art_test由 84 张各类同人插画组成,属于私有数据集(文档明确说明不对外公开),因此 art 的绝对数值无法被外部直接复现,但相对对比关系(模型间、滤波器间、TTA 前后)仍然有效。

2x PSNR(无 TTA)

Filter/ModelBicubicvgg_7/artupconv_7/artcunet/art
Lanczos31.02237.49538.33039.886
Sinc30.94737.72238.53840.312
Catrom(Bicubic)30.66337.27837.18940.184
Box30.89137.70938.41039.672

关键观察:

  • cunet/art 全面领先,在四种滤波器下均达到 39.7+ dB,比upconv_7/art高约 1.2~1.6 dB;
  • 滤波器对最终分数有明显影响:对vgg_7/art与upconv_7/art,Sinc 与 Lanczos 下采样得到的输入重建分数更高,而 Catrom(Bicubic)反而偏低;
  • 相比之下,photo 评测固定使用 Catrom 下采样(-filter Catrom),这也是两套评测脚本参数不同的原因。

2x 耗时(秒)

Dataset/Modelvgg_7/artupconv_7/artcunet/art
art_test24.15310.79424.222

upconv_7/art耗时约为vgg_7/cunet的一半,属于 art 模型中的“快速档”;cunet/art在精度最高的同时耗时与vgg_7/art相当。

2x with TTA PSNR

Filter/ModelBicubicvgg_7/artupconv_7/artcunet/art
Lanczos31.02237.77738.67740.289
Sinc30.94738.00538.88340.707
Catrom(Bicubic)30.66337.49837.41740.592
Box30.89138.03238.76840.032

2x with TTA 耗时(秒)

Dataset/Modelvgg_7/artupconv_7/artcunet/art
art_test207.21799.151211.520

TTA 在 art 上收益明显大于 photo:各模型提升约+0.2 ~ +0.4 dB(例如upconv_7/art在 Sinc 下从 38.538 升至 38.883,cunet/art在 Sinc 下从 40.312 升至 40.707),与文档“art 约 +0.4”的经验值吻合;代价同样是约 8 倍耗时(cunet/art从 24.222 秒升至 211.520 秒)。

TTA 的原理与代价(源码级解读)

TTA(Test-Time Augmentation,测试时增强)是 waifu2x 支持的集成技术。其实现位于 lib/reconstruct.lua:定义 8 个几何变换模式(恒等、水平翻转、垂直翻转、双向翻转、转置以及它们的组合),tta函数对输入逐个施加变换 → 前向推理 → 逆变换还原 → 取 8 个输出的平均值:

local augmented_patterns = { { forward = function (a) return a end, backward = function (a) return a end }, { forward = function (a) return image.hflip(a) end, backward = function (a) return image.hflip(a) end }, { forward = function (a) return image.vflip(a) end, backward = function (a) return image.vflip(a) end }, ... }

-tta_level可设为2|4|8(get_augmented_patterns中:1 表示关闭,2 为恒等+转置,4 增加翻转组合,8 为全部模式),等级越高集成样本越多、质量越好但越慢。结合上表数据可总结工程经验:

  • 追求最高精度且不介意耗时(如高质量插画修复):art 场景开启 TTA,收益约 +0.2~+0.4 dB;
  • 追求吞吐/实时性:关闭 TTA,upconv_7系列是速度优先的选择;
  • photo 场景 TTA 收益较小(约 +0.1 dB),是否开启可视算力与需求权衡。

如何运行与扩展自己的基准测试

复现官方评测

  1. 准备数据:把 BSD100 / Urban100 图像放入data/bsd100、data/urban100(与 appendix/benchmark.sh 中-dir data/${1}对应);art_test 为私有数据集,可使用自己的插画集替代;
  2. 准备模型:photo 模型放models/{model}/photo/scale2.0x_model.t7,art 模型放models/{model}/art/scale2.0x_model.t7(目录结构需与脚本一致);
  3. 执行官方脚本或单条命令,例如:
th tools/benchmark.lua -dir data/bsd100 -model1_dir models/upconv_7/photo -method scale \ -filter Catrom -color y -range_bug 1 -tta 0 -output_dir benchmarks/bsd100/upconv_7/0 \ -save_info 1 -show_progress 0 -force_cudnn 1
  1. 查看输出:终端进度行实时显示baseline_rmse/model1_rmse/baseline_psnr/model1_psnr;-save_info 1时benchmark.txt会写入完整参数(JSON)与最终 RMSE/PSNR/耗时,benchmark_details.txt逐图记录分数。

生成自定义评测数据

若需要自己构造高低分辨率图像对,可借助 tools/make_benchmark_input.lua:

th tools/make_benchmark_input.lua -i ./data/my_images -lr ./data/my_lr -hr ./data/my_hr -filter Sinc

脚本把输入目录中每张图用指定滤波器(-filter)缩小一半写入-lr,原图写入-hr,文件名一一对应。

用 user / diff 方法做任意图像对对比

若想评测的不是标准降采样流程,而是任意“输入-真值”图像对,可使用-method user(两个模型对比)或-method diff(仅统计输入与真值差异,不加载模型)。命令格式:

th tools/benchmark.lua -method user -name scale2.0x \ -model1_dir models/upconv_7/art -model2_dir models/cunet/art \ -x_dir ./data/my_lr -y_dir ./data/my_hr -tta 0

-x_dir与-y_dir中的文件名必须一一对应,脚本按 basename 匹配;-border N可在计算指标前裁掉边缘 N 像素,用于规避分块重建的边界效应。

结语

通过 appendix/benchmark.md 及其配套脚本与源码,可以看到 waifu2x 评测体系的关键结论:photo 场景中resnet_14l精度最高、upconv_7速度最快;art 场景中cunet全面领先;TTA 在 art 上能带来约 +0.4 dB 的额外收益,但耗时约为 8 倍。理解 PSNR 的 MATLAB 兼容计算与-range_bug细节,是让本地数据与官方数字可比的前提;而tools/benchmark.lua丰富的选项(user/diff/scale4等方法与-save_info报告)足以支撑读者复现官方结果,并针对自有数据集建立持续的模型回归评测。

  • 计算机视觉
  • 深度学习

【免费下载链接】waifu2x

Image Super-Resolution for Anime-Style Art

项目地址:https://gitcode.com/gh_mirrors/waifu/waifu2x
点击查看免费下载

相关推荐

上一篇:终极Windows系统日志监控解决方案:Visual Syslog Server完整指南
下一篇:DDrawCompat终极指南:让老游戏在现代Windows系统完美运行的完整解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:18:40

手撸轻量PROFINET从站:裸机+FreeRTOS+p-net实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 2:18:33

【信息科学与工程学】计算机科学与自动化——第一百八十九篇 计算机硬件 系列一 微处理器04

微处理器工艺的数学物理——覆盖 LOD 效应、RDF、1/f 噪声、体效应、背偏效应、热载流子寿命、NBTI AC 模型、自热效应、功耗模型、电压调节器效率、片上互连传输线、电迁移 Blech 长度、低 k 机械强度、CMP 速率、光刻胶对比度、EUV 掩模缺陷修复、ALD 保形性、铜电镀填充、TS…

作者头像 李华
网站建设 2026/9/30 2:18:17

【项目记录】数据库集群巡检推送

数据库集群自动化巡检与推送报告系统 —— 项目记录 脱敏声明:本文为技术复盘,文中所有 IP、主机名、域名、账号、邮箱、数据源 UID、大盘 UID、 集群业务名称、部署路径均已替换为占位符(如 db-mysql-01、10.20.x.y、grafana.example.com、 业务集群A)。PromQL、指标名、判…

作者头像 李华
网站建设 2026/9/30 2:16:29

Opik Prompt Playground:不写代码,也能像做实验一样调提示词

如果你正在开发基于大语言模型的应用&#xff0c;大概率会遇到这样的场景&#xff1a;为了让模型输出更符合预期&#xff0c;你反复修改提示词&#xff0c;然后写一段脚本调用 API&#xff0c;把结果打印出来&#xff0c;再手动对比。改了几版之后&#xff0c;你已经记不清哪一…

作者头像 李华