资讯详情

TTSR:基于参考图纹理迁移的Transformer图像超分网络解析

📅 2026/10/14 3:04:32 | 华诺云谱 👁 阅读
TTSR:基于参考图纹理迁移的Transformer图像超分网络解析
图像超清化这件事有个特别反直觉的观察很多场景下换一个更强的超分网络不如给网络准备一张高质量的参考图。CVPR 2020上提出的Texture Transformer Network for Image Super-ResolutionTTSR正是围绕“参考图纹理迁移”这一路线展开的。它不是简单地在单张低分图上做盲猜而是把Transformer机制引入图像超分让网络从一张高分辨率参考图中找到对应纹理并精确“贴”回低分图。这篇文章我会从问题动机、网络架构、损失设计、训练复现以及工程落地几个角度拆解TTSR尤其适合在做老照片修复、图像增强、视频纹理补全这类方向的朋友阅读。1. 超分为什么需要一张“参考图”从单图硬抠纹理到RefSR1.1 单图超分的天花板纹理是“猜”出来的先聊一个dirty little secret单图超分Single Image Super-Resolution简称SISR在放大倍数达到4倍甚至8倍时实质上是在做“有根据的编造”。网络看到的是已经丢失高频信息的低分图它只能根据边缘、梯度、周围颜色去猜测原本的纹理长什么样。比如一张模糊的脸部照片放大后SISR能预测出皮肤很光滑但它不可能猜出脸上的毛孔排列更不可能凭空恢复出衣服上被压缩掉的针织花纹。这种“脑补”性质决定了单图超分的上限。你当然可以用更大的模型、更强的注意力机制把猜测水平不断提高但当你遇到那些高频纹理已经彻底丢失的区域时模型唯一能做的就是输出一个看起来合理、但其实和原图毫无关系的纹理。PSNR可以涨但视觉上的真实感提升很有限。换个思路如果手里不仅仅有低分图还有一张同类场景或同一个物体的高清大图呢这就从“猜”变成了“找”。参考图超分Reference-based Super-Resolution简称RefSR干的就是这件事。它给网络提供一张高质量参考图网络要做的不是凭空创造而是从参考图中找到对应区域的纹理迁移到低分图上。1.2 参考图超分的直觉从检索库借纹理参考图超分的实际场景很常见。老照片修复时你手里可能有一本相册其中有几张同一时期拍摄但清晰度不同的照片某个城市历史影像修复时你可能有不同角度拍下的同一座钟楼电商商品图放大时你可能有同款商品在不同光线下的高清图。这些场景里低分图和高分参考图之间存在大量可借用的纹理信息。当时的RefSR工作比如SRNTTReference-based Super-Resolution with Neural Texture Transfer已经验证了“从参考图迁移纹理”这条路可行。它的思路是先用预训练的特征提取器分别处理低分图和参考图然后通过匹配算法找到相对应的纹理块再加权融合到超分结果里。这条路能走通但有两个明显短板。第一用固定的预训练网络通常是VGG提取特征而这些特征是为图像分类设计的并不一定最适合“纹理匹配”这个任务。第二匹配和融合是相对分离的流程匹配误差会在融合阶段被放大一旦参考图里有光照变化、视角偏移、遮挡纹理迁移就很容易出现乱七八糟的artifacts。TTSR盯住的就是这两个短板。1.3 TTSR要解决的两个核心问题TTSR能拿到CVPR 2020的口头报告靠的不是花哨的模块堆叠而是精准地回应了RefSR的两个本质问题第一什么才算“有用的纹理特征”答案不是人定的应该让网络自己学。TTSR为此设计了一个可学习的纹理提取器Learnable Texture Extractor并在训练时通过对比损失Contrastive Loss引导让提取器输出的特征更适合做纹理匹配。第二怎么把参考图纹理“精确地”放到正确位置TTSR把Transformer的自注意力机制改造成一套跨图像的纹理传递流程用“相关性嵌入”模块判断参考图哪些区域与输入相关用“硬注意力”确定性地选出最优匹配位置再用“跨尺度特征集成”解决低分图和高分参考图之间尺度不一致的问题。这四条线索贯穿全文。接下来我把每个模块拆开揉碎讲清楚同时说清为什么这样设计。2. 网络骨架拆解四个模块怎么把Transformer“搬”进纹理迁移2.1 可学习纹理提取器为什么不用预训练VGG很多人在第一次接触TTSR时会问既然之前SRNTT用VGG特征做纹理迁移效果尚可为什么TTSR非要重新训练一个提取器我的理解是VGG特征和你真正需要的纹理特征之间存在本质错位。VGG是为ImageNet分类训练的它学到的是“这是什么物体”的高层语义网络越往后越对颜色和纹理不敏感尺度和边缘的精细信息被不断池化掉。但超分任务要的是“这块区域有什么样的高频结构”。你拿一个为语义任务训练的特征去做纹理匹配相当于派一个只认大体轮廓的鉴定师去数纤维纹理他当然能分辨出是羊绒衫还是牛仔裤但他说不清羊绒衫上的花纹排列密度。TTSR的做法很朴素也很有启发性既然不知道什么样的特征最适合纹理匹配那就不要手工指定直接让匹配和重建损失反向传播去塑造提取器。具体来说这个可学习的纹理提取器是一个多层的CNN特征金字塔输入低分图和参考图输出从浅层到深层的多尺度特征记为L1、L2、L3、L4。浅层特征保留边缘和颜色深层特征保留全局结构。这里的“可学习”三个字是关键。后续还会配合对比损失去拉大“正确匹配”和“错误匹配”特征之间的区分度让提取器不再只是分类器的副产品而是一个真正服务于纹理检索的特征编码器。2.2 相关性嵌入先判断参考图哪块“有用”拿到低分图和参考图的特征之后下一步是匹配。但匹配之前必须先想清楚参考图不是每一块都对你有用。参考图里可能有另一个物体、有强烈的光照差异、有遮挡甚至整张参考图和你需要修复的区域只有一小部分相关。如果直接全局匹配那些不相关的区域会成为噪声源。TTSR用相关性嵌入模块Relevance Embedding来处理这个问题。它先把低分图的浅层特征上采样到与参考图特征相同的尺寸然后和参考图的特征逐点做内积得到一张相关性得分图再经过sigmoid归一化分值越高表示参考图该位置与输入区域越相关。你可以把这一步理解成“逐块打分”。在后续模块向参考图取纹理之前先问一句这块参考区域有没有资格参与迁移如果一张参考图里只有建筑正面是你要的其他地方都是天空和地面那么相关性嵌入会把这些无关区域的分值压到很低。这个“先打分、再匹配”的顺序是TTSR比SRNTT高效的重要原因。SRNTT的匹配是直接拿特征做最近邻而TTSR在匹配前先加了一个软性门控相当于告诉后面的注意力模块别只看相似度还要看参考图这个位置“值不值得信任”。2.3 硬注意力传递和Vision Transformer的soft attention有何不同讲TTSR绕不开“Transformer”这个词但它用的注意力和我们后来在ViT、SwinIR里看到的soft attention不太一样。标准Transformer计算的自注意力是“加权求和”每个query位置对所有key位置打分然后用softmax归一化最终输出是所有value的加权平均。这种做法的好处是梯度平滑、信息聚合充分适合序列建模或者整图全局建模。但TTSR面对的是纹理迁移它想要的是“精确对应”而不是“把不同位置的纹理平均一下给你”。如果对参考图所有候选纹理做加权平均得到的纹理一定是一种糊在一起的混合体等于又退回了超分输出的模糊感。TTSR的做法非常强硬相关性嵌入生成归一化相关性图之后用一个hard attention操作直接选取相关性最高的那个位置把参考图的纹理特征搬过来。这个“只取最优不要混合”的设计和人类修复照片时的直觉一致既然你找到了一块和低分区域逐像素对齐的参考纹理那就整块贴过来不要再和其他候选纹理做搅拌。当然硬注意力最大的风险是“必胜主义”如果相关性嵌入打分有误硬注意力会把错误位置的纹理强行贴到正确位置。这比soft attention的错误后果更严重。TTSR后续用多尺度特征集成和对比损失在缓解这个问题让打分本身的可靠性尽量高。这也是为什么我们复现时要特别注意对比损失和相关性嵌入的训练稳定性。2.4 跨尺度特征集成解决LR与Ref的尺度鸿沟低分图和参考图之间还有一个天然障碍尺度不一致。低分图是64x64的参考图可能是256x256甚至更高。如果你只在一层尺度上匹配很难兼顾“全局结构对齐”和“细节纹理对齐”。这是很多RefSR方法在复杂场景上效果崩坏的原因之一。TTSR用跨尺度特征集成Cross-Scale Feature Integration把多尺度匹配结果融合起来。具体做法是对纹理提取器输出的多个尺度的特征分别做相关性嵌入和硬注意力得到不同粒度下的匹配结果然后把不同尺度的传递纹理特征同步回低分图的对应分辨率再用一个特征融合模块逐层整合。把这个机制拆开看浅层尺度匹配的是“这一块的边缘走向”深层尺度匹配的是“这一块的纹理密度”两者互补。如果一个区域的纹理在浅层匹配很好但在深层匹配分数低融合网络会自动降低深层信息的权重。就像一个团队里有人擅长看整体布局有人擅长看局部细节最后组长把意见综合起来再做判断。3. 损失函数与训练策略对比损失在纹理匹配里到底起了什么作用3.1 三路损失的分工TTSR的训练并不复杂主要损失有三路L1重建损失、感知损失、对比损失。前两者在超分任务里很常规L1损失约束输出图像在高频细节上和真实高分辨率图保持像素级接近感知损失用预训练网络的深层特征计算距离约束主观视觉质量防止输出过于平滑或出现失真。重点聊聊第三路对比损失。它的作用是直接训练前面说的可学习纹理提取器。你可能会想提取器不是跟着重建损失一起端到端训练吗为什么还要单独加一个对比损失直接训练不就行了还真的不太行。重建损失对提取器的约束太间接了。提取器输出的一堆特征要经过相关性嵌入、硬注意力、特征集成等一堆环节才会影响最终像素。梯度从重建损失传到提取器中间已经很微弱提取器学到的特征很容易变成“只对亮度敏感”之类的懒特征。TTSR需要提取器输出的特征具备一个核心能力能够区分“正确的纹理匹配”和“错误的纹理匹配”。这个能力用对比损失来直接监督最合适。3.2 对比损失如何训练“提取器”对比损失的操作逻辑非常直观。训练过程中网络已经通过相关性嵌入找到了一个匹配位置。这个位置对应的参考纹理特征就是正样本同时在参考图里随机选几个不相关位置的特征作为负样本。训练目标是让低分查询特征距离正样本更近距离负样本更远。用一个简化PyTorch伪代码来说明import torch import torch.nn.functional as F def contrastive_loss(query, positive, negatives, margin0.5): pos_dist F.pairwise_distance(query, positive, p2) neg_dist F.pairwise_distance(query, negatives, p2) # 让正样本距离趋近于0负样本距离至少大于margin loss pos_dist.mean() F.relu(margin - neg_dist).mean() return loss这个损失直接给纹理提取器提供了一种“判别压力”如果提取出来的特征不能告诉网络哪个参考位置才是对的损失就很大。这样训练出来的特征天然适合纹理检索任务。这也是TTSR的一大创新后来的很多图像匹配工作也借鉴了类似思路。对于读者来说复现时尤其要注意对比损失的负样本不能太简单。如果负样本是整张参考图里和查询区域完全无关的颜色块提取器很容易学到一个“亮度不同就是不匹配”的粗糙规则。比较有效的做法是从参考图的相关区域附近取负样本让它们看起来很像但纹理结构不同逼着提取器学更精细的判别。3.3 训练数据构造负样本从哪来具体到TTSR的训练数据常用的是公开数据集CUFED5它包含了很多场景每个场景包含一张高分辨率参考图和对应的低分图以及一些不同视角或不同光照下的辅助参考图。训练时网络会同时看到低分图、参考图和真实高分辨率图。负样本的挖掘有两个来源一是同一参考图上的其他空间位置二是同一场景的其他参考图。训练时把低分图对应的真实高分辨率区域作为正样本把其他位置和无关参考图区域作为负样本形成足够多样化的对比压力。我做实验时发现一个有趣的现象负样本的选择对最终纹理质量的敏感性超出预期。如果你只从同一张参考图里选负样本提取器会过度关注“空间位置是否对应”对光照变化的鲁棒性下降如果你混合了其他参考图的区域作为负样本提取器会更关注“纹理类型是否匹配”整体视觉效果更自然。建议复现时两种负样本按大约7:3混合。4. 复现与工程落地中的经验和坑4.1 环境配置与数据准备要点TTSR基于PyTorch训练环境上没有特殊要求常规CUDA、Torch版本都能跑起来。如果你的目标是复现论文效果数据准备阶段有几个必须注意的细节。第一点低分图和参考图的尺寸关系不要搞错。训练时通常会把参考图裁成与真实高分辨率图同尺寸的区域低分图则是真实高分辨率图下采样得到的。很多初学复现的人会直接把参考图整张输入导致参考图尺度过大、学习不稳定。第二点训练时用的低分图下采样方式会和最终效果直接相关。TTSR作者在实践中验证过使用带抗锯齿的下采样比直接最近邻下采样效果更接近真实退化。建议统一用PyTorch的F.interpolate加上antialiasing参数或者用双三次插值配合kernel size处理。第三点数据增强不能缺。翻转、旋转这类基础增强能显著提升匹配稳定性。我在复现时还会对低分图做随机亮度抖动和轻微模糊这模拟了低分图质量不稳定的真实情况能明显提高模型在实际业务数据上的泛化能力。4.2 显存与训练速度控制TTSR不是那种轻量级模型。它需要同时对低分图和参考图做多尺度特征提取还要存储多尺度的相关性图和注意力结果显存压力不容小觑。如果你用一张常见的24GB显存卡直接跑完整配置也会紧张更不用说还想同时调大batch size。我的建议是分三步走。第一步先用小patch训练调通整个流程比如把低分图patch控制在32x32左右batch size设为4或8确认损失能稳定下降再放大。第二步如果显存依然紧张优先降低参考图的特征层数而不是降低低分图分辨率因为低分图分辨率与重建质量绑定更紧。第三步可以考虑梯度检查点gradient checkpointing对纹理提取器的每个尺度特征计算做重计算减少显存占用代价是训练时间增加约15%到20%。实测下来batch size在8以上、patch为64x64时训练稳定性最好。如果你需要更高吞吐可以把多卡分布式训练作为扩展方向但单卡先用小配置把问题排查干净更重要。4.3 推理时的典型翻车场景参考图质量差怎么办工程落地最常遇到的问题是参考图本身质量不行或者参考图与低分图内容根本不匹配。TTSR再强也不能无中生有。一个容易被忽略的细节是推理时参考图的预处理质量直接决定最终上限。如果参考图有明显模糊或压缩伪影相关性嵌入打出的分数会整体偏低硬注意力选出来的匹配也不可靠。我的做法是在输入前先对参考图做一次轻度锐化再用直方图匹配把参考图亮度分布调到与低分图大致接近这一步能让PSNR和主观效果都得到提升。更麻烦的情况是参考图里只有一小部分与低分图相关。这时候单纯依赖TTSR内部的相关性嵌入还不够。我建议在业务线上加一个前置的全局相关性判断先用低分辨率的全局特征计算低分图与参考图的相似度如果相似度太低直接走普通单图超分分支不进入TTSR流程。这个开关能有效避免把不相关纹理强行贴上去导致的“石化感”。另外推理时把低分图分块处理再拼接在块边界容易出现纹理错位。TTSR在匹配时依赖参考图的连续性分块会让边界区域的搜索范围变小。我一般会在块与块之间保留至少16像素的overlap并在拼接时做线性融合能把边界处的视觉跳变压到几乎看不出来。5. 从TTSR往后看它对后续超分模型的启发5.1 与SwinIR等后续Transformer超分思路的对比TTSR之后Transformer在低层视觉任务上迅速铺开。最有代表性的莫过于SwinIR它把Swin Transformer的滑动窗口注意力引入单图超分不再需要参考图靠局部注意力建模输入图像内部的长距离依赖。这条路线后来演变成DAT、HAT等一大族模型成为单图超分的新标杆。这两条路线很容易被混为一谈但本质不同。SwinIR是在输入图像内部做注意力TTSR是在输入图像和参考图像之间做注意力。TTSR的注意力功能是“两个图像之间的匹配与迁移”SwinIR的功能是“单张图像内部的全局相关性加权”。从架构演进上看TTSR的价值被低估了。它证明了注意力机制不仅能做特征建模还能做跨图像的信息交互。后来的很多参考图任务包括参考图像修复、参考视频增强、重光照等都在沿用TTSR奠定的“用注意力实现跨图像纹理迁移”这一范式。可以说TTSR是这类任务的“元模型”。5.2 我个人的实践体会最后说点实际的。我在一个图像增强方向的调研项目里完整复现过TTSR也试过把它改成单图超分场景下的辅助分支。最大的体会是TTSR的纹理提取器和对比损失设计是精华所在但工程落地时真正的难点在于参考图的获取和管理。如果你做老照片修复参考图可能来自相册扫描件光照、色偏、颗粒感都不同单靠网络内嵌的匹配机制很难全部应对。我会建议在进入TTSR之前先做一个轻量级的颜色校正分支专门把参考图的色调映射到低分图域这比让TTSR在特征空间里硬扛要可靠得多。另外一个小技巧是推理时可以把参考图同时放缩到0.75倍和1.25倍分别跑一次匹配然后把两次匹配结果取置信度高的区域作为最终纹理来源。相当于给匹配过程加了“观测噪声”能减少单尺度匹配的偶然性错误。代价是推理耗时增加一倍适合对效果有极高要求的离线场景。TTSR已经不是新东西了但它把“参考图纹理迁移”这个方向做得很干净不是那种靠堆模块刷分的论文。如果你在做任何需要对外部图像取纹理的任务我强烈建议先吃透这篇论文的四个模块再动手改省掉的弯路不是一点半点。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑