扩散式图像超分辨率技术实践:让模糊图片重新变清晰,AI 究竟补出了什么?
摘要: 一张只有 128×128 像素的照片,能否被 AI 修复成清晰的 512×512 图片?传统图像插值只能放大已有像素,而扩散模型(Diffusion Model)可以利用学习到的图像先验,在放大过程中生成合理的纹理和细节。本文介绍扩散式超分辨率(Diffusion-based Super-Resolution)的基本原理,并通过 Stable Diffusion x4 Upscaler 和 DiffBIR 两个开源模型,实践普通图片 4 倍放大与真实退化照片修复。
一、图片放大 4 倍,为什么还需要 AI?
假设有一张分辨率为 128×128 的猫咪照片。
我们希望把它放大到 512×512。
最简单的方法是使用 Photoshop 或 Python 的 Bicubic(双三次插值)。
这种方法可以让图片变大,但原本看不清的猫毛、胡须和眼睛细节,通常依旧模糊。
原因很简单:低分辨率图片中的大量细节已经丢失,插值算法只能根据现有像素计算新像素。
超分辨率(Super-Resolution,SR)希望解决的问题则更进一步:
[
I_{HR}=f(I_{LR})
]
其中:
- (I_{LR}):低分辨率图像。
- (I_{HR}):恢复后的高分辨率图像。
- (f):图像超分辨率模型。
传统深度学习方法,例如 SRCNN、EDSR、Real-ESRGAN,已经可以学习复杂的图像恢复关系。
而扩散模型带来了另一种思路:
利用在大量图像上学习到的视觉先验,逐步生成更符合真实图像分布的高分辨率细节。
1.1 扩散模型如何实现超分辨率?
扩散模型的训练通常涉及向图像逐步添加噪声,再学习如何从噪声中恢复图像。
在超分辨率任务中,模型还需要以低分辨率图像作为条件,约束生成结果。
过程可以简化为:
低分辨率图片
│
▼
图像编码与条件提取
│
▼
初始化带噪声的高分辨率表示
│
▼
扩散模型逐步去噪
│
├── 恢复纹理
├── 补充边缘
└── 生成合理细节
│
▼
高分辨率图片
例如,一张模糊的草地照片,经过模型处理后,草叶边缘可能更加清晰。
但这里有个值得注意的问题:
AI 补充的纹理可能只是合理的猜测,并不一定真实存在于原始场景中。
这也是扩散式超分辨率与普通图像放大最重要的区别之一。
二、有哪些值得研究的开源模型?
目前具有代表性的扩散式超分辨率模型包括:
| 模型 | 技术特点 | 适合场景 |
|---|---|---|
| Stable Diffusion x4 Upscaler | 文本条件扩散,固定 4 倍放大 | 学习原理、普通照片放大 |
| StableSR | 基于 Stable Diffusion 的图像恢复 | 真实图片超分辨率 |
| DiffBIR | 图像退化去除与扩散生成两阶段处理 | 模糊、噪声、压缩照片修复 |
| SeeSR | 利用图像语义信息引导超分辨率 | 真实场景图像恢复 |
| OSEDiff | 单步扩散模型,强调推理效率 | 高吞吐量图像增强 |
| VOSR / VOSR 2.0 | 纯视觉生成式超分辨率,提供单步模型 | 高效图像恢复、结构保真 |
其中,2026 年发布的 VOSR 值得特别关注。
此前不少超分辨率模型借助 Stable Diffusion 等文生图模型提供生成先验。
VOSR 则探索直接基于视觉数据训练生成式超分辨率模型,无需文本提示。
2026 年 8 月发布的 VOSR 2.0 进一步提供了 1.4B 参数的单步模型。
这反映出一个新的发展方向:让扩散式超分辨率摆脱对大型文生图模型的过度依赖,同时缩短推理时间。
本文先使用成熟的 Stable Diffusion x4 和 DiffBIR 进行实践。
相关开源项目:
- Stable Diffusion x4 Upscaler
- Diffusers GitHub
- DiffBIR GitHub
- SeeSR GitHub
- OSEDiff GitHub
- VOSR GitHub
三、实践案例一:使用 Stable Diffusion 将照片放大 4 倍
3.1 场景介绍
假设我们有一张低分辨率的宠物照片:
low_res.png
原始分辨率:128×128
希望将它放大到:
upscaled.png
目标分辨率:512×512
这里选择 Stability AI 发布的 Stable Diffusion x4 Upscaler。
它基于潜空间扩散(Latent Diffusion),同时接受图片和文本提示词。
文本提示词可以帮助模型理解图片中的主体和内容。
3.2 环境安装
建议使用 Python 3.10 或 3.11,配置支持 CUDA 的 PyTorch。
pip install -U diffusers transformers accelerate
pip install pillow safetensors
首次调用时会自动下载模型权重。
这个模型相对较大,建议使用 NVIDIA GPU。显存有限时,可以通过 CPU Offload 减少显存占用。
3.3 Python 完整实现
import torch
from PIL import Image
from diffusers import StableDiffusionUpscalePipeline
# 1. 加载模型
model_id = "stabilityai/stable-diffusion-x4-upscaler"
pipe = StableDiffusionUpscalePipeline.from_pretrained(
model_id,
torch_dtype=torch.float16,
variant="fp16"
)
# 将部分模型权重卸载到CPU以节省显存
pipe.enable_model_cpu_offload()
# 2. 读取图片
image = Image.open(
"low_res.png"
).convert("RGB")
# 建议先使用128×128图片测试
print("原始尺寸:", image.size)
# 3. 文本提示词
prompt = (
"A close-up photograph of a cat, "
"natural fur texture, realistic details"
)
# 4. 执行超分辨率
generator = torch.Generator(
device="cuda"
).manual_seed(42)
result = pipe(
prompt=prompt,
image=image,
num_inference_steps=30,
guidance_scale=7.5,
noise_level=20,
generator=generator
).images[0]
# 5. 保存结果
result.save("upscaled.png")
print("输出尺寸:", result.size)
如果输入为 128×128,则输出通常为 512×512。
为了方便对比,还可以生成一张普通插值结果:
from PIL import Image
image = Image.open("low_res.png").convert("RGB")
bicubic = image.resize(
(512, 512),
Image.Resampling.BICUBIC
)
bicubic.save("bicubic.png")
最终得到:
low_res.png 原始低分辨率图片
bicubic.png 双三次插值放大
upscaled.png 扩散模型超分结果
3.4 这些参数有什么作用?
| 参数 | 作用 |
|---|---|
prompt |
描述图片内容,引导细节生成 |
num_inference_steps |
扩散去噪步数 |
guidance_scale |
文本提示词的引导强度 |
noise_level |
输入图片的噪声增强程度 |
其中,noise_level 很值得研究。
较大的噪声增强可能让模型生成更多细节,但也可能削弱对原始图像的忠实程度。
guidance_scale 越大,模型越倾向于遵循文本描述,但过高时也可能产生失真。
实际使用中,建议固定随机种子,分别尝试不同参数,再比较结果。
3.5 这个案例有什么启发?
传统插值放大的结果是确定性的。
而扩散模型会受到随机种子、提示词及采样参数影响。
即使输入相同,也可能生成不同的细节。
这意味着超分辨率有两种不同的追求:
- 尽量忠实于原图。
- 尽量让结果看起来清晰、自然。
它们在某些情况下存在冲突。
对于普通照片,第二种目标可能更有吸引力;对于医学影像、财务票据等内容,则必须更加重视真实性。
四、实践案例二:使用 DiffBIR 修复模糊、压缩的真实照片
4.1 为什么普通超分模型还不够?
前面的案例假设输入图片主要问题是分辨率低。
但真实照片往往复杂得多。
例如,一张多年前保存的照片,可能同时存在:
- 分辨率低。
- JPEG 压缩噪声。
- 轻微运动模糊。
- 细节缺失。
- 图像传输造成的伪影。
这种情况被称为 Blind Image Super-Resolution(盲超分辨率)。
所谓 Blind,是指模型事先不知道图片具体经历了哪些退化。
DiffBIR 就是专门研究这类问题的开源项目。
4.2 DiffBIR 的两阶段架构
DiffBIR 的思路可以简化为:
模糊、压缩的原始照片
│
▼
第一阶段:退化去除
│
├── 降噪
├── 去模糊
└── 初步恢复结构
│
▼
第二阶段:扩散式细节生成
│
▼
高质量恢复图片
这里有一个比较巧妙的设计:
先通过恢复模型提供相对干净的图像结构,再利用扩散模型生成更丰富的视觉细节。
这样的分工可以降低生成过程完全偏离原始内容的风险。
4.3 环境准备
DiffBIR 官方提供了完整的 Python 项目。
建议在 Linux、WSL2 或 CUDA 开发环境中运行。
git clone https://github.com/XPixelGroup/DiffBIR.git
cd DiffBIR
conda create -n diffbir python=3.10
conda activate diffbir
pip install -r requirements.txt
项目依赖包含 PyTorch、图像恢复模块及扩散模型组件。
首次推理时,程序会按需下载预训练权重。
准备一个文件夹:
inputs/my_photos/
old_photo.jpg
compressed.jpg
4.4 执行图像修复
以下采用 DiffBIR v2 的官方推理方式,增加 FP16 和分块处理参数。
python -u inference.py \
--task sr \
--upscale 4 \
--version v2 \
--sampler spaced \
--steps 50 \
--captioner none \
--cfg_scale 4 \
--device cuda \
--precision fp16 \
--cleaner_tiled \
--vae_encoder_tiled \
--vae_decoder_tiled \
--cldm_tiled \
--input inputs/my_photos \
--output results/restored_photos
这里使用的是 Bash 命令格式。Windows PowerShell 用户可以在 WSL2 中执行,或按 PowerShell 的续行语法调整。
运行后,程序会将修复后的图像保存到:
results/restored_photos/
4.5 为什么加入 Tiled Sampling?
扩散模型在处理大图片时,显存消耗可能非常明显。
例如,一张 1024×1024 图片放大 4 倍后,将得到 4096×4096 的输出。
如果整张图片都参与扩散采样,显存占用可能超出消费级显卡的容量。
Tiled Sampling(分块采样)可以将大图划分成多个区域,逐块进行处理,再把结果合并。
大尺寸图片
│
▼
划分重叠小块
│
▼
逐块扩散推理
│
▼
融合边缘区域
│
▼
完整高清图片
DiffBIR 提供了不同阶段的分块参数:
| 参数 | 作用 |
|---|---|
--cleaner_tiled |
第一阶段恢复模型分块处理 |
--vae_encoder_tiled |
VAE 编码分块 |
--vae_decoder_tiled |
VAE 解码分块 |
--cldm_tiled |
扩散过程分块 |
对于 8GB 显存的显卡,可以优先尝试 FP16、较小输入图片和分块处理。
但这些优化并不保证所有分辨率都能成功运行,实际显存需求仍取决于模型权重、输入尺寸和软件环境。
4.6 能否换成更快的模型?
可以。
近两年扩散式超分辨率有一个很明显的发展趋势:减少采样步数。
传统扩散模型可能需要 20~50 次甚至更多去噪步骤。
OSEDiff、VOSR 等模型则探索通过蒸馏等技术,把多步扩散过程压缩到一步。
例如,VOSR 官方提供了 0.5B 的单步模型,可以通过以下方式推理:
python inference_vosr_onestep.py \
-c preset/ckpts/VOSR_0.5B_os \
-i input.png \
-o results \
-u 4
这里需要先按照 VOSR 官方 README 的 Preparation 部分安装依赖,并下载模型权重、VAE 和视觉编码组件,放到规定目录中。
单步模型通常能显著减少迭代计算量,因此更值得在高吞吐或低延迟场景中测试。
但它们依然需要加载视觉编码器、生成网络和解码器,不能简单地将“一步”理解为“几乎没有计算成本”。
五、扩散式超分辨率有哪些实际问题?
5.1 最大的问题:AI 可能生成不存在的细节
假设低分辨率图片里有一辆汽车。
原始车牌非常模糊。
扩散模型可能生成一张视觉上清晰的车牌,甚至看起来能够辨认上面的文字。
但这些字符可能完全来自模型的生成先验。
对于普通图片,这种现象可能并不明显;对于涉及事实核验的图像,则非常危险。
例如:
- 财务票据上的金额。
- 合同中的签名。
- 医学影像中的细小异常。
- 监控照片中的车牌和人脸。
生成得更清楚,不代表恢复出了真实信息。
因此,扩散超分结果不宜作为验证上述关键事实的独立依据。
5.2 如何判断超分辨率模型的效果?
如果拥有原始高分辨率图片,可以先人为缩小,模拟低分辨率输入,再比较不同算法的恢复效果。
常见评价指标包括:
| 指标 | 主要评价内容 |
|---|---|
| PSNR | 像素级重建误差 |
| SSIM | 图像结构相似程度 |
| LPIPS | 感知特征距离 |
| FID | 生成图像的整体分布质量 |
| NIQE | 无参考图像质量 |
| 推理时间 | 实际处理速度 |
| GPU 显存 | 部署资源需求 |
其中,PSNR、SSIM 更偏向重建保真度,而 LPIPS 等指标更关注感知质量。
有时,扩散模型生成的照片看起来更清晰,但 PSNR 反而更低。
这是因为模型生成了一些视觉合理、却与原图像素不同的细节。
所以,研究超分辨率模型时,最好同时评价图像保真度与感知质量。
5.3 什么场景不一定适合扩散超分?
如果目标只是让图片变大,且要求高效、稳定,可以优先尝试传统插值或 Real-ESRGAN 等非扩散方案。
如果需要对照片进行感知增强、补充纹理,扩散模型通常更值得测试。
对于需要保持原始文字、几何关系和真实细节的场景,则应该优先研究保真度更高的恢复模型,并进行独立核验。
六、总结
扩散模型给图像超分辨率带来了一个重要变化:
过去,图像放大主要依靠已有像素进行重建;现在,模型可以利用学习到的图像分布,在低分辨率输入的约束下生成更多视觉细节。
本文介绍了两个典型实践:
- Stable Diffusion x4 Upscaler: 使用文本引导扩散过程,将低分辨率照片放大 4 倍。
- DiffBIR: 结合退化去除与扩散生成,对模糊、压缩、低分辨率的真实照片进行恢复。
同时,我们还看到 OSEDiff、VOSR 等单步模型正在提升扩散超分的计算效率。
如果结合之前研究的 VLM 和 OCR,还可以构建一套图像处理系统:
原始低质量图片
│
▼
图像质量判断
│
▼
超分辨率模型
│
▼
增强后的图片
│
├── 图片展示
├── 视觉检索
└── OCR / VLM
不过,在涉及真实数据的应用中,仍应保留原始图片,并对增强后识别出的关键细节进行核对。
扩散式超分辨率最有意思的地方,恰好也是它最大的风险:它可以让一张缺乏细节的图片变得非常逼真,但“看起来是真的”和“确实是真的”,是两回事。
对于普通照片,我们可能更在乎它是否清晰好看;对于金融、医疗、证据图像,我们更应该在乎它是否忠实于原始信息。
这两种需求,最终可能需要完全不同的超分辨率模型。
- 点赞
- 收藏
- 关注作者
评论(0)