Administrator
发布于 2026-09-09 / 0 阅读
0
0

机器学习项目报告:基于深度学习的水下图像语义分割

项目背景与任务描述

语义分割是计算机视觉中的一项基础任务,其目标是对图像中的每一个像素进行分类。与图像分类任务只输出整张图片的单一类别不同,语义分割需要输出与输入图像相同尺寸的分割图,其中每个像素都被赋予一个类别标签。

本项目聚焦于水下图像的语义分割任务。水下环境具有独特的挑战性:光线在水中衰减导致图像偏蓝绿色、悬浮颗粒造成光散射、整体对比度较低等因素都增加了分割的难度。本实验使用SUIM数据集,实现并比较两种语义分割架构——UNet和DeepLabV3,分析它们在水下场景中的表现差异。

数据集与预处理

SUIM数据集

SUIM(Semantic Segmentation of Underwater Imagery)是专门用于水下图像语义分割的公开数据集,数据集包含1525张训练验证图像和110张测试图像,定义了8个语义类别:背景水体(BW)、人类潜水员(HD)、水生植物(PF)、沉船废墟(WR)、水下机器人(RO)、珊瑚礁(RI)、鱼类(FV)和海底岩石(SR)。本实验将训练验证集按照1220:305的比例划分为训练集和验证集。

数据增强

为了提高训练数据的多样性并防止模型过拟合,本实验对训练数据进行了数据增强处理,包括随机旋转翻转、随机角度旋转(-40°到+40°)以及添加高斯噪声三种方法。这些增强操作以一定概率随机组合应用,使得每次读取同一张图像时都可能产生不同的变换效果。

image-20260308145646894

图片展示了数据集的样本示例。左侧是经过数据增强(旋转处理)后的原始水下图像,中间是对应的彩色标签图,其中蓝色区域代表人类潜水员,白色区域代表海底岩石;右侧是将彩色标签转换为类别索引后的可视化结果,不同颜色对应0-7的类别编号。

实验参数
参数
batch_size 4
epochs 5
learning_rate 0.001
image_size 256×256
num_classes 8

模型选择与设计思路

本实验选择了UNet和DeepLabV3两种架构进行比较,不同的设计思路可以对比分析这两种语义分割在水下图像分割任务上的效果差异

UNet采用编码器-解码器结构,其核心特点是跳跃连接。编码器逐层提取特征的同时会丢失空间细节信息,而跳跃连接将编码器各层的特征直接传递给解码器对应层,帮助恢复精确的分割边界。本实验使用预训练的ResNet34作为UNet的编码器。

DeepLabV3策略则不同,它使用多个不同膨胀率的空洞卷积并行处理(ASPP模块),能够在不缩小特征图的情况下获得更大的感受野,从而捕获多尺度的上下文信息。相比UNet,DeepLabV3使用了更深的ResNet50作为骨干网络,理论上具有更强的特征提取能力。通过比较这两种架构,可以观察网络深度和感受野大小对水下图像分割效果的影响。

两个模型都使用了ImageNet预训练权重。由于SUIM数据集规模相对较小,使用预训练网络可以利用已经学习到的通用视觉特征,加速收敛并提升性能。

模型结构

UNet结构

UNet的整体结构呈U形,左侧为编码器,右侧为解码器,中间通过跳跃连接相连。

这里后需要添加UNet结构图,网上找一个

编码器部分使用预训练的ResNet34,分为五个阶段逐步提取特征。以输入图像尺寸256×256为例,第一阶段经过卷积、批归一化和ReLU激活后,特征图尺寸变为128×128,通道数为64;经过最大池化和第二阶段后尺寸变为64×64;第三阶段输出32×32,通道数增加到128;第四阶段输出16×16,通道数256;第五阶段输出8×8,通道数512。可以看到,随着网络加深,特征图的空间尺寸不断减小,但通道数不断增加,这意味着空间细节逐渐丢失,而语义信息逐渐丰富。

这里看看能不能用ai生成神经网络图

解码器部分的任务是将低分辨率的特征图逐步恢复到原始尺寸。每个解码阶段包含两个操作:首先通过转置卷积将特征图尺寸放大一倍,然后与编码器对应阶段的特征图在通道维度上拼接,最后通过两层卷积进行特征融合。这里的拼接操作就是跳跃连接的具体实现。例如,将8×8的特征图上采样到16×16后,与编码器第四阶段的16×16特征图拼接,拼接后通道数翻倍,再通过卷积降低通道数并融合特征。经过五个解码阶段后,特征图尺寸恢复到256×256,最后通过一个1×1卷积将通道数变为8,对应8个类别的预测得分。

同理

跳跃连接的作用在于,编码器浅层的特征图虽然语义信息较弱,但保留了丰富的空间细节,如边缘和纹理。将这些信息直接传递给解码器,可以帮助模型生成更精确的分割边界,而不仅仅依赖于高层语义特征的上采样。

DeepLabV3结构

DeepLabV3的设计思路与UNet不同。它直接使用PyTorch提供的预训练模型,骨干网络为ResNet50,比UNet的ResNet34编码器更深,能提取更复杂的特征

DeepLabV3的核心是ASPP模块。普通卷积的感受野大小固定,而空洞卷积通过在卷积核元素之间插入空洞来扩大感受野,同时保持特征图尺寸不变。ASPP模块并行使用多个不同膨胀率的空洞卷积,每个分支捕获不同尺度的上下文信息,最后将各分支的输出拼接融合。这种多尺度特征提取方式特别适合处理大小差异较大的目标,比如水下场景中既有占据大面积的海底背景,也有较小的鱼类目标。 这里后面要改

在本实验中,DeepLabV3的分割头部分不使用预训练权重,仅骨干网络使用ImageNet预训练,这样模型需要从头学习如何将提取到的特征映射为8个类别的分割结果。

两种结构的参数量对比

UNet约有24M参数,DeepLabV3约有40M参数,这是因为ResNet50网络更深,且ASPP模块会额外引入卷机层,导致参数量更大。但是这也意味着模型的拟合能力更强。

训练过程

损失函数

本实验使用交叉熵损失函数(Cross Entropy Loss)。对于语义分割任务,模型输出的形状为 (N, C, H, W),其中 N 为批次大小,C 为类别数(8),HW 为图像高度和宽度。对于每个像素位置,模型输出8个得分,经过Softmax转换为概率分布后,与真实类别标签计算交叉熵。整张图像的损失是所有像素损失的平均值。

交叉熵损失的计算公式为:

\mathcal{L} = -\frac{1}{N \times H \times W} \sum_{n,h,w} \log p_{n,h,w,y_{n,h,w}}

其中 y_{n,h,w} 是位置 (h,w) 的真实类别标签,p_{n,h,w,c} 是模型预测该位置属于类别 c 的概率。损失函数会惩罚预测概率与真实标签的偏差,预测越准确,损失越小。

优化器与学习率调度

本实验使用Adam优化器,初始学习率为0.001。Adam作为自适应学习率优化算法,它会为每个参数设置独立的学习率,并根据历史梯度信息进行调整,通常比基础的SGD收敛更快。

此外,为了在训练后期进行更精确的最优解,我们使用了ReduceLROnPlateau学习率调度器,如果连续2个epoch验证损失没有下降,则将学习率乘以0.5,这样模型接近收敛时自动降低学习率,帮助模型更好地收敛到最优解。

训练流程

每个epoch的训练过程如下:首先将模型设置为训练模式,然后遍历训练集的每个batch。对于每个batch,将图像输入模型得到预测结果,计算预测与标签之间的损失,通过反向传播计算梯度,最后使用优化器更新模型参数。一个epoch结束后,在验证集上评估模型性能,根据验证损失调整学习率,并保存验证集上mIoU最高的模型作为最佳模型。

这里可以弄个流程图 如果有精力的话

训练过程中记录每个epoch的训练损失、验证损失、验证集mIoU和像素准确率,用于后续绘制学习和收敛曲线。

评估指标

本实验使用两个主要指标评估分割性能:像素准确率(Pixel Accuracy)和平均交并比(Mean IoU)。

像素准确率最直观,其计算公式为:

\text{Pixel Accuracy} = \frac{\text{预测正确的像素数}}{\text{总像素数}}

但是像素准确率存在一个问题:当某个类别占据图像大部分区域时,即使模型完全忽略小类别,仍然可以获得较高的像素准确率。例如,如果背景占据90%的像素,模型只要把所有像素都预测为背景就能达到90%的准确率,但这显然不是一个好的分割结果。

为了更全面地评估分割质量,本实验引入了IoU指标。对于每个类别,IoU定义为预测区域与真实区域的交集面积除以并集面积:

\text{IoU}_c = \frac{TP_c}{TP_c + FP_c + FN_c}

其中 TP_c 是正确预测为类别 c 的像素数,FP_c 是错误预测为类别 c 的像素数,FN_c 是类别 c 被错误预测为其他类别的像素数。IoU的取值范围为0到1,1表示预测与真实完全重合。将所有类别的IoU取平均即得到mIoU,它对每个类别的分割质量给予同等权重,能够更好地反映模型对所有类别的整体分割能力。

在实际实现上,由于数据维度过大,导致计算指标代价很大,因此我们构建混淆矩阵来实现高效计算,混淆矩阵的第 i 行第 j 列的元素表示真实类别为 i 但被预测为类别 j 的像素数,其对角线元素之和即为正确预测的像素数,每行之和为该类别的真实像素数,每列之和为该类别的预测像素数

实验结果与分析

学习曲线

下图展示了两个模型在5个epoch训练过程中的学习曲线,包括损失变化、mIoU变化和像素准确率变化三个方面。

image-20260308152448466

从损失曲线来看,UNet的训练损失从约1.3下降到1.1,测试损失也从1.2下降到1.03,

DeepLabV3的训练损失从1.15下降到0.9,但是验证损失出现震荡,后续增加训练量再看

从mIoU曲线来看,两个模型的差距十分明显。UNet的mIoU。。。。DeepLabV3的mIoU始终高于UNet。。。。

像素准确率曲线也表明DeepLabV3的像素准确率整体比UNet更好, ,,,,,

综合三个指标来看,DeepLabV3在本实验中的表现明显优于UNet。。。。

测试集评估结果

训练完成后,使用保存的最佳模型在测试集上进行评估,得到最终的性能指标。下表展示了两个模型在测试集上的整体表现:

模型 Pixel Accuracy Mean IoU
UNet 0.65 0.21
DeepLabV3 0.70 0.35

DeepLabV3在两个指标上均优于UNet,说明DeepLabV3对各个类别的分割质量整体更好。

各类别IoU分析

为了更深入地了解两个模型的性能差异,下图展示了两个模型在8个类别上的IoU对比。

image-20260308152921235

从图中可以观察到几个明显的现象:

第一,背景水体(BW)是表现最好的类别,UNet 和 DeepLabV3 的lou都很高,这是因为背景在大多数图像中占据较大面积,模型容易学习。

第二,植物(PF)和机器人(RO)两个类别的IoU几乎为0,两个模型都完全无法识别这两个类别。这是因为这两个类别在数据集中出现的频率极低(不确定对不对 ai说的),模型没有足够的样本来学习它们的特征。从后续的预测可视化中也可以看到,即使图像中存在绿色植物区域,模型也倾向于将其预测为其他类别。

第三,DeepLabV3在大多数类别上都优于UNet,在某些类别,例如人类潜水员(HD)或者沉船废墟WR),UNet失效而DeepLabV3有不错的结果

预测结果可视化

下图展示了UNet在测试集上的预测结果,每行包含原始图像、真实标签和模型预测三列。

image-20260308153307045

首先,预测结果中噪声严重,分割区域不够平滑,边界呈现锯齿状,其次,类别混淆较为严重,例如第一行图像中的潜水员(应为蓝色)被错误识别为黄色的鱼类和粉色的珊瑚礁。第三行图像中的绿色植物区域完全没有被识别出来,整个区域被预测为粉色的珊瑚礁。这说明UNet只有在特征明显时才给出合理的预测。

下图展示了DeepLabV3在相同测试样本上的预测结果。

image-20260308153436695

相比UNet,DeepLabV3的预测结果明显更好,尤其是噪音更少,且整体区域预测和真实标签高度吻合,边界清晰。但是很多标签等分类还是不好,比如第三行等绿色植物区域被整体预测为粉色珊瑚礁,后续有新结果再改

结果讨论

基于以上实验结果,可以得出以下分析:

DeepLabV3显著优于UNet,这是因为他使用的ResNet50网络层次更深,有更强的特征提取能力,其次ASPP模块能够捕获多尺度上下文信息,对于水下场景中大小差异较大的目标更为有效。

DeepLabV3生成的分割区域更加平滑完整,说明多尺度特征融合确实有助于产生更连贯的预测结果。

两个模型共同面临的最大问题是类别不平衡。植物和机器人类别的IoU接近于0,说明这两个类别在数据集中的样本量严重不足。在这种情况下,模型倾向于将像素预测为出现频率较高的类别,从而在整体损失函数上获得更低的值。这是语义分割任务中常见的问题,后续可以通过加权损失函数或过采样等策略来缓解。 这里后续再改


评论