目录
一、项目起点:把一张“脏图”尽量还原清楚
二、整体设计:传统算法验证 + 深度网络改进
三、数据准备:从标准图像集中构建训练样本
四、先做 BM3D:把传统路线跑通
五、深度去噪网络:让模型学习“噪声残差”
六、训练流程:模块化实现,便于复现实验
七、工程实现细节:把算法流程整理成可复用项目
八、测试效果:指标提升之外,更重要的是速度
九、项目亮点:轻量化、可复现、可继续扩展
1. 残差学习降低了任务难度
2. 深度可分离卷积减少模型开销
3. SE 注意力增强特征选择能力
4. 完整流程便于二次开发
十、适合扩展的方向
十一、项目小结
有需要本项目的代码、文档、完整资源,或者需要部署调试的朋友,可以私信博主。
一、项目起点:把一张“脏图”尽量还原清楚
图像去噪是一个很基础、也很容易被低估的视觉任务。手机夜景、工业相机、监控画面、医学影像、遥感图像在采集和传输过程中都会被噪声影响,轻则画面颗粒感明显,重则边缘、纹理和细节被淹没。这个项目围绕一个明确目标展开:在尽量保留图像结构的前提下,把噪声从图像中分离出来。
最开始搭建方案时,我没有直接把深度网络作为唯一答案,而是先把传统BM3D路线做了一遍。这样做有两个好处:一是可以理解经典去噪算法如何利用图像块之间的相似性;二是能为后续深度学习模型提供一个比较可靠的参照。真正进入模型改进阶段后,核心思路转向残差学习:网络不直接预测“干净图像”,而是学习噪声本身,再用原始带噪图像减去预测噪声得到结果。这个思路让模型的学习目标更清晰,也更适合训练深层卷积网络。
图 1 残差学习图像去噪整体流程
二、整体设计:传统算法验证 + 深度网络改进
项目整体分为两条线:第一条线实现BM3D,用它完成传统图像去噪流程和运行效率分析;第二条线在DnCNN的基础上做轻量化改进,引入深度可分离卷积和SE注意力机制,形成一个更适合实际部署的去噪网络。两条线不是割裂的,BM3D更像是基准坐标,深度网络则承担性能提升和速度优化。
开发框架主要围绕PyTorch展开。数据读取、图像块切分、动态加噪、模型构建、训练循环、权重保存和测试评估都做成相对清晰的流程。指标层面采用PSNR和SSIM,前者反映像素级恢复误差,后者更关注结构相似度。最终效果不仅看一张图好不好看,还看批量测试集上的平均表现和单张图像处理耗时。
图 2 数据准备与训练样本构建流程
三、数据准备:从标准图像集中构建训练样本
数据部分使用Train400作为训练基础,同时准备Set12和Set68作为测试集。Train400包含多种自然场景,适合让模型学习常见纹理、边缘和结构模式。Set12图像数量不多,但都是去噪任务中常用的经典图像,便于观察局部细节恢复情况;Set68覆盖更广,适合看模型在多样图像上的平均水平。
由于原始训练图像数量有限,不能简单把整张图像直接丢给网络。项目采用滑动窗口方式切出大量小图像块,图像块大小设置为40×40,步长为10。为了让模型见到不同尺度的信息,又加入1.0、0.9、0.8、0.7四种缩放比例;再结合旋转、翻转等增强方式扩充样本。处理完成后,训练图像块数量达到二十多万级,为模型收敛提供了足够的样本基础。
图 3 训练集与测试集样例展示
图 4 图像块提取、多尺度处理与动态加噪过程
噪声并不是提前固化到图片里,而是在Dataset加载阶段动态添加。这样做的好处很明显:同一个干净图像块每次进入训练流程时,都可能对应不同的噪声实例,相当于继续扩大了训练样本空间。项目中实现了高斯噪声、椒盐噪声、斑点噪声和泊松噪声,既能用于单一噪声场景训练,也能用于混合噪声鲁棒性测试。
四、先做 BM3D:把传统路线跑通
BM3D是图像去噪领域非常经典的方法,它不依赖训练数据,主要利用图像的非局部自相似性。简单理解就是:图像中很多局部结构会在不同位置重复出现,比如纹理、边缘、建筑线条等。BM3D通过寻找相似图像块,把它们堆叠起来进行协同滤波,再把去噪后的图像块聚合回原图。
我在项目中实现BM3D的目的,不只是为了得到一个传统方法结果,更重要的是形成对照。参数部分重点包括噪声水平、图像块大小、搜索窗口、最大匹配块数量、阈值系数等。运行日志里可以明显看到,BM3D在单张图像上的处理时间偏长,尤其图像尺寸变大时,块匹配和变换滤波会消耗大量时间。这也解释了为什么传统方法在很多工程场景中会遇到实时性瓶颈。
图 5 BM3D 参数配置、运行日志与效果示例
从视觉效果看,BM3D能够抑制大量随机噪声,对规则纹理和局部结构也有一定保护能力。但在一些复杂纹理区域,仍然容易出现细节被抹平的问题。这个阶段给后续网络改进提供了很清楚的方向:深度模型不仅要提升PSNR和SSIM,更要在处理速度上拉开差距。
五、深度去噪网络:让模型学习“噪声残差”
深度学习部分以DnCNN为基础。这个网络的核心不是直接生成最终干净图像,而是学习输入图像中的噪声残差。带噪图像输入网络后,模型输出一张预测噪声图,再用输入图像减去预测噪声得到恢复结果。这样的目标比直接学习完整图像更简单,训练过程也更稳定。
标准DnCNN的中间层大量使用3×3标准卷积。当输入和输出都是64个通道时,单层参数量就比较可观,多层堆叠后模型规模会迅速增加。为了让网络更轻,我把中间层替换为深度可分离卷积。它把标准卷积分成两步:先用Depthwise Convolution对每个通道分别做空间特征提取,再用1×1 Pointwise Convolution做通道融合。这样既保留了卷积网络对局部结构的建模能力,又大幅减少参数量。
图 6 改进 DnCNN 去噪网络结构
轻量化之后,还需要解决表达能力可能下降的问题。SE注意力机制在这里发挥作用:它通过全局平均池化获取每个通道的统计信息,再通过两个轻量级映射层生成通道权重。重要通道被增强,不重要或干扰性强的通道被抑制。对图像去噪来说,不同通道可能分别响应边缘、纹理、平滑区域或噪声模式,SE模块可以让网络更主动地选择有价值的特征。
图 7 残差结构、深度可分离卷积与 SE 模块实现片段
六、训练流程:模块化实现,便于复现实验
代码实现上,我把深度可分离卷积、SEBlock、主网络DnCNN_DS_SE分开封装。这样的结构在调试时比较省心:如果只想验证轻量化卷积,可以先关闭注意力模块;如果需要调整通道压缩比例,也可以直接修改SEBlock。训练时使用Adam优化器,并配合学习率衰减策略,让前期快速下降、后期稳定收敛。
训练日志中可以看到,初始阶段损失下降非常明显,说明网络较快捕捉到了噪声的基本分布。每轮训练结束后保存权重文件,方便后续选择不同阶段模型进行测试。这个过程看起来只是常规训练流程,但对项目复现很关键:数据生成、噪声添加、训练日志、权重保存和测试脚本必须串起来,后面做对比展示才不会混乱。
图 8 模型训练、权重保存与评估输出
七、工程实现细节:把算法流程整理成可复用项目
这个项目真正花时间的地方,并不只在模型结构本身。图像去噪实验很容易出现“脚本能跑,但换一批图片就乱”的情况,所以我在整理时把输入、训练、测试和输出都拆成相对独立的环节。数据层负责读取原图、切块和增强;噪声层负责根据参数动态生成不同类型的噪声;模型层只关注网络结构和前向传播;评估层统一计算PSNR、SSIM和处理时间。这样的拆分可以减少后续修改时的耦合,换模型、换噪声、换测试集都比较方便。
在代码组织上,项目没有把所有逻辑塞到一个文件里,而是尽量保留清晰的功能边界。比如数据预处理脚本只负责样本生成,训练脚本负责模型训练和日志输出,测试脚本负责加载权重并输出指标。这样整理后,后续想复现实验结果,只需要按顺序准备数据、执行训练、加载模型测试即可;如果只是想演示效果,也可以直接跳过训练阶段,使用已有权重对指定图片进行去噪。
训练日志和权重保存也做了保留。很多同类项目只展示最终结果,但没有保存中间过程,一旦模型表现波动,就很难排查问题。这里每隔一定频率打印损失变化,每轮训练后保存模型权重,便于回溯不同阶段的训练状态。对于课程设计、毕业设计或项目验收来说,这些过程材料非常有用,因为它能证明模型不是只跑出了一张效果图,而是形成了完整的实验链条。
展示层面,我更倾向于把“带噪图、预测噪声、去噪图、指标结果”放在一起看。单独看一张恢复图容易产生主观判断,而指标能补充客观评价;只看指标又会忽略边缘、纹理和局部细节,因此两者需要配合。实际演示时,可以选择几张典型图片:一张纹理复杂的,一张边缘明显的,一张平滑区域较多的,再分别观察模型的表现。这样比单纯罗列平均值更能体现算法处理不同场景的能力。
如果继续做成可交互系统,前端可以设计成三步操作:上传图片、选择噪声或去噪模型、查看恢复结果。后端则提供模型推理接口,返回去噪图、耗时、PSNR/SSIM等结果。对于没有原始干净图的真实场景,也可以保留视觉前后对比和无参考质量评价指标。这样一来,项目就不再只是一个算法脚本,而可以扩展成一个完整的图像增强小系统。
八、测试效果:指标提升之外,更重要的是速度
在测试阶段,对Set68和Set12图像统一加入标准差为25的高斯噪声,再分别计算去噪结果与原图之间的PSNR和SSIM。Set68上,改进后的网络平均PSNR约为28.03 dB,SSIM约为0.7760;BM3D对应结果约为27.18 dB和0.7685。Set12上,改进网络平均PSNR达到29.10 dB,SSIM达到0.8112。指标说明网络不仅能把噪声压下来,也能较好保留图像结构。
速度方面差距更直观。BM3D处理同类图像往往需要几十秒到一百多秒,而改进网络在CPU环境下单张图像通常只需几秒。对于后续部署来说,这个差距非常关键。图像去噪如果只是离线实验,速度没有那么敏感;但一旦进入视频、工业检测、边缘设备或者交互式应用,推理耗时就会直接决定系统能不能用。
图 9 去噪指标与处理速度对比
图 10 带噪图像与去噪恢复效果展示
整个实现过程给我的感受是:图像去噪不是简单地把画面变平滑,而是在噪声抑制和细节保留之间找平衡。BM3D让我看到传统方法的稳定性和解释性,改进DnCNN则体现了深度学习在速度和效果上的潜力。深度可分离卷积负责减负,SE注意力负责补强,残差学习负责把目标变简单,这几个点组合起来,形成了一个相对完整、可复现、也方便继续改造的图像去噪项目。
完整资源里还包含更多训练脚本、测试结果、模型结构说明和实验输出,感兴趣的朋友可以继续交流。
每文一语:
沉淀是最佳的锻炼