- 计算机视觉
- 深度学习
【免费下载链接】waifu2x
Image Super-Resolution for Anime-Style Art
本文围绕 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 | "" | 可选,第二个模型目录,用于双模型对比 |
-method | scale | 评测方法:scale(2x 放大)、noise、noise_scale、user(自定义输入输出对)、diff、scale4(4x 放大) |
-filter | Catrom | 生成低分辨率输入时使用的下采样滤波器:Box、Lanczos、Catrom(Bicubic) |
-resize_blur | 1.0 | 缩放时的模糊参数,传给iproc.scale |
-color | y | PSNR 计算通道:rgb、y、r、g、b |
-noise_level | 1 | 噪声模型等级(配合noise/noise_scale方法) |
-jpeg_quality | 75 | JPEG 压缩质量(noise 相关方法构造退化输入时用) |
-jpeg_times | 1 | JPEG 压缩次数 |
-jpeg_quality_down | 5 | 每次压缩递减的质量值 |
-range_bug | 0 | 是否复现 MATLABrgb2ycbcr动态范围 bug(1|0) |
-save_image | 0 | 是否保存转换后的结果图片 |
-save_baseline_image | 0 | 是否保存基线(插值放大)结果图片 |
-output_dir | ./ | 输出目录(结果图片与评测报告) |
-show_progress | 1 | 是否显示进度条 |
-baseline_filter | Catrom | 基线插值放大使用的滤波器(Box|Lanczos|Catrom(Bicubic)) |
-save_info | 0 | 是否把分数与参数写入benchmark.txt |
-save_all | 0 | 等价于同时开启-save_info、-save_image、-save_baseline_image |
-thread | -1 | CPU 线程数,大于 0 时调用torch.setnumthreads |
-tta | 0 | 是否启用 TTA(0|1) |
-tta_level | 8 | TTA 等级(2|4|8),值越大质量越好但越慢 |
-crop_size | 256 | 每次送入网络的分块大小(patch size),显存不足时调小 |
-batch_size | 1 | 批大小 |
-force_cudnn | 0 | 是否使用 cuDNN 后端(0|1) |
-yuv420 | 0 | 是否使用 yuv420 采样 JPEG(noise 退化用) |
-name | "" | user 方法下的模型名(对应{name}_model.t7) |
-x_dir/-y_dir | "" | user 方法的输入/真值图像目录,两目录文件名必须一致 |
-x_file/-y_file | "" | user 方法的输入/真值文件列表 |
-border | 0 | 计算指标前从边缘裁掉的像素数(去除边界效应) |
-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分支的执行逻辑:
- 对每张真值图
x[i].y先执行transform_scale:用-filter指定滤波器把图像缩小一半(宽高乘 0.5),得到低分辨率输入input; - 用
scale_f(model1, 2.0, input, ...)让模型把输入放大 2 倍,得到model1_output; - 用
baseline_scale(默认 Catrom 插值)把输入放大 2 倍,作为基线输出baseline_output; - 三者均与原始真值图计算 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/Model | Bicubic | vgg_7/photo | upconv_7/photo | upconv_7l/photo | resnet_14l/photo |
|---|---|---|---|---|---|
| BSD100 | 29.558 | 31.427 | 31.640 | 31.749 | 31.847 |
| Urban100 | 26.852 | 30.057 | 30.477 | 30.759 | 31.016 |
可以看出:四个模型均显著超越 Bicubic 插值(BSD100 上约 +1.9 ~ +2.3 dB,Urban100 上约 +3.2 ~ +4.2 dB);同族模型中resnet_14l/photo精度最高,upconv_7l次之。
2x 耗时(秒)
| Dataset/Model | vgg_7/photo | upconv_7/photo | upconv_7l/photo | resnet_14l/photo |
|---|---|---|---|---|
| BSD100 | 4.057 | 2.509 | 4.947 | 6.86 |
| Urban100 | 16.349 | 7.083 | 14.178 | 27.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/Model | Bicubic | vgg_7/photo | upconv_7/photo | upconv_7l/photo | resnet_14l/photo |
|---|---|---|---|---|---|
| BSD100 | 29.558 | 31.474 | 31.705 | 31.812 | 31.915 |
| Urban100 | 26.852 | 30.140 | 30.599 | 30.868 | 31.162 |
2x with TTA 耗时(秒)
| Dataset/Model | vgg_7/photo | upconv_7/photo | upconv_7l/photo | resnet_14l/photo |
|---|---|---|---|---|
| BSD100 | 36.611 | 20.219 | 42.486 | 60.38 |
| Urban100 | 132.416 | 65.125 | 129.916 | 255.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/Model | Bicubic | vgg_7/art | upconv_7/art | cunet/art |
|---|---|---|---|---|
| Lanczos | 31.022 | 37.495 | 38.330 | 39.886 |
| Sinc | 30.947 | 37.722 | 38.538 | 40.312 |
| Catrom(Bicubic) | 30.663 | 37.278 | 37.189 | 40.184 |
| Box | 30.891 | 37.709 | 38.410 | 39.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/Model | vgg_7/art | upconv_7/art | cunet/art |
|---|---|---|---|
| art_test | 24.153 | 10.794 | 24.222 |
upconv_7/art耗时约为vgg_7/cunet的一半,属于 art 模型中的“快速档”;cunet/art在精度最高的同时耗时与vgg_7/art相当。
2x with TTA PSNR
| Filter/Model | Bicubic | vgg_7/art | upconv_7/art | cunet/art |
|---|---|---|---|---|
| Lanczos | 31.022 | 37.777 | 38.677 | 40.289 |
| Sinc | 30.947 | 38.005 | 38.883 | 40.707 |
| Catrom(Bicubic) | 30.663 | 37.498 | 37.417 | 40.592 |
| Box | 30.891 | 38.032 | 38.768 | 40.032 |
2x with TTA 耗时(秒)
| Dataset/Model | vgg_7/art | upconv_7/art | cunet/art |
|---|---|---|---|
| art_test | 207.217 | 99.151 | 211.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),是否开启可视算力与需求权衡。
如何运行与扩展自己的基准测试
复现官方评测
- 准备数据:把 BSD100 / Urban100 图像放入
data/bsd100、data/urban100(与 appendix/benchmark.sh 中-dir data/${1}对应);art_test 为私有数据集,可使用自己的插画集替代; - 准备模型:photo 模型放
models/{model}/photo/scale2.0x_model.t7,art 模型放models/{model}/art/scale2.0x_model.t7(目录结构需与脚本一致); - 执行官方脚本或单条命令,例如:
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- 查看输出:终端进度行实时显示
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
相关推荐
OpenCV Contrib dnn_superres 超分辨率基准测试指南:PSNR/SSIM 质量评估与 CPU 推理耗时对比
OpenCV Contrib dnn_superres 超分辨率基准测试指南:PSNR/SSIM 质量评估与 CPU 推理耗时对比 dnn_superres 模
计算机视觉图像处理深度学习机器学习tchMaterial-parser:智慧教育平台电子课本 PDF 免费下载工具,一键完整保存
tchMaterial parser:智慧教育平台电子课本 PDF 免费下载工具,一键完整保存 想在国家中小学智慧教育平台把教材存到本地,往往卡在预览页:页面只
网页爬虫教育Stencil 编译耗时基准测试:基于 benchmark-results.md 的冷/热构建性能度量与复现指南
Stencil 编译耗时基准测试:基于 benchmark results.md 的冷/热构建性能度量与复现指南 本指南以 Stencil 仓库 test/en
开发工具前端前端构建
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考