简介:一套基于生成对抗网络(GANs)的人脸超分辨率源码项目,面向Python开发者、深度学习初学者及AI图像处理爱好者。项目以PULSE模型为核心,借助StyleGAN生成器将低清马赛克人像恢复为高清效果,覆盖数据预处理、模型构建、训练优化与图像生成等完整流程。压缩包共19个文件,以9个Python脚本为程序主体,包含网络架构、损失函数与推理入口;同时提供pt预训练权重、yml运行配置、markdown说明文档,以及jpeg、png、gif等效果验证示例,整体约10.07MB。目前已有1761人下载学习。通过阅读源码和配套文档,可以理解生成器与判别器的博弈过程、损失函数设计和优化器选择,掌握人脸对齐、超分重建与后处理环节,并直接复现马赛克还原高清的整条管线,为后续自研图像修复与超分模型积累实战经验。
1. 马赛克照片还原高清这件事:AI 超分辨率能修到什么程度
拿到一张被打上马赛克的图片,用 python 和 AI 把它还原成高清版本,这是很多人上手图像超分辨率的第一直觉。先说结论:如果马赛克是把人脸、车牌或文字区域直接打糊,那么没有任何算法能把丢失的信息凭空找回来,AI 能做的是根据周围像素和训练集里的先验知识,重建出一张“看起来合理”的高清图;如果马赛克只是 JPEG 压缩产生的块状模糊、小图放大后的锯齿,又或者是低分辨率摄像头拍出的照片,那用深度学习超分模型能获得肉眼可见的清晰度提升。这个方向主要解决三类场景:老照片翻新、监控截图放大、OCR 识别前的图像预处理。
我接下来说的做法,全部基于 Python 生态里现成的开源模型和推理脚本,不需要你从零训练一个神经网络。适合的读者是已经在用 OpenCV 处理图像、但没接触过生成式超分模型的工程师,以及想把 Real-ESRGAN 这类模型接进自己图像流水线的开发。整个落地路径分三块:先搞清楚超分和去马赛克的边界,再用最小脚本把环境跑通,最后调参和批处理。这里面坑不少,尤其是“输入图很小还要放大 4 倍”和“模型加载依赖下载”这两个,提前知道能省半天时间。
2. 去马赛克的选型:传统插值、超分模型与生成式填充的分界线
2.1 传统插值为什么救不了马赛克:resize 只是心理安慰
用 OpenCV 直接放大图片,常见做法是cv2.resize配合INTER_CUBIC或INTER_LANCZOS4。这类插值算法本质是在已有像素之间计算新的像素值,能让图片变大,但不会带来任何新信息。对轻微锯齿和 JPEG 块效应,Lanczos 插值有一定平滑效果;对真正的马赛克块,放大后依然是一块一块的色斑,只是每一块的面积变大了。
import cv2 img = cv2.imread('mosaic_input.png') # 把宽度和高度都放大 2 倍,使用 Lanczos 插值 resized = cv2.resize(img, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LANCZOS4) cv2.imwrite('resized_output.png', resized)这段代码里fx和fy分别是水平和垂直方向的缩放系数,INTER_LANCZOS4是 OpenCV 里质量比较高的插值方式。它的计算量比INTER_NEAREST大不少,但边缘比INTER_CUBIC更干净。如果你现在只是想把图片变大给人工看,插值是够用的;如果你的目标是把模糊的牌号、文字识别出来,插值基本没用。判断标准很简单:原图细节还在,只是小,插值有效;原图细节已经被马赛克抹掉了,插值无效。
2.2 深度学习方法到底在做什么:从 SRGAN 到 Real-ESRGAN
图像超分辨率(Super-Resolution)在深度学习领域是一个独立任务,核心思路是让模型看过大量“高清原图 → 人工降质图”的配对,学习从低质量恢复到高质量的映射。SRGAN 是把这个领域带向生成对抗网络的关键工作,首次让超分结果在肉眼观感上超过传统方法。它之后出现 ESRGAN,改进了生成器结构和感知损失,纹理更真实。当前社区里用得最多的是 Real-ESRGAN,它把降质过程从简单的双三次下采样扩展成了包含模糊、噪声、压缩伪影的复杂组合,所以对真实拍摄的照片、老截图效果更好。
这个方向经常被叫“AI 修复”,但它的本质是重建而不是检索。模型没有见过你的原图,它只是根据训练数据中学到的“人脸长什么样”“文字边缘长什么样”来猜。我一般会直接告诉项目方:重度打码的照片,AI 能还原出一张清晰的像样图,但还原不出“原图”,这个预期一定要在项目一开始就对齐。如果马赛克区域是人脸,模型会用先验知识补出一张相似但不完全相同的人脸;如果是乱码文字,模型补出来的内容大概率是错的。
2.3 模型选型决策表:什么场景用什么模型
| 需求场景 | 推荐模型 | 说明 |
|---|---|---|
| 老照片翻新、去 JPEG 块状噪声 | Real-ESRGAN | 对真实降质图像鲁棒,显存占用适中 |
| 人脸区域修复、面部细节重建 | GFPGAN / CodeFormer | 专门优化过面部结构,不会把脸修成怪物 |
| 视频逐帧放大 | Real-ESRGAN + 视频切片 | 显存够就整段推,不够就按帧导出再合回 |
| 只有文字、图表要去模糊 | 先用锐化 + 超分组合 | 通用超分模型对文字不够锐利,可后端加cv2.GaussianBlur反锐化 |
| 马赛克块特别大、区域占比高 | 无现成通用方案 | 这不是超分问题,是图像补全问题,需要用 inpainting 模型,且结果不可控 |
选型上还有一个参数需要在意,就是模型的放大倍数。多数超分模型固定输出 2 倍或 4 倍,你输入一张 100×100 的图,它直接给你 400×400 的结果。如果你想要 8 倍,一般做法是先跑一次 4 倍模型,再把结果作为输入跑一次 2 倍模型。不要试图让模型一次性输出 8 倍,训练数据里没出现过这么大的放大跨度,结果会充满幻想纹理。
2.4 为什么说这属于图像重建:信息论的边界要先立住
决策时最容易忽略的一步是评估输入图本身的可用信息量。一张被 32×32 像素的马赛克块覆盖的脸,全图可能只有几十个像素提供了肤色信息,深度学习模型再强也补不出瞳距和五官比例。此时正确的做法不是继续堆模型,而是替换输入源,或者接受“只能生成一张相似但不保证正确”的结果。我处理过一个项目,乙方坚持说用商用的超分模型能把 20×20 的车牌放大成可识别的清晰车牌,验收时才发现模型生成了一串完全不同的数字。这个方向先说清边界,比调参重要得多。
3. 搭建 Python 运行环境:从 cv2 到深度学习推理的最小路径
3.1 安装基础库:python、numpy、opencv 的常见坑
超分推理的环境依赖不复杂,但安装顺序不对会浪费不少时间。我建议先装 Python,再装 numpy,最后装 opencv-python,不要反着来。Windows 上常见翻车现场是pip install opencv-python之后import cv2报DLL load failed,这通常是 numpy 版本太新或太旧导致的。先执行一次pip install numpy==1.26.4再重装 opencv,能解决大部分导入异常。
# 建议在虚拟环境里执行以下命令 pip install numpy==1.26.4 pip install opencv-python pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu这里把 PyTorch 装成 CPU 版本是为了先跑通逻辑,等确定模型能加载之后,再按你的显卡重新安装 CUDA 版本。在安装前最好确认一下 python 位数,Windows 上如果装了 32 位的 Python,部分预编译的 whl 包会找不到匹配版本。检查方式是执行python -c "import struct; print(struct.calcsize('P') * 8)",输出 64 才说明是 64 位。
3.2 用 OpenCV 跑通一个最小流程:读图、降噪、放大、保存
在引入深度学习模型之前,先做一个基础实验,确认你的图片问题到底是“马赛克”还是“模糊”。这个实验很值得做,因为很多用户嘴里说的马赛克,实际上是压缩率高导致的块效应,这种情况下传统图像处理就够用。
import cv2 import numpy as np img = cv2.imread('input.jpg') # 用双边滤波去压缩块效应,保留边缘 denoised = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75) # 用 unsharp mask 增强边缘反差,让文字更清晰 blurred = cv2.GaussianBlur(denoised, (0, 0), 3) sharpened = cv2.addWeighted(denoised, 1.5, blurred, -0.5, 0) # 放大 2 倍做后续人工查看 result = cv2.resize(sharpened, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC) cv2.imwrite('preprocessed.png', result)bilateralFilter的三个关键参数分别是邻域直径d、颜色空间标准差sigmaColor和坐标空间标准差sigmaSpace。sigmaColor越大,颜色差异大的像素越容易被保留;sigmaSpace越大,距离远的像素对当前像素的影响越大。一般 75/75 对 1080p 的图是安全起点,小图要往下调。addWeighted的 1.5 和 -0.5 是锐化强度的经典配比,把原图和模糊图做差再叠加回原图。这一步跑完如果图片观感提升明显,说明问题确实主要是模糊和压缩伪影,可以直接用插值方案交代;如果块状结构还在,那就必须上深度学习超分。
3.3 认识模型推理环境:权重文件、推理脚本与“黑匣子”问题
深度学习超分模型不像 OpenCV 那样 pip 装完就能用,它需要权重文件、推理脚本和模型结构三部分。开源项目一般会把推理脚本写好,你只需要把预训练权重下载后放到指定目录。这个环节有一个容易踩的坑:权重文件动辄几十 MB 到几百 MB,下载地址在 GitHub Release 或模型托管站上,网络不稳定时下载会中断,但脚本不会提示你文件不完整,只会在加载时报size mismatch。我的做法是下载后看文件大小是否和发布页标注一致,不一致就重新下载,不要反复试。
推理脚本本身并不复杂,核心逻辑通常只有几十行。你要关心的只有三个接口:模型怎么加载、输入图片怎么预处理、输出结果怎么保存。预处理一般包括BGR2RGB、归一化到 0~1、转成 PyTorch 张量;后处理是把输出张量截断到 0~1、转回 BGR、乘 255 后保存。理解了这个流程,后面调试参数时才不至于对着报错日志发呆。
3.4 先跑一次官方 demo:最小复现路径
在改任何参数之前,先把项目的官方推理命令原样跑一遍。以 Real-ESRGAN 为例,通常输入一张样图就能得到输出。这一步目的不是调优,而是验证环境、权重、依赖全部正常。如果官方 demo 能跑通,说明环境没问题,后续参数调整都只是数值层面的修改;如果官方 demo 都报错,优先排查 PyTorch 版本和显卡驱动,不要先怀疑代码。
# Real-ESRGAN 官方推理命令示例 python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs/ -o outputs/ -s 4-n指定模型名,-i是输入目录,-o是输出目录,-s是放大倍数。这里要注意-s 4和模型自带倍数的关系:如果模型是 x4plus,-s传 4 就是原生倍数;如果传 2,模型会放大 4 倍后再缩回 2 倍,画质不会更好,只会增加处理时间。正确做法是直接用模型的原生倍数。
4. 用 Real-ESRGAN 把马赛克照片还原高清:完整操作步骤与参数调整
4.1 推理脚本的选择:官方脚本和自己写 Python 调用的取舍
Real-ESRGAN 仓库里自带命令行推理脚本,但把它接进自己的处理流程时,我一般会写一个简洁的 Python 调用模块,绕开命令行参数解析那层,直接调用RRDBNet和RealESRGANer两个类。这样做的好处是方便把超分嵌入到已有的批量处理流程里,也能自定义前处理和后处理。
import cv2 import torch from basicsr.archs.rrdbnet_arch import RRDBNet from realesrgan import RealESRGANer # 定义模型结构,x4plus 对应 23 个 RRDB block model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=4) # 加载权重,权重路径按你自己的目录修改 model_path = 'weights/RealESRGAN_x4plus.pth' # 实例化推理器 upsampler = RealESRGANer( scale=4, model_path=model_path, model=model, tile=128, # 分块大小,显存不够时调小 tile_pad=10, # 分块之间的重叠像素 pre_pad=0, half=False # 半精度推理,GPU 支持时可以改为 True ) img = cv2.imread('mosaic_input.png', cv2.IMREAD_COLOR) output, _ = upsampler.enhance(img, outscale=4) cv2.imwrite('restored_output.png', output)这段代码的核心在RealESRGANer的参数上。tile是切块推理的边长,模型会把大图切成多个tile×tile的块分别处理再拼回去,避免一次性把整张图放进显存。tile_pad是块与块之间的重叠宽度,防止拼缝处出现明显的接痕,一般设置成tile的十分之一就能获得较好的效果。half=True能加速推理,但如果显卡显存不足或驱动老,改成False走全精度更稳。
4.2 核心参数详解:scale、outscale、denoise_strength、face_enhance
scale和outscale是最容易被混淆的两个参数。scale是模型结构内部的放大倍数,x4 模型必须传 4,改小没有意义;outscale是最终输出相对输入图的倍数,可以传 1、2、3 或任意值。如果outscale=1,模型仍然会计算 4 倍的结果,然后通过插值缩放回输入尺寸,这么做的好处是能够得到更干净的去噪效果。对于原本只是轻度马赛克的小图,我会设置scale=4, outscale=2,先让模型有足够的像素空间去重建纹理,再缩回到 2 倍,观感比直接 4 倍输出柔和不少。
# denoise_strength 只在 RealESRGAN_x4plus_anime_6B 这类模型上有意义 # 取值 0~1,值越大去噪越强,但纹理细节损失也越多 output, _ = upsampler.enhance(img, outscale=2, denoise_strength=0.5)denoise_strength和face_enhance不是所有模型都支持,需要看权重版本。在动漫模型上,denoise_strength负责平衡“保持笔触纹理”和“抹平噪点”的关系,拍脑袋给 0.5 一般不会出错,但遇到噪点特别重的图建议先从 0.3 开始试。face_enhance打开后会用额外的 GFPGAN 权重做一次人脸增强,代价是推理时间翻倍。如果你处理的图里人脸占画面比例很小,不建议开,它会消耗大量时间且效果不明显。
4.3 分块大小对显存的影响:tile 怎么调
tile参数直接决定显存占用。输入图越接近正方形、里边结构越复杂,切块越多,潜在拼缝风险越大。我积累的参数经验是:6GB 显存对应tile=128或 256,8GB 对应 256 到 320,12GB 以上可以试 512。显存不足时会直接报CUDA out of memory,此时把tile减半再试,它比降低模型尺寸更能实际解决问题。
4.4 白平衡和色彩偏移:为什么还原结果发灰或发黄
模型输出的 RGB 分布和输入不一定完全一致,尤其是老照片,超分结果经常会偏灰、饱和度下降。这不一定是你环境的问题,而是模型在重建高频细节时把色彩统计带偏了。常规做法是在后处理阶段加一次自动白平衡。OpenCV 里没有现成的灰世界算法,我一般是写一个简单的增益校正:分别计算三通道均值,再除一个期望的目標均值。
import cv2 import numpy as np def simple_gray_world(img, target=128.0): # 对每个通道计算均值,按目标均值做增益 result = img.copy().astype(np.float32) for i in range(3): mean_val = np.mean(result[:, :, i]) if mean_val > 0: result[:, :, i] *= target / mean_val return np.clip(result, 0, 255).astype(np.uint8) img = cv2.imread('restored_output.png') balanced = simple_gray_world(img) cv2.imwrite('restored_balanced.png', balanced)这段代码实现的灰世界算法,假设场景中所有颜色的平均反射率是灰色。target设置成 128 表示希望每个通道的均值落在 128 附近,值越大输出越亮。这个后处理不是必须的,但绝大多数老照片超分结果处理完之后,观感会明显通透。如果你在处理视频帧,注意每帧独立做白平衡可能让亮度闪烁,这时最好在整个视频上取统一的增益系数。
4.5 文字与图表类图片的专项处理:把超分和锐化结合
Real-ESRGAN 对自然图像的纹理重建效果很好,但对密集小字和折线图,输出往往是“糊成一片的锐利”,就是纹理看起来很丰富,但笔画的拓扑结构是错的。这个场景我一般会做一个组合流程:先超分,再做一个高通过滤和阈值化,把对比度拉起来,最后人工观察是否可读。
# 超分后再用自适应阈值增强文字边缘 gray = cv2.cvtColor(balanced, cv2.COLOR_BGR2GRAY) # 自适应阈值,块大小 15,常数 8 thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 8) cv2.imwrite('restored_text.png', thresh)adaptiveThreshold的第三个参数选ADAPTIVE_THRESH_GAUSSIAN_C会按邻域加权平均计算阈值,比全局阈值更能适应光照不均。blockSize=15决定了每个像素参考的邻域大小,字太小就调小,字太大就调大。C=8是最终阈值相对均值的偏移量,越大则二值化后保留的细节越少。这个流程对截图类马赛克很有效,对自然风景几乎没用,因为自然图像没有明显的二值边界。
5. 避坑:马赛克还原高清最常见的 5 个翻车现场
5.1 现象:重度马赛克还原后得到一张“完全清晰但完全错误”的图
这几乎是所有新手第一次跑通模型后的第一反应:模型没有报错,输出也很清晰,但人脸是陌生的,或者车牌数字是编的。原因是马赛克区域的信息已经被不可逆地丢弃,深度模型只能依据周围像素和先验知识填充内容。解决方式不是在模型上较劲,而是调整预期:把这种还原定义成“生成合理的参考图”,而不是“修复原图”。在涉及车牌、人脸、票据的场景,直接告知需求方这是生成内容,不能作为依据。这一步不是技术问题,但它决定了技术方案能不能通过验收。
5.2 现象:输入图只有 50×50 像素,放大 4 倍后依然模糊
模型输出的尺寸变大了,细节没有变多。这是因为 50×50 的图经过下采样后,有效信息密度太低。解决方法是先做一次预放大:把输入图用 Lanczos 插值扩大到 200×200 左右,再做超分。虽然插值不增加信息,但能让模型的输入分布更接近它训练时见过的尺度。我测试过同一个模型,直接输入 50×50 和先插值到 200×200 再输入,后者的纹理合理度明显更好,因为它给了模型更多上下文。
5.3 现象:模型在 CPU 上跑得极慢,一张图要几分钟
Real-ESRGAN 的 x4plus 模型在 CPU 上处理一张 1080p 图片需要非常长时间,这通常不是代码死循环,而是计算量本身就大。解决思路有三个:换轻量模型,比如realesr-general-x4v3这种为通用场景优化过速度的版本;把tile调到 64 以下,让每次计算量变小;或者换用half=True。如果你必须 CPU 推理,建议直接选轻量模型,通用模型没有太多可优化的空间。做视频帧时,可以先对每 10 帧抽 1 帧测试,确认速度能接受再全量处理。
5.4 现象:还原结果出现明显的色块和接缝
tile_pad设置太小或者tile太大导致分块之间的重叠不足,输出图会有一格一格的痕迹。最常见原因是tile_pad为 0。解决方法是把tile_pad调到tile的十分之一到五分之一,并确保tile能整除输入尺寸附近的值。另一个容易忽略的点是,部分推理脚本会在拼回大图时对重叠区域做平均,如果你用的是自己写的拼接逻辑,必须手动处理重叠权重,否则接缝处会亮度突变。
5.5 现象:加载权重时报size mismatch或key not found
这个报错高频出现的原因是权重文件下载不完整,或者模型结构与权重不匹配。x4plus 权重对应 23 个 RRDB block,x4plus_anime_6B 对应 6 个 block,结构定义错了权重肯定加载失败。先把项目 README 里写明的参数和权重文件一一对照,再从下载源重新拉取文件核对大小。不要尝试逐个修改网络结构参数去硬适配,那只会浪费更多时间。还有一种情况是 PyTorch 版本差距大导致权重序列化格式不兼容,优先把torch升到 2.0 以上的稳定版再试。
6. 进阶用法:先用指标验证效果,再做批处理嵌入流水线
6.1 用 PSNR 和 SSIM 告别“看起来变清晰了”的主观争论
我在很多项目里吃过主观验收的亏。你费劲调完参数,需求方一句“感觉还是不够清晰”就把方案否了。提前把量化指标跑出来,比争论观感更有效。如果项目里存在不经过马赛克的高清原图作为基准,可以用 PSNR 和 SSIM 两个指标评估重建质量。
import cv2 import numpy as np def calculate_psnr(img1, img2): mse = np.mean((img1.astype(np.float64) - img2.astype(np.float64)) ** 2) if mse == 0: return float('inf') max_pixel = 255.0 return 20 * np.log10(max_pixel / np.sqrt(mse)) def calculate_ssim(img1, img2): C1, C2 = 6.5025, 58.5225 img1 = img1.astype(np.float64) img2 = img2.astype(np.float64) kernel = cv2.getGaussianKernel(11, 1.5) window = np.outer(kernel, kernel.transpose()) mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5] mu1_sq, mu2_sq, mu1_mu2 = mu1 ** 2, mu2 ** 2, mu1 * mu2 sigma1_sq = cv2.filter2D(img1 ** 2, -1, window)[5:-5, 5:-5] - mu1_sq sigma2_sq = cv2.filter2D(img2 ** 2, -1, window)[5:-5, 5:-5] - mu2_sq sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2 ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2)) return ssim_map.mean() restored = cv2.imread('restored_output.png') original = cv2.imread('original_ground_truth.png') psnr = calculate_psnr(restored, original) ssim = calculate_ssim(restored, original) print(f'PSNR: {psnr:.2f} dB, SSIM: {ssim:.4f}')这段代码里filter2D配合高斯窗口计算局部均值和方差,5:-5是边界裁剪,去掉滤波带来的边缘效应。PSNR 超过 30dB 通常代表重建结果在数值上很接近原图;SSIM 超过 0.95 代表结构相似度很高。如果你的输出比插值方法在 PSNR 上还低,说明模型没调好或输入图信息量确实不够。注意这两个指标只在有真实的原始高清图时才有意义,纯粹的“马赛克输入 → 输出”没有基准,只能靠人工盲评。
6.2 批处理:把超分模型接进照片整理流水线
单张图调通之后,批量处理只需要在外层套一个文件遍历。我一般会用glob匹配图片扩展名,然后逐个调用同一个upsampler.enhance。这里有一个很实用的习惯:失败时把异常信息写入日志而不是直接打印到终端,因为批量任务一旦在中间某张图崩溃,你要能快速定位到具体文件。
import glob import cv2 import traceback image_paths = glob.glob('raw_images/*.jpg') + glob.glob('raw_images/*.png') for path in image_paths: try: img = cv2.imread(path) output, _ = upsampler.enhance(img, outscale=2) out_path = path.replace('raw_images', 'restored_images') cv2.imwrite(out_path, output) except Exception: with open('errors.log', 'a', encoding='utf-8') as f: f.write(f'Failed: {path}\n') f.write(traceback.format_exc())这里的.replace('raw_images', 'restored_images')假设输入和输出目录结构层级相同,如果你的目录名不一样要改。单张图异常时继续处理后面的图,同时把堆栈写入errors.log。批量处理不要用multiprocessing盲目并行,PyTorch 推理本身已经占满显存,多进程同时加载多个模型副本会直接 OOM。
6.3 最后的习惯:所有参数写进配置字典,不要散落在脚本里
我刚开始做超分时,习惯把tile、denoise_strength、outscale直接写死在脚本里,后来发现项目接需求方过来看效果时,每次解释“这个值为什么写在代码里”都特别费劲。现在的做法是把所有可调参数集中到一个config字典,按场景预设几套配置,比如“老照片”“监控截图”“文字截图”三套。这样既方便自己批量测试,也方便同事接手。预训练权重、输入输出目录、日志路径全部放进去,脚本主体不出现任何一个硬编码路径。
做成这件事之后,我还有一个反复用到的验证习惯:每次修改模型或参数,都存档一张输入图、一张旧输出、一张新输出,并把 PSNR/SSIM 或至少是文件名记录在一个 Markdown 文件里。因为超分模型升级权重后,结果不是单调变好的,有时候新权重对某一类图效果反而肉眼可见地退步。有这个对比记录,决策谁上谁下就有依据,而不是又回到“我觉得这个更清晰”的老路上。
如果你打算长期在这个方向投入,建议记住一句话:超分模型能帮你把模糊的图变清晰,但变清晰不等于变正确。拿真实场景的图片先跑通最小闭环,再逐步加深度和宽度,比一开始就想把每类图都调出完美效果要靠谱得多。希望帮到你。
本文还有配套的精品资源,点击获取