图像分割与U-Net系列模型解析
1.图像分割
虽然图像分割(Image Segmentation)与目标检测(Object Detection)都属于计算机视觉中的视觉识别任务,但它们的目标、输出形式和应用场景各不相同:
- 目标检测(Object Detection):找出图像中有哪些物体,并框出每个物体的位置,比如说检测行人、车辆,以边界框 + 类别标签为输出形式。
- 图像分割(Image Segmentation):精确地标出图像中每个像素属于哪个类别,以每个像素的类别标签为输出形式。
举个例子:
- 左图是目标检测任务,把人框出来。
- 右图是图像分割任务,每个像素都需要判断是属于“人”还是背景,类似于 Photoshop 中的“抠图”。
图像分割任务可以分为:
1.语义分割(Semantic Segmentation)
把图像中的像素分为不同类别,同类的像素标注为相同颜色,不用区分个体。例如,如下图中5个人都被标注为“人类”类别,不需要区分谁是谁。
2.实例分割(Instance Segmentation)
不仅区分类别,还要区分每个实例。例如下图中5个人都属于“人类”类别,但每个人都需要被单独标记出来。
目标检测中我们需要预测的是几个坐标点(回归问题),而图像分割中我们需要对每一个像素点做分类,最基础的图像分割是前景 vs 背景(二分类),更高级一点的是多类别语义分割或实例分割。
换句话说,图像分割就是一个逐像素的分类任务(per-pixel classification)
2.分割任务损失函数
在图像分割任务中,我们的目标是对图像中的每一个像素点进行分类——判断它是属于前景(如人、车、树等)还是背景。那我们该如何衡量模型预测的效果好坏呢?和其他深度学习任务一样,我们也需要一个损失函数。而图像分割中最常用的损失函数有两个加权交叉熵损失(Weighted Cross Entropy Loss)以及Focal Loss。
1.加权交叉熵损失(Weighted Cross Entropy Loss)
1. 逐像素的交叉熵损失
在最基础的语义分割任务中,我们对每个像素点预测其类别,并与真实标签进行比较,这和图像分类任务是一样的,只不过粒度从“整张图”变成了“每个像素”,这就是交叉熵损失函数(Cross Entropy Loss),公式如下:
$$\mathcal{L}{CE} = - \sum{i} y_i \log(p_i)$$
其中:
- $i$ 类别索引,表示当前样本可能属于的各个类别
- $y_i$ 是真实标签(通常是one-hot编码)
- $p_i$ 是模型对该像素属于类别 $i$ 的预测概率
2. 加入前景/背景的不平衡权重(加权交叉熵)
而在图像中,前景往往只占很小一部分,绝大多数像素都是背景。如果我们直接用普通交叉熵损失,那模型可能更倾向于“全部预测成背景”,这会导致训练不收敛或结果不理想。
因此,我们可以引入一个权重项,对前景像素赋予更高的权重,从而让模型更关注“稀有”的前景目标。这个权重可以根据前景和背景的像素数比例自动计算,也可以手动指定。
$$\mathcal{L}_{WCE} = - \alpha \cdot y \log(p) - (1 - \alpha) \cdot (1 - y) \log(1 - p)$$
其中:
- $\alpha$ 是正样本(前景)的权重,值越大,模型对前景越敏感
2.Focal Loss
除了数量上的不平衡,其实还有一个更细致的问题——有些像素点很好判断(比如大片背景或目标内部),而有些像素点非常难判断(比如目标边缘、遮挡处)。我们希望模型更加关注这些难判断的像素点。
这时候就要引入著名的Focal Loss:
$$\mathcal{L}_{focal} = -\alpha (1 - p_t)^{\gamma} \log(p_t)$$
其中:
- $p_t$ 表示模型对真实类别的预测概率
- $\gamma$ 是调节因子,一般设为 2
- $\alpha$ 是样本类别的权重(和上面公式一样)
这个公式的核心思想是:
- 对于预测非常准确($p_t \approx 1$)的样本,损失值被显著缩小
- 对于预测错误的样本($p_t$ 小),损失值被放大
也就是说,Focal Loss 会自动弱化容易分类的像素点、增强难分类像素点的权重,从而引导模型重点学习更有价值的信息。
3.加权交叉熵+Focal Loss
加权交叉熵的关注点在于类别样本不均衡,而Focal Loss的关注点在于像素点难易程度不同。
在实际任务中,我们可以将这两者结合起来使用,例如使用带权重的Focal Loss:
$$\mathcal{L} = - \alpha (1 - p_t)^\gamma \log(p_t)$$
其中:
- 权重 α:物以稀为贵。 前景像素少,就要给它更高的权重,像打游戏爆稀有装备一样,越少越珍贵
- 调节因子 γ:难者多得分。 越是难分类的像素(比如目标边缘),对训练越有价值,就像我们抄错题、练习难题一样,要多加关注
3.语义分割中的评估指标
训练完模型后,我们还需要评估模型的效果,IoU(Intersection over Union) 是语义分割中最常用的评估指标。
1.IoU(Intersection over Union)
IoU 表示的是预测区域与真实区域的交集与并集之比,公式如下:
$$\text{IoU} = \frac{\text{Intersection}}{\text{Union}}$$
- Intersection(交集):预测为某类且真实也为该类的像素数量
- Union(并集):预测为该类的像素数量 + 真实为该类的像素数量 − Intersection
在混淆矩阵中,IoU 的计算方式可以看作:
$$\text{IoU}_\text{class} = \frac{TP}{TP + FP + FN}$$
其中: - TP(True Positive):预测正确的正类
- FP(False Positive):误判为该类的像素
- FN(False Negative):漏判为其他类的像素
2.平均 IoU(mIoU)
由于语义分割通常包含多个类别,我们通常会计算所有类别的 IoU,然后取平均,得到 mean IoU (mIoU):
$$\text{mIoU} = \frac{1}{C} \sum_{c=1}^{C} \text{IoU}_c$$
这就像是多个类别下的 IoU 的加权平均,是衡量模型整体性能的核心指标。
4.U-Net 网络结构
U-Net 是一种非常经典的语义分割网络,最初发表于 2015-2016 年,专为医学图像分割设计,因为其结构简单后来被广泛应用于各种像素级任务。因为整体结构:像字母U的形状,所以叫U-Net。
如下图,U-Net 是一个对称结构,左边下采样提取语义,右边上采样还原细节,跳跃连接帮助拼接高精度特征,最终生成和输入尺寸接近的像素级预测图。
1.结构设计
可以类比为“编码-解码”的思想(像 Sequence-to-Sequence)
模块 | 功能 | 类比 |
---|---|---|
编码器(左边) | 下采样,提取语义特征 | 像人眼看整体轮廓,从模糊到清晰 |
解码器(右边) | 上采样,恢复空间分辨率,生成 mask | 像放大镜一点点拼出目标的精细形状 |
跳跃连接(中间横线) | 保留细节,连接浅层特征到深层输出 | 就像复习时要结合课本基础和考试重点一起理解 |
1.编码器(Contracting Path)
编码器的主要作用是,提取抽象语义特征 + 下采样。采用多个卷积 + ReLU + MaxPooling 层,逐步下采样(比如 256→128→64…),每个阶段是两个3 $\times$ 3卷积(蓝色箭头)+ ReLU,后跟一个2 $\times$ 2 max pooling(红色箭头)。随着层数加深,空间分辨率变小(572 → 284 → … → 28),通道数增多(64 → 128 → … → 1024),特征越粗,语义越强。
示例:
- 第一层输入大小为 572×572×1(单通道图像)
- 卷积后输出:568×568×64(因为 3×3 卷积没有 padding)
- 然后 max pooling:下采样为 284×284×64
下采样(编码器)的作用:逐层抽象全局轮廓**
- 感受野扩大:通过池化/卷积步长降低分辨率,每个神经元能覆盖更大图像区域,捕获整体结构(如器官形状、物体位置)
- 高级语义提取:深层网络识别抽象特征(如”这是肺部CT”而非像素级纹理),类似人类先看”大致轮廓”
- 抗噪声干扰:压缩空间信息后,对小位移和噪声更鲁棒
2.解码器(Expansive Path)
解码器的主要作用是上采样恢复原图尺寸 + 分割掩码生成。每个阶段是一次转置卷积(绿色箭头)进行上采样,然后将对应分辨率的特征图拼接(灰色箭头),再做两个 3 $\times$ 3 卷积(蓝色箭头)。
使用转置卷积(或上采样)逐步还原分辨率,每次上采样后,都把对应的编码器特征“跳跃连接”过来,拼接后再卷积。这样能结合深层的语义信息和浅层的位置信息。
示例:
- 中间最底部是 28×28×1024
- 上采样为 56×56×512,拼接编码器的 64×64×512
- 然后卷积、ReLU 处理,输出通道逐渐减小
上采样(解码器)的作用:逐步恢复空间细节
- 定位精细化:通过转置卷积/插值逐步放大特征图,结合跳跃连接(skip connection)注入编码器的底层细节(如边缘、纹理)
- 多尺度特征融合:跳跃连接将高层语义(”这是什么”)与底层细节(”边界在哪”)拼接,实现”轮廓指导细节”的分割
- 分辨率恢复:最终输出与输入同分辨率,实现像素级预测
3.跳跃连接(Skip Connection)
每下采样一次,保留当前的特征图,解码时,把对应分辨率的编码特征图复制并拼接到解码器中。这一步也叫:copy and crop。目的是防止上采样过程丢失空间信息,补充原始的细节和边缘特征。比如编码器在 128x128 层的特征,会跳到解码器的同尺寸上一起用。防止丢失空间细节,补回精细轮廓和边缘信息。
4.最后一层输出(右上角)
使用一个 1×1 卷积(青色箭头) 将通道数变为类别数(图中为 2 类)。最终输出尺寸为:388×388×2(每个像素对应两个类别的概率)。
为啥尺寸变小了?(572→388)
因为卷积操作没有使用 padding,每次 3×3 卷积会减少 2 个像素,两次卷积减少 4 个像素,每层下采样都会累计空间损失,所以最终输出图比输入图小(用 crop 来对齐)。
5.U-Net 的特征融合
1. 为什么要做特征融合?
在深度学习做视觉任务时,总会强调“特征融合”。什么是特征融合?就是把不同层级(深浅不同)的特征信息整合起来,既有局部细节,也有全局语义。在 U-Net 结构中,典型的融合方式就是从左侧编码器(下采样路径)拿出浅层特征,传到右侧解码器(上采样路径)对应位置进行融合。如下图。
1.基本结构说明
每个节点 $X^{i,j}$ 表示一个特征图,来自某一层的卷积输出
$i$:表示网络的深度层级(从上到下)
$j$:表示在同一分辨率下的第几个操作阶段(从左到右)
图中三种箭头说明不同的信息流路径:
- 下黑实箭头:下采样(Down-sampling)
- 上黑实箭头:上采样(Up-sampling)
- 虚线箭头:跳跃连接(Skip Connection)
- 所有连接都是基于 卷积操作(节点本身)
U-Net 之所以分割效果好,关键就在于它把“高分辨率细节特征”和“低分辨率语义特征”融合在了一起。
2.跳跃连接(Skip Connections)
每次下采样后保留的特征(如 $X^{0,0}, X^{1,0}, X^{2,0}$…),会在解码阶段通过虚线跳跃连接到对应分辨率的上采样阶段(如 $X^{0,4}, X^{1,3}$…)。
深层特征语义强但空间信息模糊,浅层特征保留边缘细节但语义弱。跳跃连接能组合两者优点,形成精准分割。
3.拼接 + 卷积融合(Concat + Conv)
在执行上采样操作后,U-Net 会把,当前上采样结果,对应的跳跃特征图,进行 通道维度的拼接(concatenate),再通过卷积融合,生成新的特征图。
$$X^{2,2} = Conv([Up(X^{3,1}) ⊕ X^{2,0}])$$
把解码路径中的上采样结果和编码路径中的浅层特征拼接,再交给卷积融合,这一步实现了真正的“融合”。
4. 多尺度融合(层层递进)
从图中可见,最终输出 $X^{0,4}$ 是逐层融合浅层和深层特征得到的。每一级都融合了不同语义层级的特征,最终形成一个丰富多尺度信息的特征图。
类比理解:
就像人做图像理解时,既需要看到整体(全局语义),也需要看细节(边界线条)。U-Net 就是“全景 + 放大镜”一起看。
6.U-Net++ 核心结构
1.整体框架设计:升级版的 U-Net
1.基础结构
- 下采样(Down-sampling):通过卷积步长为2的方式,将特征图尺寸逐步减半(例如:96 → 48 → 24 → 12 → 6)
- 上采样(Up-sampling):使用插值(如最近邻或双线性)将特征图尺寸恢复(例如:6 → 12 → 24 → 48 → 96)
2. 跳跃连接与特征融合
不仅连接当前层与对应的对称上采样层(如传统U-Net),还连接同一层级的多个历史特征图。每一层的输出可能融合了来自多个深度和广度的特征——类似 DenseNet 的密集连接思想,表现形式上是:
“当前节点 = 上采样特征 + 所有前层同级别节点的融合”。
2.网络结构核心思想:深度特征融合
1.融合机制
所有能拼接的特征图都尽可能进行融合,提高特征表达的丰富性,增强网络学习能力。类似 2017 CVPR Best Paper 中提出的 DenseNet 结构。
2. U-Net++ 的特征融合方式
类似于“多个路径、跨层连接、分支拼接”的机制,多层次、多尺度的特征信息被汇聚到一起。
3.辅助监督机制:多层损失引导训练
1.中间监督(Deep Supervision)
网络训练时,不只在最后输出层加损失函数,而是所有输出尺寸一致的位置都可以加损失函数(例如多个 96x96 大小的节点)。并且每个阶段都加以监督,因为这样有利于梯度传播、加速收敛、提升中间层质量。
就像看人不是只看最终是否考上大学,而是每一个阶段(小学、初中、高中)都要尽力做到最好,才能最终成功。同理,网络中每一个中间输出都应该被优化,才能提升整体性能。
U-Net++ 作为 U-Net 的增强版本,在分割、检测等 CV 任务中应用广泛,结构通用、效果优秀,主要改进在于:
- 多级跳跃连接和特征融合机制,强化了跨层信息的整合
- 多损失辅助监督机制,提高了模型的训练效率与精度
7.U-Net3+改进
U-Net 3+统一解码器、全尺度特征融合,结构简洁、效果更强、计算更高效。
模型 | 特征融合策略 | 改进点 | 存在问题(相对) |
---|---|---|---|
U-Net++ | 深度跳跃连接 + 密集嵌套结构(Nested skip) | 强调语义一致性,引入了密集连接路径,减缓语义鸿沟 | 路径结构复杂、融合不彻底、解码器分支多、计算开销大 |
U-Net 3+ | 全尺度融合(Full-scale skip connection) | 引入统一解码器结构,将浅层细节和深层语义全融合,提升效果且结构简洁 | 跳跃路径更多,特征对齐成本更高 |
1.从密集嵌套连接 ➜ 全尺度融合
- U-Net++ 通过构建密集的嵌套路径(Nested decoder),增强特征流动,但每一层的解码器是独立的
- U-Net 3+ 则提出:每一层解码器只保留一个,将所有尺度的编码特征、解码特征全部统一融合,更高效、结构更简单
本质:从“多路径拼接” ➜ “一次性大融合”
2.统一解码器设计(One Decoder to Rule Them All)
- U-Net++:每个输出都对应一个不同的子解码器结构(解码器嵌套)
- U-Net 3+:整个网络只保留一套统一的解码器路径,避免冗余计算,减少参数
3.多尺度上下文建模能力更强
在 U-Net 3+ 中,所有编码器特征通过上采样/下采样对齐后统一拼接,同时利用解码器中间特征,提供更深层次语义信息。这样做的结果是:在每一层融合中,模型能够同时看到:浅层,边界细节,中层:语义和上下文,深层:全局理解。
4.更轻量,训练和推理速度更快
虽然跳跃连接更多,但结构统一,避免了解码器重复设计,在保持准确率的前提下,整体计算量低于 U-Net++。
8.总结
本文主要讲了:
- 图像分割任务,对比了目标检测差异
- 语义/实例分割区别
- 解析加权交叉熵与Focal Loss,解决样本不均衡问题
- IoU/mIoU评估指标。
还重点剖析了U-Net系列:
- U-Net如何通过编码-解码结构与跳跃连接实现特征融合的
- U-Net++引入密集嵌套连接和中间监督增强语义一致性
- U-Net3+创新全尺度融合与统一解码器,兼顾多尺度特征与计算效率,形成从基础到高阶的模型演进路径。