资讯详情

双判别器与感知损失:生成对抗网络助力水下图像增强

📅 2026/10/14 1:24:30 | 华诺云谱 👁 阅读
双判别器与感知损失:生成对抗网络助力水下图像增强
水下图像增强这个方向我盯着它挺久了。第一次读到这篇论文的标题时我正被一堆水下图像搞得头疼——要么整张图绿得发慌要么对比度低到没法看传统的去雾算法套上去总差点意思。这篇论文的做法很直接用深度CNN配生成对抗机制把水下图像一键拉回正常颜色和对比度而且在结构思路上给后续研究留下了不少可借鉴的东西。这篇论文做的核心事情简单说就是训练一个生成器输入是典型的水下退化图像输出是增强后的清晰图像。为了保证输出不是“看着还行但细节崩了”它一口气塞了两个判别器一个盯全局色彩和纹理一个专门盯局部小块区域。同时损失函数里还加了基于经典VGG网络的感知损失用高层语义特征来约束生成结果。这套组合拳下来增强图像既保住了内容结构又兼顾了纹理真实感。如果你是在做水下机器人视觉、海洋渔业观测、水下考古影像处理或者纯粹是想看看生成对抗网络在图像复原领域怎么落地这篇论文都值得认真读一遍。下面我把论文的思路、损失设计、训练要点和我的复现经验一条条拆开讲。1. 水下图像增强到底在解决什么问题1.1 为什么水下图像总是绿油油的水下成像的退化原因物理上讲就三件事吸收、散射、颜色衰减。可见光在水里传播时不同波长的光衰减速率完全不一样。红光波长长能量低在水里没走几米就被水分子吸收得差不多了绿光和蓝光波长短穿透能力强能走得更远。这就是为什么大多数水下照片都自带青绿色滤镜。往深了潜蓝绿色也扛不住整个画面就只剩昏暗的一团。散射则是悬浮颗粒物干的好事。海水里并不干净泥沙、浮游生物、有机碎屑到处都是光线照到这些颗粒上会被反弹、折射最后进入镜头的除了目标反射光还混了大量杂散光。这就像大雾天开车开远光灯眼前白茫茫一片图像细节被彻底淹没。这两个因素叠加就形成了水下图像的三大典型症状颜色偏色严重通常是蓝绿色主导红色通道信息几乎丢失对比度极低暗部细节基本看不见灰度直方图挤在很窄的范围里整体模糊边缘和纹理信息被散射抹平类似轻微离焦这些退化不是均匀分布的同一个画面里近处的物体颜色可能还算正常远处的背景已经蓝成一团。这也是为什么很多传统全局处理方法都容易翻车。1.2 经典去雾方法为什么水土不服很多刚接触这个方向的人会想水下图像不就是“雾蒙蒙”的吗直接用大气去雾算法行不行答案是行但效果很一般。以暗通道先验为代表的去雾算法数学上依赖于一个假设户外无雾图像里至少有一个颜色通道的强度接近零。这个假设在晴天户外的确成立但水下环境的光谱分布完全不一样红光通道早就被水吸收干净了暗通道先验算出来的透射率会严重偏移直接套用会导致输出色偏更严重甚至产生伪影。说白了它是为“空气中悬浮小颗粒”建模的水下的大颗粒散射和波长选择性吸收它根本没建模。另一种思路是直方图均衡化和白平衡。前者能拉伸对比度但它是全图做全局变换水下图像的退化随深度和位置变化全局处理不可能兼顾所有区域。白平衡假设图像中存在“灰色参考点”水下图像里这个假设几乎不成立硬套的结果就是颜色被矫枉过正出现一种塑料感的失真色调。所以水下图像增强真正需要的是一个能够学习水下场景特有退化模式、并能逐像素有条件地进行色彩和细节恢复的模型。这就把方向指向了数据驱动的深度学习尤其是生成对抗网络这种擅长从数据中学分布映射的方案。2. 论文核心思路让生成器学会“去水下化”2.1 整体框架生成器加双判别器这篇论文的框架属于生成对抗网络的一种应用变体设计上有一个很清晰的思路把“从水下退化图到清晰图”的映射交给一个生成器网络去学同时用两个判别器不断“挑刺”逼着生成器把图修得越来越像真实的自然光照下的图像。整个结构可以拆成三块生成器G输入退化水下图像输出增强图像全局判别器判断整张图到底是“真实的清晰图像”还是“生成器吐出来的图像”局部判别器随机从图像中裁切若干小块逐个判断每个小块是真是假为什么拆两个判别器这个设计很有讲究。如果你只用全局判别器模型会倾向于修正整体颜色统计量比如把平均色调拉回正常但局部纹理细节可能依然糊成一团。反过来如果只看局部块模型可能在色块分布上放飞自我全局颜色变得混乱。两个判别器一起上一个管宏观风格一个管微观结构正好互补。选生成对抗网络而不是普通回归CNN也有一个很实际的理由普通CNN用像素级损失训练目标函数把输出推向所有可能结果的“平均”所以图像会显得平滑、发糊。生成对抗网络多了一个不断进化的判别器当对手生成器只有输出足够真实、足够锐利的纹理才能赢下博弈这种对抗性压力正是细节恢复所需要的。2.2 生成器的设计逻辑生成器本身走的是典型的编码器-解码器路线。编码器部分通过卷积逐级下采样把输入图像压缩成高维特征图这一步的本质是提取“这棵水草长什么样、这条鱼的轮廓在哪”等语义信息。解码器部分通过上采样逐步恢复分辨率输出增强后的图像。这里有一个细节很关键单纯的编码-解码结构会把很多高频细节弄丢所以通常会在中间加残差连接或跳跃连接把浅层的边缘信息直接拼到解码器对应层。论文虽然没在结构层面做特别花哨的改动但把重点放在了损失函数上。这也是我觉得这篇论文最有价值的地方——它证明了在不算复杂的生成器架构下损失设计对增强效果的影响可能比堆叠网络层数更大。生成器最后一层一般会用tanh激活函数把输出像素值压缩到一个固定的范围和图像归一化区间对齐。中间层则配合卷积、批归一化和ReLU的组合下采样步长取2上采样用转置卷积或双线性插值加卷积两种方式我实测下来效果差异不大转置卷积更容易出现棋盘格伪影用插值更稳一些。2.3 双判别器如何分工全局判别器拿到的输入是完整图像。它通过下采样卷积最终输出一个标量表示输入图像属于“真实清晰图像”的概率。它关注的重点是整体风格色温是否自然、明暗对比是否合理、全局纹理是否真实。局部判别器的输入不是整张图而是从图像中随机采样的固定尺寸小块。做法通常是从输出图像和真实参考图中各随机裁出若干个块比如16x16或32x32大小再输入判别器。因为块很小判别器被迫关注局部细节纹理这块区域有没有模糊边缘是不是锐利有没有奇怪的伪影这种“全局风格加局部细节”的分工思路如今已经被大量图像生成与复原工作借鉴。当时能想到用局部判别器来弥补整体均值的短板确实是有洞察力的设计。实际使用中两个判别器可以共享一部分底层卷积层减少参数量和训练开销不过论文里更多是各自独立的网络复现起来更直接。3. 损失函数怎么设计细节决定成败CNN生成模型跑出来的效果很大程度上由损失函数决定。这篇论文把损失分成了三个部分对抗损失、感知损失以及常规的内容约束。它们各管一摊少了谁都会出问题。3.1 对抗损失让生成图“看起来真实”对抗损失是整个生成对抗网络家族的核心。判别器的任务是区分真假生成器的任务是骗过判别器两边的目标完全相反于是形成动态博弈过程。用公式表达生成器的对抗损失可以写成L_adv -E[log D(G(I))]判别器的损失则是标准的二分类交叉熵既要正确识别真实清晰图像为“真”也要识别生成图像为“假”。训练时二者交替更新判别器先变强生成器再变强循环往复。在这篇论文里全局判别器和局部判别器各自计算对抗损失最后相加。我个人复现时的体会是局部判别器对训练稳定性影响非常明显如果局部块裁得太小模型容易陷入高频噪声疯狂生成的模式输出图放大一看全是噪点如果裁得太大又跟全局判别器的功能重叠了。建议从16x16起步根据输出分辨率微调多试几组再定。对抗损失还有一个特点它本身是没有“上限约束”的理论上生成器可能为了骗过判别器而输出极端颜色。所以它必须搭配内容约束一起使用这也是下一小节感知损失存在的重要原因。3.2 感知损失不要让像素值绑架生成结果如果只用对抗损失生成器经常会出现“自说自话”的问题生成的图像可能整体观感还行但内容和原图对不上号比如鱼的位置歪了、珊瑚的结构被扭曲了。原因是对抗损失只关心“像不像真实图像”不关心“内容对不对”。为了把内容也锁住论文引入感知损失用预训练VGG网络提取图像特征在特征空间里计算生成图与目标图之间的距离。VGG网络因为在大规模分类任务上训练过它的高层特征向量天然携带了丰富的语义信息两张图在VGG特征空间越接近说明它们在语义内容上越一致。感知损失的计算过程是这样的分别把生成图像和目标图像输入同一个预训练VGG网络取若干层的特征图一般用浅层和中层的组合对同一层的特征图计算L1或L2距离加权求和为什么不在像素空间直接算L1损失因为像素级L2/L1会把生成器朝“平均化”方向推。大类图像复原任务里都有这个现象L2损失目标下模型面对多个可能的合理解会倾向于输出它们的加权平均于是结果必然是模糊的。特征空间的距离则宽容得多只要语义一致、边缘位置大致对上就放行给生成器留出了“用更真实的纹理来满足约束”的余地。3.3 权重配比一切模型调参的归宿总损失函数大致长这样L_total L_adv_global L_adv_local λ * L_perceptualλ是感知损失的权重系数。论文实验里λ的取值会影响最终效果的风格倾向λ太小对抗损失占主导输出图像可能颜色很鲜艳但内容失真λ太大图像结构稳定但纹理显得平滑甚至有一种水彩画的涂抹感。我当时复现做了多组对比λ从0.5到100都试过最终在1到10之间的结果最均衡。具体最优值跟数据集有关我建议不要迷信某一固定值而是跑完一组训练后把中间结果可视化盯着看生成图有没有明显的伪影或模糊再回头调权重。还有个容易被忽略的细节感知损失和对抗损失在训练初期不在同一个量级。如果直接相加感知损失的梯度可能瞬间把方向带偏。我习惯在训练开始时让对抗损失的表现略占上风比如先用较小λ等判别器稳定后再把λ提上来或者用学习率调度器控制两部分的相对步长。这个操作在项目日志里看起来不起眼但对最终收敛质量影响很大。4. 训练数据与实验设置4.1 水下图像数据集怎么准备训练这套模型需要两类数据一类是真实水下拍摄的低质量图像另一类是对应的清晰参考图。问题在于真实水下环境里很难同时拿到“同一场景、不同水质”的成对图像所以数据准备是整个流程最头疼的一环。目前常见的方案有几种使用合成数据基于水下成像模型从清晰图像模拟不同深度、不同水质的退化效果生成成对训练数据。好处是配对精准坏处是模拟参数和真实水体分布总有差距使用真实成对数据在特定拍摄条件下同一场景用不同设备或不同时间采集人工对齐。数据量少但真实性强使用不成对数据借助循环一致性思想做无监督训练作为补充或预训练手段我个人的建议是不要只依赖纯合成数据否则模型容易过拟合到模拟参数的空间里遇到真实水下图像时任性的水质分布还是会露馅。实际操作中我会把合成数据和少量真实数据混在一起并按场景多样性做筛选避免某一种水体颜色在训练集里占主导。比如绿藻多的浅水和浑浊泥沙水各留一部分蓝水深度场景也留一部分这比盲目堆数据量更管用。4.2 训练参数与收敛技巧训练生成对抗网络的经典配置这里基本都能套用优化器Adam学习率0.0002beta1取0.5。偏置设低一点能让对抗训练更稳批量大小因为要同时跑生成器和两个判别器显存压力大批量大小通常取1到4图像尺寸论文及大多数复现使用256x256分辨率。过小细节恢复能力差过大会让训练速度大幅下降迭代次数一般在100到200轮左右能看到明显效果但判别器容易先收敛需要随时监测训练过程中要注意判别器和生成器的平衡。一个比较实用的检查手段是记录两者的损失曲线如果判别器损失快速掉到接近0说明它太强了生成器一出生就被压得学不到东西如果判别器损失一直在高位抖动说明区分能力不足生成器可能在自嗨。出现这些情况可以考虑给判别器加谱归一化、降低判别器学习率或者减少判别器的更新频率。数据增强也不要省。随机水平翻转、随机裁切、小角度旋转变换以及适度的颜色抖动都能有效扩充样本多样性。这里有一个小技巧颜色抖动不能太夸张否则模拟出的水下退化模式会被破坏反而引入了不必要的噪声。5. 实验结果怎么看主观之外还要看指标5.1 常用评价指标理解水下图像增强的效果评价远没有分类任务那样简单。因为真实水下图像很难拿到对应的参考图有参考和无参考的指标都得看。有参考指标里最常用的是PSNR和SSIM。PSNR衡量像素层面的重建误差数值越高越好SSIM衡量结构相似性接近1说明结构保持得好。但这两个指标都有各自的毛病PSNR对全局色彩偏移的惩罚很敏感一个轻微的色温变化都会让它大幅波动SSIM对局部对比度更敏感但不一定能反映人眼对“是否自然”的感受。所以现在水下图像增强的工作普遍还会报告无参考指标比如UIQM和UCIQE。UIQM从色彩、清晰度、对比度三个维度综合打分UCIQE偏向色度信息和对比度的结合。这类指标不需要参考图直接对增强结果评估适合真实水下场景的测试。读论文的实验表格时一个很容易踩的坑是某些指标提升很大但视觉效果却变差了。这种情况往往是因为优化目标恰好和某个指标的计算方式契合比如模型学会了把对比度拉满但色彩失真了PSNR可能还涨了。所以我的习惯是指标可以辅助判断但最终结论一定以肉眼对比为准尤其是看大尺寸原图和局部放大图。5.2 论文实验结果带给我的启发论文展示的增强效果最明显的改善有两处一是色偏被大幅纠正原本青绿色的画面恢复到接近自然光下的颜色二是细节纹理的清晰度显著提升水草边缘、鱼鳞纹理这些原本被散射糊掉的结构变得锐利。跟当时的传统方法对比基于CNN的方法在复杂场景下的稳健性是最明显的优势。传统方法每张图都需要调参不同水质、不同深度可能需要完全不同的前置处理而CNN模型一旦训好推理时就是一张图直接前向跑一遍速度快且不需要人工干预。这在工程落地上意义很大比如水下机器人实时视频流的增强传统算法很难同时满足泛化性和实时性要求深度模型却很从容。当然论文方法也有局限训练数据如果以浅水区和特定水质为主模型在浑浊深水区的表现就会下滑生成图像偶尔会出现细节被平滑的倾向。这些短板也意味着后续的改进空间很大。事实上后来的不少水下增强工作都在这个框架上做文章——有的换更深的生成器有的加注意力机制有的用多尺度结构但“双判别器加感知损失”这套组合的思想内核在很长一段时间里都是绕不开的参考系。6. 复现时的实操笔记与避坑指南6.1 一个可以落地的代码骨架如果打算从零复现我会建议按下面这个顺序搭建加载预训练VGG19并冻结参数只用它提取特征计算感知损失搭建生成器网络编码器卷积、残差块堆叠、解码器上采样中间加跳跃连接搭建两个判别器全局判别器最后输出标量局部判别器输入固定尺寸块结构可以浅一些定义总的训练循环交替更新判别器和生成器每固定轮数保存生成器权重并用一张验证图做可视化对比代码层面有几点提升效率的经验感知损失的特征提取尽量在GPU上完成但VGG参数一定要置为评估模式且不计算梯度否则显存会被无谓地占满。局部判别器所需的随机裁切操作最好用数据加载器自带的多进程完成别在前向传播里写Python循环否则一卡就是一堆。还有一个细节很多人在训练生成对抗网络时习惯把图像归一化到[-1, 1]用tanh作为生成器输出层的激活函数。这样输出图像的像素范围刚好和归一化区间吻合梯度传播也更顺畅。如果不注意这一点直接用sigmoid把输出压到[0,1]再配合归一化到[-1,1]的判别器输入非常容易出现判别器无法收敛的情况。6.2 我踩过的几个坑第一个坑是局部判别器的patch尺寸。我一开始为了图快把patch定成了8x8结果生成出来的图像整体颜色是对的但放大看全是高频噪声点就像加了噪点滤镜。后来把patch改到32x32并保证每张图裁多个块做平均噪声问题才压下去。第二个坑是感知损失的层选择。取太多深层特征会导致输出图像跟参考图像在语义上对齐得很好但颜色微小的偏差被忽略整体观感不够透亮。取太浅的层又变成了像素损失模糊问题回归。我最后锁定在relu2_2和relu3_4两层各取一半权重效果最稳。第三个坑跟判别器的更新频率有关。我一开始生成器和判别器每次迭代同步更新结果训练没几十轮就出现生成器直接把判别器“骗穿”的现象损失曲线乱跳。后来改成判别器每更新两次生成器才更新一次并关闭了批量归一化的训练模式切换训练过程才稳定下来。这个策略不一定最优但在小数据集上确实更保险。第四个坑在数据预处理。水下图像的亮度动态范围很大有些图暗到黑乎乎一片。如果不做任何亮度和对比度的预归一化模型会把“变亮”和“增强”混为一谈训练出来的东西只是提亮滤镜。我在预处理里额外加了一步基于场景的直方图拉伸只保证输入图像的亮度范围不至于溢出效果好了很多。6.3 常见问题速查现象可能原因处理方法生成图像有大量高频噪点局部patch尺寸过小、对抗损失权重过高增大patch尺寸降低对抗损失占比输出颜色偏灰、发闷感知损失权重过高减小感知损失权重让对抗损失多发挥训练早期损失剧烈震荡判别器与生成器不平衡降低判别器学习率或减少其更新频率输出内容与原图不一致数据对齐不准确、感知损失权重过低检查训练样本适当增加感知损失在真实水下图上效果下滑训练数据以合成数据为主加入真实数据微调增加数据多样性显存不够双判别器加VGG同时占显存减小批量大小、对VGG做梯度截断、用混合精度训练以上这些坑踩一遍比读十遍论文记得都牢。尤其是patch尺寸和损失权重我后来在别的图像复原项目里也反复遇到几乎成了每次复现前必查的两项。最后分享一个我自己的体会。这篇论文最值得学习的并不是某个花哨的模块而是它对“问题拆解”的思路——水下图像增强不是单一任务它同时包含全局色彩恢复和局部细节重建所以作者设计了两个判别器分别对应这两种需求同时它又清楚对抗损失管不住内容保真度所以引入感知损失来补位。这种“把任务拆细再给每个子任务配一个合适的约束”的思路拿到任何图像复原场景里都成立。我后来在另一个图像增强项目里也套用了“双判别器加感知损失”的框架只不过把局部判别器的patch换成了带注意力机制的加权方式效果比原版更均匀。如果你打算复现这个工作建议先从最小配置跑通再用验证集盯着输出一步步把损失权重和patch尺寸调到顺手为止。这条路上没有一步到位的配置只有不断试出来的经验值。
📝

华诺云谱内容团队

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

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

你可能需要的服务

订阅华诺云谱资讯周报

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

↑