图像分割(上):详解图像分割原理与图像分割模型
一、课程背景
上节课我们完成了图像分类项目,这节课开始进入图像分割的学习。图像分割在实际生产中的应用非常广泛,例如:
-
腾讯会议 / Zoom 的视频背景替换 -
华为手机的人像留色功能[pdf_19]
同样用两节课的篇幅,这节课主攻分割原理,下节课再把技能点活用到实战上,从头搭建一个图像分割模型。[pdf_19]
二、图像分割与图像分类的区别
|
|
|
|---|---|
| 图像分类 |
|
| 图像分割 |
|
三、语义分割与实例分割的区别
|
|
|
|---|---|
| 语义分割(Semantic Segmentation) |
|
| 实例分割(Instance Segmentation) |
|
★本课程以语义分割来展开讲解。[pdf_19]
四、语义分割原理
语义分割原理与图像分类大致类似,主要有两点区别:[pdf_19]
-
分类端不同 -
网络结构有所不同
五、区别一:分类端的不同
图像分类的分类端
输入图片 → 卷积层提取特征 → 若干特征图 → 全连接层(神经元)→ Softmax → 各类别概率
-
全连接层中的节点数对应要将图片分为几类 -
将全连接层的输出送入 softmax,获得每个类别的概率
图像分割的分类端
输入图片 → 卷积层提取特征 → 若干特征图(数目 = 分割类别数)→ 每个像素判断类别
-
最后生成的特征图的数目对应着要分割成的类别数 -
每个特征图代表对应类别的判断
示例:小猫分割
假设要将输入图片中的小猫分割出来,有 2 个类别:小猫与背景。
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
★经过 softmax 转为概率后,通道 1(0,0)概率为 0,通道 2(0,0)概率为 1,因此判断(0,0)位置是背景而非小猫。[pdf_19]
六、区别二:网络结构的不同
图像分类网络
-
经过多层特征提取后,最后生成的特征图都很小 -
特征图 → 全连接层 → 输出
图像分割网络
-
最终输出的特征图大小要么与输入原图相同,要么接近输入 -
原因:需要对原图中的每个像素进行判断 -
输出特征图与原图尺寸相同时,可直接进行分割判断 -
输出特征图与原图尺寸不同时,需将输出特征图 resize 到原图大小 -
从较小的特征图 resize 到较大尺寸会丢失部分信息,因此输出特征图的大小不能太小[pdf_19]
Encoder-Decoder 结构
输入图片 → [Encoder] 卷积提取特征,特征图尺寸减小 → [Decoder] 上采样还原尺寸 → 输出
|
|
|
|---|---|
| Encoder(编码器) |
|
| Decoder(解码器) |
|
Decoder 中的上采样操作,最常使用的是 转置卷积(Transposed Convolution)。[pdf_19]
七、转置卷积(Transposed Convolution)
核心理解
★转置卷积从逻辑上是卷积的一个逆过程,但不是卷积的逆运算。 [pdf_19]
-
普通卷积是多对一的运算:输出中的每一个 y 都与输入中的多个 x 有关 -
转置卷积并不是使用输出 Y 与卷积核 Kernel 来还原输入 X -
转置卷积只能还原出一个与输入特征图尺寸相同的特征图,内容并不相同
计算步骤
-
对输入特征图进行补零操作 -
将转置卷积的卷积核上下、左右变换作为新的卷积核(即翻转) -
利用新的卷积核在步骤 1 的基础上进行步长为 1、padding 为 0 的卷积操作
补零规则
|
|
|
|---|---|
| stride 补零 |
|
| padding 补零 |
|
输出特征图尺寸计算公式
h_out = (h_in - 1) × stride[0] - padding[0] + kernel_size[0]
w_out = (w_in - 1) × stride[1] - padding[1] + kernel_size[1]
PyTorch 中的转置卷积
class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, groups, bias=True, dilation)
计算示例
输入特征图(2×2):
[[1, 2],
[3, 4]]
卷积核 k(2×2):
[[1, 0],
[1, 1]]
stride=1, padding=0 的转置卷积:
第一步:补零后的输入(stride=1 无需在行间补零,padding=0 在周围补 dilation×(2-1)-0=1 圈零):
[[0, 0, 0, 0],
[0, 1, 2, 0],
[0, 3, 4, 0],
[0, 0, 0, 0]]
第二步:卷积核上下、左右翻转:
原核:[[1,0], [1,1]] → 翻转后:[[1,1], [0,1]]
第三步:用翻转后的卷积核在补零后的输入上做步长=1、padding=0 的卷积,得到输出(3×3):
[[1, 2, 0],
[4, 7, 2],
[3, 7, 4]]
★代码验证输出结果一致。[pdf_19]
八、损失函数
交叉熵损失
-
图像分割中依然可以使用图像分类中经常使用的交叉熵损失 -
图像分类:一张图片有一个预测结果,与真实值计算出一个 Loss -
图像分割: -
真实的标签是一张二维特征图,记录着每个像素的真实分类结果 -
含有像素类别的特征图称为 Mask -
GT(Ground Truth):在图像分割中指每个像素的真实分类结果 -
模型预测的 Mask 中每个位置都会有一个预测结果,与 GT 中的 Mask 做比较,生成一个 Loss[pdf_19]
Dice Loss
-
图像分割中还可以使用更有针对性的 Dice Loss -
下节课会展开讲解[pdf_19]
九、公开数据集
|
|
|
|---|---|
| COCO |
|
|
|
|
|
|
超过 2 万张图片 |
|
|
|
十、每课一练
问题:对于小猫分割问题,最终只输出 1 个特征图是否可以?[pdf_19]
解答:
|
|
|
|---|---|
| 思路一 |
|
| 思路二 |
|
| 思路三 |
|
十一、核心要点总结
|
|
|
|---|---|
| 图像分类 vs 图像分割 |
|
| 语义分割 vs 实例分割 |
|
| 分类端区别 |
|
| 网络结构区别 |
|
| 转置卷积 |
|
| 损失函数 |
|
| GT(Ground Truth) |
|
| 公开数据集 |
|
十二、小结
-
语义分割要解决的问题:对图像中的每个像素进行分类。 -
与图像分类主要有两个不同点: -
分类端不同:图像分类以若干个神经元作为输出;语义分割输出若干特征图。 -
网络结构不同:语义分割有 Decoder 这一步,将特征图放大。 -
转置卷积:实现 Decoder 上采样的方式。不是卷积的逆运算,只是能将特征图大小进行放大的一种卷积运算。 -
损失函数:交叉熵损失 + Dice Loss。
下节课预告
实践一个图像分割项目,从头搭建一个图像分割模型,学习 UNet 网络结构、Dice Loss 以及 mIoU 评估指标。[pdf_19]

