做底层视觉方向的论文整理,我一直有个习惯:每个顶会结束后,先不看社交平台上的碎片讨论,而是把官方论文列表整个拖下来,按关键词筛一遍,再逐个进仓库看有没有公开代码。最近在整理ECCV2020这批图像重建与底层视觉的论文时,我明显感觉到这个方向到了一个范式切换的节点——超分辨率、去雨、去雾、去模糊、去噪这些子领域,论文数量比以往更集中,方法上的共性也开始显现。这篇汇总帖就是基于完整论文清单做的一次梳理,把方向趋势、技术拆解、代码获取路径和复现经验放在一起,希望能帮正在调研或准备复现的同学省下踩坑的时间。
1. ECCV2020底层视觉方向整体观察
1.1 顶会里的图像重建论文为什么值得单独拎出来看
底层视觉在整个计算机视觉体系里的位置很特殊:它不像目标检测、语义分割那样有清晰的工业落地链路和榜单文化,但几乎所有上层视觉算法都依赖底层图像质量。ECCV2020这届的论文列表里,图像重建相关的工作占了相当可观的比重,而且从题目关键词看,超分辨率、图像恢复、去噪、去雨、去雾、去模糊这几个细分方向都在同时扩量。
为什么会集中爆发,我理解有两个原因。第一,深度卷积网络在底层视觉上的应用已经足够成熟,早期靠堆层数提升PSNR的做法走到瓶颈,大家开始寻找新的特征交互方式,比如通道注意力、非局部操作、多尺度融合,这些都成为新论文的发力点。第二,工业端的真实需求在倒逼学术研究转向,手机上拍照要超分和降噪,自动驾驶要应对雨雾天气,监控安防要恢复模糊画面,医疗影像要提升分辨率,这些场景催生了一批从真实退化模型出发的研究。
对于正在做方向调研的人来说,ECCV2020这批论文恰好提供了观察底层视觉演进的绝佳切片:既有传统CNN方法的收尾与集大成,也出现了Transformer架构向底层视觉渗透的苗头。看懂这一届的方法脉络,基本就能理解后面底层视觉领域大半的技术走向。
1.2 底层视觉研究范式究竟在切换什么
如果只看结论不看过程,很容易误以为ECCV2020底层视觉只是网络结构的小修小补。其实这一年最大的信号是研究范式开始从“加深网络”转向“重构特征交互”。
早期的图像重建方法,核心思路是让网络通过大量卷积层逐步扩大感受野,把输入图像映射到目标图像。这种做法的特点是简单、可控,但问题也很明显:随着网络加深,梯度传播和优化难度陡增,而且模型往往对所有图像区域一视同仁,重要细节和背景区域在计算资源上没有差别对待。
ECCV2020上明显可以看到一条主线:让网络学会“在哪里花力气”。通道注意力机制已经在超分领域被证明有效,这一届很多工作把它迁移到去噪、去雾、去模糊任务上;非局部模块被用来建模长距离像素依赖,有些论文在重建阶段引入了空间注意力,让网络更关注边缘和纹理区域。与此同时,Transformer开始出现在底层视觉的论文里,尽管当时还只是探索性的应用,但这种从全局角度建模像素关系的思路,在后来被反复验证是底层视觉继续前进的重要方向之一。
另外一个不容忽视的变化是数据集和评价基准的升级。过去大家习惯在合成噪声、合成雨纹、合成模糊上训练和测试,ECCV2020有相当一部分工作开始把真实退化数据作为衡量标准,去噪方向尤为明显。从“在模拟环境里跑高分”到“在真实场景中可用”,这个转变是底层视觉从论文走向产品必须迈过的坎。
2. 五大核心子方向技术要点与成果盘点
2.1 超分辨率:注意力机制成为绝对主流,轻量化设计初露锋芒
超分辨率在ECCV2020里的地位依然是底层视觉的绝对核心,相关论文数量最大。这一届的超分工作大致可以分成三条技术线。
第一条线是以注意力机制为核心改进网络结构。这类工作大多以残差网络为骨架,在特征提取阶段引入通道注意力模块,让网络在重建高频细节时对有用的特征通道赋予更高权重。相比单纯的卷积堆叠,这种做法的优势是在计算量增加很有限的情况下,显著提升PSNR和SSIM指标,尤其是在Urban100这类包含大量重复纹理的数据集上,注意力机制对结构恢复的帮助非常明显。
第二条线是面向真实场景的退化建模。传统超分训练通常采用简单的双三次下采样构造低分辨率图,但真实图片的低质量来源远不止下采样:可能是镜头模糊、传感器噪声、压缩伪影共同作用的结果。ECCV2020有不少工作尝试把退化过程分解成多个子过程,在训练时随机组合模糊、噪声、下采样参数,试图让模型适应更广泛的实际输入。这个方向说白了就是对“退化空间”的覆盖,训练集里的退化方式越多样,模型在未知退化上的泛化能力才越有保证。
第三条线是轻量化超分。移动端实时超分的需求非常明确,EECV2020的一些工作开始强调参数效率,用可分离卷积、递归结构或者紧凑注意力模块在保证输出质量的同时把模型压到适合移动设备部署的体积。如果你手头有手机端超分需求,这批论文里提炼出的结构设计思路是值得直接参考的。
评测方面,超分论文的基准几乎没有争议:训练基本围绕DIV2K和Flickr2K展开,测试集惯用Set5、Set14、B100、Urban100,放大倍数集中在×2、×3、×4。指标上PSNR和SSIM是硬通货,近年来越来越多论文会补一个LPIPS来体现感知质量。看论文实验部分时,要特别留意PSNR是在Y通道计算还是在RGB全通道计算,这直接决定了数值能不能横向对比。
2.2 图像去噪:真实噪声数据集开始取代合成高斯噪声
去噪方向是我这次整理时感觉变化最大的子领域之一。早些年去噪论文的标准套路是在干净图像上叠加高斯白噪声合成训练和测试数据,模型只要学会“滤掉高斯噪声”就算完成任务。但真实照片里的噪声是传感器在光电转换过程中产生的复杂信号,和简单的高斯假设之间有不小差距。
ECCV2020上真实去噪之所以成为热点,很大程度上得益于真实噪声数据集的公开。一些工作开始直接用真实短曝光、长曝光图像对来构造训练数据,网络在真实成对图像上学习降噪,效果比单纯在合成噪声上训练后再做域适应要好得多。另一个值得关注的做法是把噪声建模为泊松-高斯混合模型,在训练阶段通过更接近物理过程的噪声仿真来提升模型在真实相机上的表现。
做去噪复现时,需要注意一个细节:真实噪声数据集的ground truth通常由多张静态场景图像平均得到,不同厂商、不同ISO下的噪声特性差异很大,训练时如果混入了过多的相机类型,模型反而可能“不知道学谁”。更合理的策略是面向目标设备或目标ISO范围做定向训练,这也是工业界做降噪时常见的做法。
2.3 图像去雨:从端到端一步到位转向多阶段拆解
单图像去雨在ECCV2020之前已经形成“检测雨纹→去除雨纹”的通用框架,这届论文则更多在探讨如何把拆解做得更精细。
一类思路是显式引入雨纹掩码或雨纹密度估计,让网络先搞清楚雨纹在哪、雨强多大,再集中资源去清理这些区域。这种方法直觉上很好理解:无雨区域本身已经很干净,不需要浪费计算量去“增强”,把劲儿使在雨纹区域才是关键。另一类思路是在频域做文章,雨纹在高频分量中占主导,把图像分解成低频背景和高频细节后,专门处理由雨纹引起的频带异常,再和背景重新融合。这类方法的好处是背景细节保持得更好,不容易出现去雨后图像发糊的问题。
去雨方向评估数据的割裂感是我特别想提醒的:合成的Rain100H、Rain100L上表现优秀的模型,搬到真实雨景上经常明显掉点。原因并不复杂:合成雨纹的物理模拟始终无法覆盖真实雨滴的拖尾、方向、焦距变化。所以评选一篇去雨论文是否实用,不能只看它在合成数据集上的PSNR,最好能找到作者在真实雨图上的可视化对比,或者代码仓库里有没有附带真实场景测试脚本。
2.4 图像去雾:物理模型先验和数据驱动学习的拉锯与融合
去雾问题的数学基础是大气散射模型,把有雾图像拆成透射率、全局大气光和清晰辐射三部分。传统方法需要先估计这些中间量再反演求解,而端到端深度学习方法直接学习有雾图到清晰图的映射,省去了中间量估计。ECCV2020上的去雾论文焦点就落在这两条路线的结合点上。
一部分工作仍然坚持物理模型的重要性,在训练网络时把透射率和大气光作为中间监督信号,让网络在物理约束下生成更真实的清晰图。另一部分工作则尝试把大气散射模型作为可微模块嵌入网络结构,让网络自己学习如何拆分。这两类做法各有各的道理:物理模型提供了很强的归纳偏置,但真实雾天图像往往不符合理想散射模型,过度依赖物理先验反而会引入误差;完全端到端则自由度高,但可解释性差,在指标上未必占优。
做相关复现时,我建议先确认一件事:训练数据用的是合成雾还是真实雾。合成雾用深度图生成,空气光均匀假设很强,而真实雾的散射系数在空间上并不一致,这导致在合成数据上收敛很好的模型,应用到真实雾图时经常出现色彩偏沉或对比过度的现象。如果目标是真实场景去雾,优先考虑那些在训练中混合了多种大气条件数据的工作。
2.5 图像去模糊:动态场景与未知模糊核的双重挑战
去模糊分为非盲去模糊和盲去模糊。非盲场景假设模糊核已知,退化模型清晰,问题退化成反卷积;盲去模糊则是模糊核未知,需要同时估计模糊核和恢复清晰图像,难度高出一个档次。ECCV2020的去模糊论文大多集中在盲去模糊和动态场景去模糊上。
动态场景带来的非均匀模糊是一个难点:不同像素位置的模糊方向和幅度不同,整图共享一个模糊核的假设不再成立。一种流行的解法是引入光流或多帧信息,通过相邻帧的运动估计来辅助当前帧的去模糊;单帧方法则更多依赖大规模合成模糊数据(比如模拟高速运动产生的拖影),让网络隐式学习模糊的多样模式。
同样需要注意,GOPRO这类合成数据集仍然覆盖不了所有真实运动模糊的类型。我见过不少模型在合成数据上指标很好,遇到手持夜景长曝光拍摄的模糊却“翻车”,因为这类模糊往往夹杂噪声和颜色偏移。所以把去模糊应用在实际场景中时,最好配合一个轻量级的真实模糊数据集微调环节,甚至需要对输出做一次锐化后处理。
2.6 图像重建/恢复的统一视角与扩展方向
把超分、去噪、去雨、去雾、去模糊放在一起看,会发现它们在数学上共享同一套逆问题框架:从带退化的观测中恢复干净图像,区别只在于退化算子的具体形式不同。ECCV2020里已经有一些工作尝试把多种退化任务统一在一个模型里处理,比如在训练时通过退化条件向量控制模型行为,实现“一个模型多任务复用”。这类设计的意义不仅在节省参数,更在于利用不同退化任务之间的共性,让模型在某一特定任务上获得更好的泛化。
此外,弱光增强、图像复原等方向也可以归入这个扩展谱系。它们面对的问题本质都是低质量输入到高质量输出的映射,工程实现上经常共享编码器-解码器结构、感知损失、GAN对抗训练这些配方。我在调研时建议大家不要只盯着自己手头的任务,把相邻任务的做法也扫一遍,往往能在损失函数设计或特征融合模块上获得可以迁移的灵感。
3. 高效检索ECCV2020底层视觉论文的完整路径
3.1 第一步:生成全量子方向论文清单
不要一上来就通过某篇文章的引用链跳来跳去,那样永远看不全。正确的方式是拿到ECCV2020的完整论文列表,然后用关键词筛选。
具体操作:先把官方论文标题、摘要和ID抓下来,这一步可以用爬虫,也可以直接借助GitHub上已有的顶会论文清单项目。搜索关键词时,除了完整单词,还要注意缩写和变体:
- 超分辨率:super-resolution、super resolution、SR
- 图像恢复/重建:image restoration、image reconstruction、low-level vision
- 去噪:denoising、noise removal、image denoise
- 去雨:deraining、rain streak、rain removal
- 去雾:dehazing、haze removal、atmospheric scattering
- 去模糊:deblurring、motion blur、blind deblurring
- 相关扩展:image enhancement、low-light、degradation、inverse problem
把关键词组合成多条检索式分别过滤,每一轮都保留命中论文的ID和标题,最后做一次并集去重。这个过程大概半小时能完成,但之后调研的完整度就有了保证。
3.2 第二步:用GitHub挖掘开源代码和实现质量
拿到论文清单后,判断哪些能直接进入复现是效率的关键。我的标准流程是:每篇候选论文在GitHub上搜索“论文方法名”或“论文名词+关键词”。搜索结果里优先看标注了官方代码的仓库,其次是star数和更新时间都正常的第三方复现。
还要留意仓库的可读性:README里有没有写清楚环境版本、数据集的下载方式、训练启动命令?代码是完整训练脚本还是只有测试脚本?有没有附带预训练权重?这三点直接决定复现成本。实际调研中,有些工作论文写得漂亮,但代码仓库缺依赖、少数据预处理脚本,我通常直接把这样的仓库标记为“仅阅读,不优先复现”。
如果论文没有官方开源,也不要立刻放弃,可以去平台化的论文代码聚合站(如Papers with Code)上看看有没有高星第三方复现,注意对照原论文的实验数据和第三方复现的结果是否接近。这个步骤能帮你省下盲目重写模型的时间。
3.3 第三步:按主题分组精读并建立笔记矩阵
筛选和查代码只是准备工作,真正有价值的是把论文读成一张知识网络。我的做法很朴素:先按大的子方向分组,再用“技术模块”而不是“论文单位”重新切片。比如超分方向里,所有用到通道注意力的工作放在一组看,所有做了退化建模的工作放在另一组看,这样的横向比较能非常清晰地暴露技术迭代的脉络:谁先提出、谁改进、谁合并了多种机制。
阅读每篇论文时,记下一个固定模板:核心解决什么问题、方法的主要模块、训练数据与评测数据集、关键指标、代码状态、复现堵点在哪。表格格式比长篇文字笔记更适合后续检索。积累二三十篇之后,你对这个方向的方法谱系基本就了如指掌了。
4. 复现与验证的实操经验
4.1 复现环境的推荐配置与依赖选择
ECCV2020时代的底层视觉代码,绝大多数跑在PyTorch上,环境相对好配。我建议的基础环境是:Python 3.7或3.8、PyTorch 1.6到1.8之间、CUDA 10.2或11.0。无需过于追求新版本,很多老代码在新版PyTorch下会踩到torchvision接口变化或分布式API调整,反而不如用一个与代码发布时间接近的版本稳定。
显存方面,一个标准的超分训练任务(输入patch 48×48、batch size 16、尺度×4)大概需要8GB以上显存才比较舒服,12GB以上可以跑更复杂的注意力模型。如果只有小显存,优先减小batch size,而不是缩小patch,因为patch太大会影响感受野。为了稳定复现随机性,建议固定随机种子,并在代码里关闭cudnn的自动tuning。
4.2 常用数据集的获取与预处理细节
底层视觉论文的实验数据集高度标准化,我把常用数据集总结成下面这张速查表:
| 数据集 | 主要用途 | 规模 | 获取要点 |
|---|---|---|---|
| DIV2K | 超分、去噪通用训练集 | 800张训练、100张验证 | 高分辨率原图,按退化方式预处理 |
| Flickr2K | 超分、去噪扩展训练集 | 2650张高清图 | 常与DIV2K合并训练 |
| Set5 / Set14 | 超分经典测试集 | 5张 / 14张 | 小规模快速验证 |
| B100 (BSD100) | 超分、去噪通用测试集 | 100张 | 自然图像,纹理多样 |
| Urban100 | 超分测试集 | 100张建筑图 | 包含大量重复结构,考验结构恢复 |
| Rain100H / Rain100L | 单图像去雨测试集 | 雨强不同 | 注意区分合成域与真实域 |
| RESIDE | 去雾训练与测试 | 大规模合成雾 | 包含室内外场景、多种大气条件 |
| GOPRO | 去模糊训练与测试 | 多组动态模糊序列 | 由高速摄影模拟模糊生成 |
| SIDD / DND | 真实去噪训练与测试 | 真实相机噪声 | ground truth多为多帧平均 |
预处理阶段最常踩的坑是数据范围不一致:有的代码把图像归一化到[0,1],有的归一化到[-1,1],两个范围直接决定损失函数的初始化状态,切换到不匹配的代码时结果会离谱地差。我在每次复现前都会先确认数据加载部分的归一化逻辑,再跑一行代码检查样本张量的数值范围,这个习惯帮我避开过好几天的无效调试。
4.3 训练参数的经验值与损失函数设计逻辑
以超分为例,一个稳定可复现的训练配置大概是这样的:输入patch裁剪48×48(原图区域),batch size设为16,优化器用Adam,初始学习率1e-4,训练约300到500个epoch时把学习率降到1e-5。损失函数首选L1损失而不是L2,因为L1在像素级回归上更利于保留边缘锐度,L2容易让结果偏平滑。追求更高感知质量时,可以在主损失之外叠加感知损失(通常在预训练VGG网络的relu层计算特征距离),或者加入GAN对抗损失来增强纹理真实感。但要注意,对抗损失可能让PSNR/SSIM下降,这属于指标与感知体验的权衡,不是bug。调整损失权重时要同步监控可视化结果,不能只看指标曲线。
4.4 PSNR与SSIM计算的几个细节坑
底层视觉论文的指标计算有一套隐含约定,很多复现掉点就掉在这里。
第一个坑:PSNR必须在Y通道计算。通用的做法是把RGB图像转到YCbCr颜色空间,只取Y通道计算PSNR。直接在RGB上计算会得到偏低的数值,和论文对不上。第二个坑:计算前要裁掉边界。超分任务里,测试图像往往会先按放大尺度裁掉一圈边界像素,原因是网络padding方式不同,边界像素的重建质量天然偏低。第三个坑:SSIM的实现参数,包括高斯窗口大小和标准差,不同库的默认值有差异,尽量使用论文作者提供的评测脚本。下面给一个参考的实现思路,用PyTorch或NumPy两步走:先转Y通道,再按边界裁剪,最后在Y通道上算指标。
import numpy as np from skimage.metrics import structural_similarity as ssim def rgb_to_y(rgb): # rgb: HxWx3, float, 范围 [0, 1] return np.dot(rgb[..., :3], [65.481, 128.553, 24.966]) / 255.0 + 16.0 def eval_psnr_ssim(pred, gt, scale=4, border=None): if border is None: border = scale pred_y = rgb_to_y(pred)[border:-border, border:-border] gt_y = rgb_to_y(gt)[border:-border, border:-border] mse = np.mean((pred_y - gt_y) ** 2) psnr = 10 * np.log10(255.0 * 255.0 / mse) ssim_val = ssim(gt_y, pred_y, data_range=255) return psnr, ssim_val这段逻辑是复现中的常用套路,但我还是要强调:不同论文对边界裁剪和颜色空间处理的细节有差异,最稳妥的方式永远是找到作者公开的评测代码,对照着复核。
4.5 复现过程中的高频踩坑记录
我在复现这批ECCV2020论文时遇到了几类高频问题,逐一记录一下。
数据加载慢是最常见的问题。尤其是DIV2K和Flickr2K这类高分辨率图像,每次在线做随机裁剪再增强,CPU会成为瓶颈。解决方式是把图像预处理成HDF5或npy格式,训练时用内存映射读取,速度提升非常明显。训练不收敛的情况,优先检查数据归一化和学习率,很多时候是归一化范围不对导致初始loss就异常。显存不够时,除了减小batch size,还可以尝试梯度累计,每几个step做一次参数更新,效果上接近大batch训练。超分输出出现周期性棋盘伪影时,肯定是转置卷积使用不当,改用PixelShuffle上采样几乎都能解决。
5. 常见问题与排查技巧速查表
| 问题现象 | 可能原因 | 排查与解决方案 |
|---|---|---|
| 复现PSNR与论文差0.5dB以上 | 指标在RGB全通道计算、边界未裁、Y通道转换公式不统一 | 对照作者评测脚本,统一颜色空间与边界裁剪 |
| Loss下降缓慢或震荡 | 学习率过大、batch size过小、数据归一化不一致 | 降低初始lr,增大batch或使用梯度累计,检查输入像素范围 |
| 训练到后期过拟合 | 训练数据少、增强强度不够 | 增加随机旋转、水平翻转,或引入CutMix等更强增强 |
| 超分结果出现规律网格 | PixelShuffle通道顺序不匹配、转置卷积产生重叠 | 核查通道重排逻辑,上采样层统一改PixelShuffle |
| 真实雨图上效果明显变差 | 合成与真实域差距 | 在真实雨图数据上做微调,或选择多退化混合训练的方法 |
| 去雾结果偏暗 | 大气光或透射率估计偏离,端到端训练物理约束弱 | 增加透射率/大气光中间监督,或降低全局损失权重 |
| 真实噪声降噪后过于平滑 | 模型将纹理当作噪声滤除 | 增加感知损失或高频保留损失,引入成对真实噪声数据 |
| 视频去模糊出现闪烁 | 单帧独立处理缺乏时序一致性 | 引入光流对齐模块或时序卷积层 |
这组排查项是我在复现和实际应用过程中沉淀下来的,不是从哪篇论文里直接抄的结论。遇到问题时优先怀疑数据管道而不是模型结构,这个习惯能省下大量无效调试时间。
我个人在整理这些论文时最深的体会是:底层视觉方向的论文看起来门槛低——无非是配环境、下数据、跑实验——但真正拉开差距的地方恰恰是那些论文里不会写的细节,比如指标计算方式、边界处理策略、数据增广强度、优化器配置。想要把别人的方法真正变成自己的工具,光读PDF远远不够,动手复现时把每个环节都做扎实,才算真正把这篇论文消化掉。后续这个主题的论文清单和代码状态,我会在实际复现和项目应用过程中持续补充更新,把值得跟进的模型和仓库逐步加进来。