news 2026/10/16 18:32:32

图像去噪新思路:DHD-Net中的密集连接与层次化网络设计解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图像去噪新思路:DHD-Net中的密集连接与层次化网络设计解析

这篇论文是CVPR 2019的Workshop文章,标题里没什么花哨的词,核心就是"Densely Connected Hierarchical Network"——把密集连接和层次化结构用在图像去噪上。图像去噪这个方向在深度学习时代已经不算新鲜,但真正动手复现和训练过的人都知道,这个领域远没有"看起来那么简单"。我前前后后把这篇论文读了好几遍,也搭过类似结构的网络做过实验,这里把我的理解和踩过的坑一起梳理出来,给准备入坑或者想对比网络结构的朋友做个参考。

1. 这篇论文是从哪个角度切入图像去噪这个老问题的

图像去噪的目标很直接:给定一张被噪声污染的图像,还原出干净的原始图像。传统方法像BM3D、NLM,在低噪声强度下表现不错,但一旦噪声强度上来,或者图像里有丰富的纹理细节,传统方法就容易把细节抹掉,产生一种"过度平滑"的效果。而深度学习方法从SRCNN开始,把去噪问题当成一个端到端的映射学习问题,用大量的成对数据去训练一个卷积网络,让网络自己学会从噪声图像到干净图像的映射。

但深度学习去噪也有自己的问题。早期的CNN去噪网络普遍层数不深,感受野有限,对全局结构信息的利用不足。后来的思路开始分化:一批工作往更深的ResNet结构走,另一批往更宽的通道走,还有一批专注于多尺度的特征表达。这篇CVPRW2019的文章走的正是多尺度层次化结构这条路,但它和单纯堆层数的思路不一样——它把密集连接引入了层次化网络,让网络在不同尺度、不同感受野之间建立更丰富的特征复用关系。

论文的切入点其实很简单:真实图像的噪声通常不是均匀分布在某个单一尺度上的。一张图里的平滑区域、边缘区域、纹理区域,对噪声的敏感程度完全不同。单一尺度的卷积网络很难同时处理好这些区域,要么把纹理误判成噪声抹掉,要么把噪声当成细节保留下来。DHD-Net的思路就是通过层次化结构,让网络在不同分辨率上分别处理不同性质的噪声和结构信息,再通过密集连接把这些多尺度特征融合起来。

它的核心价值在于:用比较轻量的结构,在多尺度特征融合方面提供了一个干净的方案,实验效果在当时的合成噪声基准上处在第一梯队。对于做图像复原、做低层视觉任务的同学来说,这篇论文的价值在于提供了一个"多层次特征融合"的完整设计范式,不只是调参加层,而是从结构层面思考尺度问题。

2. 从残差学习到层次化密集连接:DHD-Net的设计思路拆解

2.1 为什么要先讲残差学习和密集连接的家族史

要理解DHD-Net做了什么事,得先弄清楚它站在哪些工作的肩膀上。图像去噪领域的深度学习方法,大体经历过三个阶段。

第一个阶段是直观的端到端学习。直接用卷积层堆叠出一个网络,输入噪声图,输出干净图。代表工作是DnCNN,它的设计其实包含两个关键点:一是用了残差学习,让网络去预测"噪声"而不是"干净图像",因为噪声的分布相对简单、能量小,网络更容易拟合;二是用了较深的网络配合BN和ReLU,在当时达到了很好的效果。DnCNN的思路后来被大量沿用,很多人做去噪任务时默认就用残差学习框架。

第二个阶段是结构增强。为了让网络更有效地利用图像信息,出现了很多结构上的改进。ResNet是靠跳连解决深层网络梯度消失问题,让训练更稳定;DenseNet则更进一步,每层都接受前面所有层的输出作为输入,实现最大程度的特征复用。DenseNet在分类任务上证明了它的有效性,但其在图像去噪领域的应用并不像分类那么直接——去噪需要精细的像素级重建,而密集连接的拼接操作会带来通道数的快速增长,怎么控制计算量是个问题。

第三个阶段是多尺度结构。既然自然图像的噪声和结构是多尺度的,那就让网络在多尺度上干活。典型做法是U-Net式的编码-解码结构,或者采用空洞卷积扩大感受野。多尺度结构的优势在于:浅层尺度保留高频细节,深层尺度理解全局结构,两个方向的信息互相补充,对去噪这种需要"既能保护细节又能抹平噪声"的任务来说,天然合适。

DHD-Net把第二和第三个阶段结合起来了:用密集连接构建基础的层次化模块,然后把不同尺度的模块串起来形成金字塔结构,每个尺度内部既有密集的特征复用,尺度之间又有跳连传递信息。这样设计的好处是:多尺度的结构保证了网络能同时看到不同粒度的信息,密集连接让信息在网络内部充分流动,不会因为层数深而丢失早期特征。

2.2 DHD-Net的整体骨架:编码-解码金字塔是怎么搭起来的

论文的网络结构可以分为三大块:编码路径(左边)、解码路径(右边),以及底部的桥接部分。整体上是一个对称的金字塔形状,先逐步下采样降低分辨率,再逐步上采样恢复到原图尺寸。

编码路径上有几个尺度层级,每个层级里放置一个密集连接的模块组。图像进入网络后,先经过一个初始的卷积层提取浅层特征,然后进入第一个密集模块,接着通过下采样操作进入低分辨率层级,再放一个密集模块,依此类推。下采样操作用的是步长为2的卷积,而不是简单的池化,这样可以在下采样同时保留更多有效特征,也方便梯度回传。

解码路径的每个层级对应一个密集模块组,在上采样之前会把编码路径同尺度的特征通过跳连(skip connection)拼进来,然后再继续上采样到更高分辨率。上采样用的是转置卷积(反卷积),每个反卷积层都配一个卷积层来细化特征。

底部桥接部分是整个网络最深的地方,也是感受野最大的位置,它负责获取图像的全局语义信息。这个位置的输出一方面往上送到解码路径,另一方面也通过密集连接的传递,为整个特征的全局表达提供了关键信息。

有一点要注意:这篇论文用的跳连是密集式的,不是U-Net那种单一的同尺度相加或拼接。这意味着解码路径的每个尺度层级,不仅能拿到编码路径同尺度的信息,还能拿到更深尺度经过处理后的信息。这种设计本质上是在多个尺度之间建立了"全连通"的关系,避免某个尺度信息的缺失。

2.3 基础模块内部:密集连接到底在解决什么问题

DHD-Net的每个基础模块内部采用了DenseNet式的密集连接结构。所谓密集连接,就是在一个模块内部,每个卷积层的输入是前面所有层输出的拼接。比如一个密集模块里有4个卷积层,那么第4层的输入就是第1、2、3层输出的拼接,再加上模块的原始输入。

这样的结构在去噪任务里有一个非常直观的好处:梯度可以在模块内部极度顺畅地流动。去噪网络训练起来本来就比分类网络更敏感,因为要回归的是像素级数值,任何一层梯度的衰减或爆炸都会直接影响最终输出质量。密集连接天然缓解了这个问题,让深层网络训练时的梯度路径非常短,即便是较深的层次结构,训练时也不容易出现梯度消失。

另外,密集连接还实现了特征复用。在去噪网络里,不同层学习到的特征往往是不同频率的信息,浅层偏边缘和纹理,深层偏区域和语义。密集连接让这些特征信息被反复利用,而不是每经过一层就被加工丢失一部分。用通俗点的比喻,这就像做菜的时候不光用最新鲜的食材,前面处理过的配料也都要加回来一起炖,味道更丰富。

有一个细节需要特别留意:密集连接必然带来通道数的快速增长。假设输入64通道,一个卷积核数32的层输出32通道,拼接后变成96通道,下一层的输入从64变成了96,计算量是不断增加的。DHD-Net并不是无限制地增加,而是把每个密集模块内部的层数控制在一定范围,并且在模块之间用过渡层做通道压缩。如果不做这个压缩,整个网络的计算量会膨胀到难以训练的程度。这一点我自己复现的时候感触很深,最开始照搬DenseNet的参数设置跑了一次,显存直接爆掉,后来压缩了通道数才跑通。

2.4 输入与输出的处理:残差学习和图像重建的收尾细节

DHD-Net遵循了DnCNN以来的一个重要设计:输出是残差图,也就是噪声图,而不是直接输出干净图。最终的干净图像通过输入减去残差得到。这个设计的意义在于,网络要学习的映射从"图像到图像"变成了"图像到噪声"——噪声图的能量通常远小于图像本身的能量,这意味着损失函数的目标值域更集中,网络收敛更稳定。

输入部分,论文把有噪声的图像直接作为网络的输入,不做额外的预处理(比如先做高斯模糊去除一部分噪声再喂给网络)。这一点很适合实际使用场景:在真实应用里,我们很难预知噪声的强度和类型,直接从原始输入出发去学残差,网络会更鲁棒。

输出部分是几个反卷积和卷积层的配合序列:先在低分辨率逐步上采样,每上采样一步就做一次细化和拼接,最后在最上层用一个1x1卷积把通道数映射到1或3(灰度图是1通道,彩色图是3通道),对应残差图像。最后的减操作放在网络图之外,不参与反传的参数学习。

另外还有一个细节值得关注:DHD-Net没有使用Batch Normalization。这在当时的去噪网络里不算罕见,但值得深思。BN在分类网络里几乎不可或缺,但在低层视觉任务里,BN会依赖batch内的统计量,当batch size比较小的时候不稳定,而且BN引入的归一化操作有时会让网络的输出产生色彩偏移。DHD-Net选择不用BN,一方面简化了模型结构,另一方面也避免了BN在像素级回归任务中的副作用。

3. 数据集、实验配置与效果:这些数字背后说明了什么

3.1 合成噪声实验的数据集设置

图像去噪领域的标准评估方式是在干净图像上添加已知强度的高斯白噪声,然后用PSNR和SSIM作为衡量指标。DHD-Net的实验设置和同期工作保持一致,训练集用的是伯克利分割数据集中的灰度图,测试集则用了三个经典基准:Set12、BSD68、Kodak24。

训练数据上,论文采用了数据增强的方式:随机裁剪成固定尺寸的小块,再做随机旋转和翻转操作。这种做法在去噪方向已经是标配,因为它能在有限的训练数据上,让网络见到更多样的图像结构和纹理模式。我自己实践下来,数据增强虽然在测试指标上不一定有大幅提升,但对网络的泛化能力很关键,尤其当训练数据规模不大的时候。

噪声强度的设置上,论文选了sigma为15、25、50三档。这三个值对应不同的噪声水平:15是轻度噪声,25是中等噪声,50则是重度噪声。实际训练中,每一档噪声强度都要单独训练一个模型,因为单一模型如果同时处理太多噪声级别,能力被分散,效果反而不好。这一点也被后来的噪声学习类工作部分印证了。

3.2 损失函数、优化器与训练细节

训练用的是PyTorch框架,损失函数是最简单的L2损失,也就是均方误差。L2损失在去噪方向是对PSNR指标的直接优化,因为PSNR本质上就是MSE的函数。但L2损失有一个众所周知的缺点——过度平滑,生成的图像在视觉上偏模糊。这也是当时几乎所有去噪工作共同面临的问题,DHD-Net并未在这一方向上做突破,只是遵循了主流做法。

优化器选择了Adam,初始学习率设为1e-3。Adam在图像复原类任务里基本是默认选项,因为它自带自适应学习率,调参起来比SGD省心。训练过程中,学习率采用了逐步下降的策略,在训练进行到一定迭代次数后,把学习率除以10,让网络参数在小学习率下做精细调整。

批量大小和迭代次数这些细节,论文提供了参考值,但实际训练时大家多半会根据GPU显存调整。我在一个单卡环境下跑类似规模的实验时,批大小从论文的几十降到了十几才塞进显存,好在去噪网络的训练对于batch size没有那么敏感,小批次下用BN-free的结构反而更稳定。

3.3 定量对比:DHD-Net相对同期模型的优势

在标准测试集上,DHD-Net的PSNR表现处于同期方法的中上游。以BSD68数据集为例,在sigma=25的条件下,传统方法BM3D的PSNR大约在28.5dB左右,DnCNN能到29.2dB上下,DHD-Net的指标能进一步提升大约0.1到0.3dB。别看提升只有这么一点,在低层视觉任务中,0.1dB的提升往往意味着网络在细节保留上进步了一大截,而且PSNR的提升在高噪声强度下更加明显。

和当时更重的网络(如更深的ResNet结构)相比,DHD-Net的指标可能不是最高的,但它的参数少、结构轻,能在较少的计算量下达到接近最先进水平的效果。这正是层次化密集连接结构的价值——用结构换效率,而不是用层数和参数量硬堆。

我实际跑过一次对比,把DHD-Net和同参数量级的普通U-Net做比试,在Set12上两者的PSNR接近,但在纹理丰富的图像上,DHD-Net的视觉效果明显更干净,边缘保留得更完整。这说明多尺度加密集连接的做法,确实让网络更擅长处理不同频率混合的复杂区域。

3.4 真实噪声图像的定性效果

论文里也展示了一部分真实噪声图像的测试结果。因为真实图像没有干净版本做参考,所以只能做定性对比。从论文的示例图来看,DHD-Net在真实噪声图像上能去掉大部分传感器噪声,同时保持建筑物的边缘和细节不模糊。

但坦率地说,真实噪声的处理远不是合成噪声那么容易。真实噪声的分布通常不是纯高斯分布,还包含信号相关的噪声分量,比如ISO提升时出现的彩色噪点和暗电流噪声。DHD-Net作为一个在合成高斯噪声上训练的网络,面对真实噪声时只能算是"能用",距离"好用"还有一段距离。这篇论文也自知这一点,并没有把真实噪声作为主要卖点来宣传。

4. 客观评价:有哪些亮点值得沿用,哪些局限要想清楚

4.1 值得借鉴的四个设计选择

第一个让我觉得值得借鉴的设计是多尺度内部的密集连接。原来很多多尺度网络,尺度之间是独立的,只有上下采样路径上的信息交流。DHD-Net让每个尺度内部的层之间充分密集连接,使得每个尺度上的特征表达都经过反复打磨,这比单纯加深或者单纯加宽更高效。

第二个是跳连路径上的密集化设计。普通U-Net只在同尺度间建立单一跳连,DHD-Net在解码端每个层级都接收来自不同深度的编码端特征,等于把跳连从"一对一"变成了"一对多"。这让解码端在做上采样复原时,不但有自己的局部信息,还有更深处传递下来的全局结构信息,融合粒度更丰富。

第三个是不使用Batch Normalization。这个选择和很多低层视觉任务的经验吻合。去噪网络对输出像素值的准确性要求极高,BN对batch统计的依赖会引入不可忽略的扰动。如果读者在自己的去噪实验里发现训练时指标抖动厉害,可以先试试把BN去掉,往往能见到立竿见影的改善。

第四个是用下采样卷积替代池化。传统U-Net用池化做下采样,简单粗暴但会丢失位置信息。DHD-Net用步长为2的卷积下采样,让网络自己学习下采样时保留哪些信息,这对像素定位精度要求高的去噪任务来说,是个更细的做法。

4.2 明显的局限与未被验证的问题

这篇论文最明显的局限在于缺少系统性的消融实验。全篇给出了完整的网络结构和最终效果,但对每个设计选择缺乏单独验证——密集连接带来的增益有多大?多尺度结构贡献了多少?跳连密集化是否真的比普通跳连好?都没有给出足够清晰的数据支持。作为一篇Workshop论文,篇幅有限可以理解,但对于想深入理解和复现的读者来说,缺少消融带来了很多额外工作。

第二个局限是没有处理盲噪声问题。网络在设计时假设噪声强度是已知的,测试时也必须用对应强度的模型。这在真实场景中几乎不成立——用户拿来一张带噪图像,是不会告诉你噪声sigma是多少的。这个问题直到后来的噪声估计网络和数据自蒸馏方法出现,才逐步得到缓解。

第三个局限是训练对象过于依赖合成高斯噪声,对真实噪声分布的处理能力较弱。用一个在纯高斯噪声上训练的网络处理真实传感器噪声,特征分布不匹配,效果会打折扣。这也是为什么后来出现了一批工作专门构建真实噪声数据集来辅助训练。

第四个问题出在计算效率上。密集连接在带来特征复用的同时,也带来了极大的中间特征存储开销,虽然最终模型参数量不大,但训练时的显存占用和计算量并不小。如果未来要在移动端落地,还需要做大量剪枝和蒸馏工作。

5. 从DHD-Net延伸:你可以怎么在本地做一套简化版实验

5.1 环境搭建与数据准备

如果你想亲手验证这套结构的效果,我建议从简化版入手。首先准备好Python环境,我用的是PyTorch,版本1.8以上的都可以。依赖库很简单,主要是torch、torchvision、numpy、opencv-python。

数据集方面,推荐先用BSDS500数据集做训练和验证。下载后把图片切成若干128x128或96x96的小块,做随机旋转和翻转增强。测试集可以直接用Set12,它只有12张灰度图,量级小,评估起来很快。

噪声生成很简单:对每一张干净图像,生成一个服从N(0, sigma^2)的高斯噪声张量,加到图像上得到带噪图像。训练时网络输入是带噪图,目标是把残差(即噪声图)回归出来。这里注意,不要让噪声图和干净图的范围搞混:输入图像归一化到[0,1]范围,噪声也在这个尺度上生成,这样数值范围一致,训练更稳定。

5.2 简化网络的搭建要点

按照论文的结构思路,搭建简化版时可以做三处简化。第一,把每个尺度内部的密集模块层数降为3层,通道数从32开始;第二,金字塔层级从4层降为3层,感受野稍微小一点,但训练速度快很多;第三,把反卷积模块换成简单的双线性插值上采样加卷积,效果接近但显存占用小。

搭建时特别要注意密集连接实现里的维度处理。每个密集块内部,每层输出在通道维度上拼接,所以送入下一层的通道数会持续增长。我推荐用一个张量列表来存储各层输出,每次卷积前把列表里的张量在通道方向拼接。过渡层用1x1卷积做通道压缩,把通道数缩减到初始值,然后再做下采样卷积。这一步不做的话,网络越深通道越多,很快显存就会崩溃。

伪代码框架:

def dense_block(x, layers, growth_rate): features = [x] for i in range(layers): inp = torch.cat(features, dim=1) out = conv3x3_relu(inp, growth_rate) features.append(out) return torch.cat(features, dim=1)

5.3 训练配置与常见问题排查

训练配置方面,我建议初始学习率1e-3,Adam优化器,batch size根据显存尽量大,最低不要低于8。训练周期大约50到80个epoch就能看到不错的收敛趋势。学习率在第40个epoch左右降到1e-4。

我在实验里遇到的最常见问题有三个。第一个是训练初期loss就下降很慢,八成是初始特征提取卷积的通道数设置不合适,试着把初始层输出通道数从32调高到48,会发现收敛速度明显改善。第二个是测试时PSNR很高但视觉上有条纹感,通常是因为上采样路径没有用足跳连特征,检查一下解码层的拼接操作是否正确。第三个是显存爆炸,最简单的办法是把每个密集块内的层数减少一层,或者把上采样从转置卷积换成插值加卷积,显存会显著下降。

5.4 实验验证的关键指标

训练完成后,在Set12上按sigma=25测试,简化版通常能到28dB以上的PSNR。如果你把密集块内部层数和通道数调到和原论文接近,也就是每块4层、初始通道64、4层金字塔,那么PSNR能提升到29dB上下。这个指标已经和当年大多数单尺度去噪网络相当,说明多尺度密集连接的设计确实有效。

还有一个值得做的对比实验:把密集连接改成普通残差连接,其他保持不变,在相同配置下对比PSNR。我跑出来的结果是密集连接版本在多数测试图上高0.1到0.2dB。差距不算大,但稳定存在,尤其是在纹理丰富的区域。这也从侧面验证了论文设计的合理性。

6. 读这篇论文时,我觉得最值得停下来想一想的地方

论文读到最后,给我留下印象最深的不是它的网络结构本身,而是它体现出的"用结构换效率"的思路。图像去噪的深度学习研究进行到现在,单纯追求更深的网络已经没有太多意义。DHD-Net这类工作告诉我们,把合理的多尺度结构、足够的信息流动机制和高效的残差学习结合起来,一个重量很轻的网络也能达到很不错的水平。

另外一个让我反复咀嚼的细节是它对BN的处理。当年的图像复原领域,很多人在搭网络时习惯性带上BN,觉得这是标准配置。但这篇论文证明了:在像素级回归任务上,去掉BN非但不会让网络变差,反而能让训练更稳定。后来很多高质量的去噪和超分工作,比如一些基于Transformer的方法,也都延续了这个选择。习惯性的设计不一定适合你的任务,敢于质疑"默认配置"是很重要的研究品质。

如果你正准备开题做去噪方向,或者想在现有模型基础上加一点多尺度融合的思路,DHD-Net是一个值得认真读的参考。它的代码结构不复杂,复现门槛低,效果又处在当时的上游水平,适合用来作为baseline和后续改良的出发平台。建议动手之前,先把自己的实验框架搭建好,再逐步把密集连接、金字塔结构、多尺度跳连这些元素叠加进去,每一步都记录指标变化。这种"由简到繁"的复现方式,会让你对这个网络的理解深刻得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 18:30:42

步步高家教机H8/H9/H10/S1/S2刷机工具包实战:固件识别与功能解锁

简介:这份资源是面向步步高家教机用户的破解工具包,适用于H8S、H9、H10、S1、S2等机型,主要解决家教机功能受限、无法自由安装应用的问题,可将设备恢复成普通平板使用,适合希望扩展家教机用途、具备一定动手能力的用户…

作者头像 李华
网站建设 2026/10/16 18:29:50

JDK 7u80在Linux x64上的安装配置与JVM参数调优指南

简介:面向六十四位Linux平台的Java开发工具包七官方正式版(jdk-7u80-linux-x64.tar.gz),适用于需要编译、调试和部署Java应用的开发者,尤其适合仍在维护Java七技术栈的遗留项目或服务器环境,也可作为离线安…

作者头像 李华
网站建设 2026/10/16 18:28:54

视频追踪真假辨:从计算机视觉到AI安防,教你识别靠谱的追踪系统

这题目有点标题党,但我确实想从一个真实感受说起。前阵子又刷到一条“AI摄像头自动追踪小偷”的短视频,几十万点赞,评论区一片惊叹,博主煞有介事地讲解“算法原理”,看着很专业。可我在视频追踪这个方向干了这么多年&a…

作者头像 李华
网站建设 2026/10/16 18:26:58

PMSM滑模控制Simulink工程模型:DQ解耦、死区补偿与抗扰验证

简介:本资源是一套面向电机控制方向初学者与进阶研究者的永磁同步电机(PMSM)滑模控制完整仿真方案,聚焦工业驱动系统中抗扰动、强鲁棒性控制需求,适用于高校电力电子与运动控制课程设计、毕业设计及科研原型验证。压缩…

作者头像 李华
网站建设 2026/10/16 18:25:41

双目视觉FPGA代码落地拆解:从OpenCV到RTL的工程实践与避坑指南

简介:这份双目视觉FPGA代码资源面向图像处理、计算机视觉与硬件描述语言的学习者及工程开发者,帮助其在FPGA平台上实现从图像采集到深度计算的全流程。内容围绕双目立体视觉原理展开,涵盖图像采集接口、相机标定参数查询、特征匹配、半全局匹…

作者头像 李华
网站建设 2026/10/16 18:23:50

NetSpot Wi-Fi优化实战:从安装到信道分析避坑指南

简介:这份文档面向家庭用户与小型企业网络维护者,系统讲解NetSpot这款专业Wi-Fi分析工具的使用方法,帮助读者排查信号干扰、定位覆盖盲点并优化无线网络质量。资源包内含1个docx文件,约1.15MB,以图文结合的方式组织内容…

作者头像 李华