我们用 Real-ESRGAN 处理了一批老素材(480p 的 DV 录像,客户想要 1080p 版本)。第一批出来,客户反馈:"画面是大了,但人脸看着怪怪的,说不上哪里不对。"
我把原图和超分结果放大并排看,明白了:超分"生成"了原图里不存在的细节。皮肤纹理是模型想象出来的,眼睛周围的细节被重构成了另一个人的样子——这在 AI 领域叫"幻觉"(hallucination),在交付里叫"事故"。
从那以后我给超分加了两道关:能不能超分的判断(有些内容绝对不能超分)和做完之后的验收(怎么发现幻觉)。这篇写这两件事,还有那笔必须提前算给客户听的成本账。
TL;DR:超分不是"还原细节",而是"生成合理的细节"——原图里没有的信息,模型只能猜。三个必须知道的点:文字/图表/人脸特写不能超分(文字会被重构成乱码,人脸会变形);先清理压缩伪影再超分(模型会把块效应当成纹理一起放大);逐帧超分会产生帧间闪烁(需要时序一致性处理)。成本上:1080p→4K 在消费级显卡上大约 每秒素材需要 4~10 GPU 秒,10 小时素材就是几十到上百小时——必须提前算给客户。
目录
一、先理解:超分在做什么
传统插值(bilinear、lanczos)做的是:在已知像素之间算出一个"平滑"的值。它不会创造信息,只会让过渡更自然。
AI 超分做的是:根据训练时学到的"这类图像长什么样",生成缺失的像素。
举个子:
- 原图里有一块模糊的区域,看起来像"可能是树叶";
- 插值 → 输出一片模糊的绿色;
- AI 超分 → 输出一片清晰的叶子形状(具体长什么样,是模型根据训练数据猜的)。
这就是根本区别:
| 插值 | AI 超分 | |
|---|---|---|
| 有没有新增信息 | 没有 | 有(但是猜的) |
| 结果是否"真实" | 一定忠实于原图 | 不一定(可能生成不存在的内容) |
| 主观清晰度 | 提升有限 | 提升明显 |
| 风险 | 只是模糊 | 可能产生幻觉内容 |
一句话总结:超分是"有依据的想象",不是"还原"。 理解了这一点,后面所有的判断标准就都顺理成章了。
二、四类伪影
1. 幻觉纹理
模型"补全"了原图里没有的纹理。常见于:
- 皮肤(生成毛孔、皱纹);
- 织物(生成不存在的编织纹路);
- 墙面/地面(生成噪点状纹理)。
危害等级:中——看起来"更清晰了",但如果原图是重要凭证(比如监控截图),生成的细节可能误导判断。
2. 人脸变形(最严重)
人脸是模型训练中的"重点区域",也是最容易出问题的区域:
- 五官位置轻微偏移;
- 眼睛、嘴的细节被重构成"另一个人";
- 多个人脸时,小脸(背景里的)变形更严重。
危害等级:高——客户一眼就能看出来,而且无法接受("这不是我本人")。
我们的处理:人脸特写类素材默认不超分,或者超分后只对背景区域用 AI 结果,人脸区域保留插值结果(用 mask 合成)。
3. 文字损坏
文字是高频、规则的结构,超分模型没有针对文字训练(通用模型),会:
- 把笔画重构成"像字但不是字"的形状;
- 边缘出现毛刺;
- 小字号直接变成乱码。
危害等级:高——屏录、PPT、带字幕的画面绝对不能超分。
4. 边缘振铃与涂抹
- 振铃:高对比边缘(比如黑字白底)周围出现一圈亮/暗的环;
- 涂抹:本来清晰的纹理被"抹平"(模型觉得那是噪点)。
危害等级:中。
三、哪些内容绝对不能超分
这是我现在的判断表(在做之前先过一遍):
| 内容类型 | 能不能超分 | 说明 |
|---|---|---|
| 摄影/风景 | ✅ 可以 | 效果最好 |
| 老照片/胶片 | ✅ 可以 | 但要保留颗粒感的讨论 |
| 访谈(中景) | ⚠️ 谨慎 | 人脸不要太大 |
| 人脸特写 | ❌ 不要 | 变形风险 |
| 屏录/PPT/带文字 | ❌ 不要 | 文字损坏 |
| 带硬字幕的画面 | ❌ 不要 | 字幕会被重构 |
| 动画 | ⚠️ 看模型 | 用动画专用模型(如 Real-ESRGAN 的 anime 版) |
| 监控/取证素材 | ❌ 不要 | 生成细节可能影响事实认定 |
| 医学/技术影像 | ❌ 不要 | 同上 |
| 已经数字放大过的 | ❌ 没意义 | 放大的还是插值结果 |
| 低码率压缩严重的 | ⚠️ 先清理 | 见下节 |
最后一条值得展开:如果源本身是低码率压过的(块效应、振铃明显),超分模型会把这些压缩伪影当成图像内容一起放大——结果就是"更大的块效应"。
四、预处理的顺序
正确顺序:
1. 去隔行(如果是隔行源)
2. 降噪(轻度)
3. 去块/去振铃(如果压缩伪影明显)
4. 超分
5. (可选)极轻的锐化
6. 编码
为什么降噪要在超分之前:
超分模型的训练数据大多是"高质量的自然图像",它没见过块效应和 MPEG 噪点。喂给它带伪影的图,它会:
- 把块边界当成"边缘"去锐化(伪影被强化);
- 把压缩噪点当成"纹理"去生成(噪点放大)。
所以先清理,再超分。
为什么超分后不要重度锐化:超分本身已经增强了边缘,再锐化会产生明显的振铃。如果非要,用极轻的参数(unsharp=3:3:0.3)。
五、模型怎么选
| 模型 | 适合 | 说明 |
|---|---|---|
| Real-ESRGAN x4plus | 通用摄影内容 | 最常用 |
| Real-ESRGAN x4plus-anime | 动画/插画 | 线条更干净 |
| Real-ESRGAN x2plus | 温和放大 | 推荐先试 2x |
| Real-ESRGAN general-x4v3 | 通用 v3,更自然 | 伪影更少 |
| GFPGAN / CodeFormer | 人脸修复(配合用) | 会改变人脸,慎用 |
| SwinIR / HAT | 质量更好,更慢 | 离线高质量场景 |
尺度选择:
- 4x 一次到位 vs 2x 做两次——实测下来 2x 两次的效果通常比 4x 一次更自然(伪影更少),代价是耗时翻倍;
- 如果只要 2x(比如 540p→1080p),直接用 2x 模型,不要 4x 再缩小。
人脸增强(GFPGAN)要不要开:
我的建议是不开,除非客户明确要求"修复老照片"。因为 GFPGAN 会主动重绘人脸(它是生成模型,不是增强模型),出来的脸可能"更清楚但不是本人"。
六、帧间闪烁:视频超分特有的坑
这个坑只在视频上出现(处理单张图片不会遇到)。
原因:超分是逐帧独立处理的。相邻两帧的内容几乎一样,但模型对"这一块的纹理该怎么生成"的判断可能有细微差别——相邻帧生成了不同的纹理。
表现:播放时那一块区域闪烁(像有一层游动的噪点)。在静止区域(墙面、天空)尤其明显。
解决办法(从简单到复杂):
1. 轻微的时域降噪(最简单)
ffmpeg -i upscaled.mp4 -vf "hqdn3d=1:1:3:3" -c:v libx265 -crf 20 out.mp4
时域降噪会把"帧间不一致"抹平。参数要很轻,否则运动区域会拖影。
2. 用带时域一致性的超分方案
一些视频超分方案(如 Real-ESRGAN 的视频分支、BasicVSR 类)会考虑相邻帧。代价是慢得多。
3. 降低超分强度(用 2x 而不是 4x)
放大倍数越小,生成的"新细节"越少,闪烁越轻。
我的做法:先做 30 秒样片,看有没有闪烁——如果有,先加时域降噪(方案 1),还不行就降尺度。闪烁一定要在样片阶段发现,否则几十小时的素材全处理完才发现,成本已经沉没了。
七、质量控制流程
三步验收:
1. 抽帧对比(必做)
抽 5~10 帧有代表性的画面,原图放大 vs 超分结果并排:
def make_comparison(src_frame, up_frame, out, cols=2):
"""并排对比图(左:原图放大,右:超分结果)。"""
h, w = up_frame.shape[:2]
src_up = cv2.resize(src_frame, (w, h), interpolation=cv2.INTER_LANCZOS4)
canvas = np.hstack([src_up, up_frame])
cv2.imwrite(out, canvas)
重点看:人脸、文字、纹理密集区。
2. 人脸检测比对(如果画面里有人)
用人脸检测 + 简单的特征比对,看超分前后是不是"同一个人":
import cv2
import numpy as np
def face_consistency(orig, upscaled):
"""粗判:人脸区域的结构相似度。"""
def detect(img):
det = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = det.detectMultiScale(gray, 1.1, 5)
return max(faces, key=lambda f: f[2] * f[3]) if len(faces) else None
fo, fu = detect(orig), detect(upscaled)
if fo is None or fu is None:
return None
# 把两个人脸区域缩到同一尺寸比较
x, y, w, h = fo
fo_img = cv2.cvtColor(orig[y:y + h, x:x + w], cv2.COLOR_BGR2GRAY)
x, y, w, h = fu
fu_img = cv2.cvtColor(upscaled[y:y + h, x:x + w], cv2.COLOR_BGR2GRAY)
fo_img = cv2.resize(fo_img, (128, 128))
fu_img = cv2.resize(fu_img, (128, 128))
# 归一化后算相关系数
a = (fo_img - fo_img.mean()) / (fo_img.std() + 1e-6)
b = (fu_img - fu_img.mean()) / (fu_img.std() + 1e-6)
return float((a * b).mean())
相关系数低于某个阈值(比如 0.75)→ 标记人工复核。这个检测很粗糙,但能筛出明显变形的。
3. 人工抽查
按素材总量抽 5%~10%,由人看并排对比图。这一步不能省——自动检测只能筛出极端情况。
八、成本账
实测(RTX 3090,Real-ESRGAN x4plus,ncnn-vulkan 版):
| 输入分辨率 | 输出 | 单帧耗时 | 1 分钟视频(1500 帧) |
|---|---|---|---|
| 480p | 1080p(~2.2x) | 0.09 s | 2.3 分钟 |
| 720p | 1440p(2x) | 0.16 s | 4 分钟 |
| 1080p | 4K(4x) | 0.55 s | 14 分钟 |
| 1080p | 4K(2x×2) | 1.0 s | 25 分钟 |
换算成业务量:
客户的一批素材:10 小时(600 分钟)480p → 1080p
= 600 × 2.3 分钟 = 1380 分钟 = 23 小时 GPU 时间
23 小时 GPU——如果是自己的机器,就是跑一天一夜;如果是云 GPU(比如 3 元/小时),就是 70 元。
但如果是 1080p → 4K:
600 分钟 × 14 分钟/分钟 = 8400 分钟 = 140 小时 GPU
140 小时——自己跑要 6 天,云上要几百元,而且这还不算抽帧、重组、编码、验收的时间。
所以我的报价流程:
- 先问清楚:素材总时长、源分辨率、目标分辨率;
- 取 30 秒样片实测单帧耗时;
- 换算总 GPU 时间 + 人工成本(验收、返工);
- 报给客户,并说明"如果验收后要调整参数,需要重跑"。
很多客户听到"4K 要跑 6 天"就会改成 1080p——这个沟通必须发生在开始之前,而不是跑了一半发现来不不及。
九、给客户的期望管理
我的标准话术(写在方案和交付文档里):
超分技术通过 AI 模型生成缺失的画面细节,可以让低分辨率素材在更大尺寸下观看时更自然、边缘更锐利。但它无法还原原始拍摄时不存在的信息,生成的内容可能与真实场景存在差异。
因此:
- 含人脸特写、文字、字幕、图表的内容不建议超分;
- 超分后的画面不作为事实认定依据(监控、取证、医学类素材不适用);
- 建议先做 30 秒样片确认效果,再决定是否全量处理。
这段话的价值:它把"技术能做什么、不能做什么"提前讲清楚。客户签了样片确认再开工,后面所有的争议都消失了。
我见过太多"超分完客户不满意,双方各执一词"的情况——问题往往出在开工前没把预期对齐。
十、坑清单
- 以为超分是"还原" → 它是生成。预期错了后面全错。
- 对含文字的内容超分 → 文字变乱码。
- 对人脸特写超分 → 人脸变形,客户无法接受。
- 开了 GFPGAN 人脸增强 → 脸不是本人了。
- 先超分后降噪 → 伪影被当成纹理放大。先清理。
- 低码率源直接超分 → 块效应被放大。
- 没检查帧间闪烁 → 全量处理完才发现,成本沉没。先做样片。
- 4x 一次到位 → 比 2x 两次伪影多。优先 2x。
- 超分后又重度锐化 → 振铃明显。
- 输出用低码率编码 → 超分出来的细节被压掉,白做。用高质量参数(CRF 18~20)。
- 没算 GPU 时间就报价 → 跑一半发现来不及/亏本。先实测再报。
- 中间帧序列占满磁盘 → 抽帧成 PNG 序列,1 小时 1080p 素材约 200 GB。算好空间,或者分片处理边处理边删。
- 音频/时间码没对齐 → 重组时忘了带音频或者帧率设错。
- 文件名排序错误 → 帧序列文件名没补零(
%06d)导致顺序错乱。 - 不做样片确认 → 客户预期和实际差距大。样片是必须的。
- 对动画用通用模型 → 线条被处理得很脏。用 anime 专用模型。
- 超分后体积暴涨 → 4K 素材的体积是 1080p 的 3~4 倍,存储和分发成本要算进去。
最后说说我对超分这类"AI 增强"技术的整体态度。
它是一个非常有效的工具,但它改变的是" plausibility"(看起来合理),不是" accuracy"(准确)。
这个区别在不同场景下的权重完全不同:
- 做宣传片、老片修复、让观众看得更舒服 → plausibility 更重要 → 超分很合适;
- 做监控取证、医学影像、需要忠实还原的场景 → accuracy 是唯一标准 → 绝对不能用。
所以我的第一个问题永远是"这批素材的用途是什么",而不是"要放大到多少"。用途决定了能不能用,其次才是怎么用。
还有一点实操经验:样片制度是所有 AI 处理类项目的必需品。不管是超分、插帧、降噪还是上色,都应该先做 30 秒样片、让客户确认、再全量。这个流程看起来多花了一天,但它避免的是"几十小时 GPU 白跑 + 客户不满意 + 重新谈判"这种最糟糕的结果。
我们现在的报价单里,"样片制作与确认"是单独列出来的一项——它不是赠品,它是项目里最有价值的一步。