# 语义分割

# 常见分割任务

  1. 语义分割
  2. 实例分割
  3. 全景分割

# 常见语义分割评价指标

# Pixel Accuracy / Global Acc 像素准确率

这是最直观的指标,反映了模型对所有像素点分类正确的比例。

PA=∑inii∑itiPA = \frac{\sum_{i} n_{ii}}{\sum_{i} t_{i}}

niin_{ii}:表示第 ii 类被正确预测为第 ii 类的像素数量(对角线元素)。

tit_{i}:表示第 ii 类总共包含的像素点数量。

所有分类正确的像素总数 ÷\div 图像像素总数。

局限性:由于它计算的是全局准确度,如果图像中某个类别如背景占比极大,PA 就会被该类别主导,无法反映模型对小目标的识别能力。

# mean Accuracy 平均准确率

为了解决上述类别不平衡问题,该指标先计算每个类别的准确率,再取平均值.

mAcc=1ncls⋅∑iniitimAcc = \frac{1}{n_{cls}} \cdot \sum_{i} \frac{n_{ii}}{t_{i}}

nclsn_{cls}:类别的总数。

niiti\frac{n_{ii}}{t_{i}}:第 ii 个类别的分类准确率。

意义:它给每个类别(无论大小)分配了相同的权重。如果你的任务中包含很多细长或微小的物体,这个指标比 PA 更有参考价值。

# mean IoU 平均交并比

mIoU=1ncls⋅∑iniiti+∑jnji−niimIoU = \frac{1}{n_{cls}} \cdot \sum_{i} \frac{n_{ii}}{t_{i} + \sum_{j} n_{ji} - n_{ii}}

分母:ti+∑jnji−niit_{i} + \sum_{j} n_{ji} - n_{ii} 实际上就是并集。它由 “真实区域” 加上 “预测区域”,再减去重复计算的 “交集部分” 组成。

分子:niin_{ii} 就是 ** 交集 。

核心逻辑:IoU=交集并集IoU = \frac{\text{交集}}{\text{并集}}。只有当预测的形状与真实的形状高度重合时,mIoU 才会接近 1。

# 一个例子

1 1 1 1 1

# 全局准确率

PA=16+3+16+12+864≈0.859PA=\frac{16+3+16+12+8}{64}\approx0.859

# 平均准确率

分母是列之和,分子是对角那个元素。

cls0acc=1620cls0_{acc}=\frac{16}{20},cls1acc=34cls1_{acc}=\frac{3}{4},cls2acc=1616cls2_{acc}=\frac{16}{16},cls3acc=1216cls3_{acc}=\frac{12}{16},cls0_{acc}=\frac{8}

mA=cls0acc+cls1acc+cls2acc+cls3acc+cls4acc5mA=\frac{cls0_{acc}+cls1_{acc}+cls2_{acc}+cls3_{acc}+cls4_{acc}}{5}

# 平均交并比

分母是行与列之和减去重复部分那个,分子就是对角线那个元素。

cls0IoU=1616+1+1+2+2cls0_{IoU}=\frac{16}{16+1+1+2+2},cls1IoU=33+1+1cls1_{IoU}=\frac{3}{3+1+1},cls2IoU=1616+1+1cls2_{IoU}=\frac{16}{16+1+1},cls3IoU=1212+2cls3_{IoU}=\frac{12}{12+2},cls0_{IoU}=\frac{8}

mA=cls0IoU+cls1IoU+cls2IoU+cls3IoU+cls4IoU5mA=\frac{cls0_{IoU}+cls1_{IoU}+cls2_{IoU}+cls3_{IoU}+cls4_{IoU}}{5}

# Transposed Convolution 转置卷积

Transposed Convolution/ fractionally-strided / deconvolution

转置卷积不是卷积的逆运算

N.B.: Blue maps are inputs, and cyan maps are outputs.

No padding, no strides, transposed Arbitrary padding, no strides, transposed Half padding, no strides, transposed Full padding, no strides, transposed
No padding, strides, transposed Padding, strides, transposed Padding, strides, transposed (odd)

Hout=(Hin−1)×stride[0]−2×padding[0]+kernel_size[0]H_{out} = (H_{in} - 1) \times stride[0] - 2 \times padding[0] + kernel\_size[0]

Wout=(Win−1)×stride[1]−2×padding[1]+kernel_size[1]W_{out} = (W_{in} - 1) \times stride[1] - 2 \times padding[1] + kernel\_size[1]

# 下采样 vs 上采样

普通卷积:主要用于特征提取和空间降维(下采样)。通过滑动窗口将多个输入像素映射为一个输出像素,通常会减小特征图的尺寸。

转置卷积:主要用于恢复空间分辨率或进行可学习的上采样。将一个输入像素映射到多个输出像素,从而产生比输入更大的输出特征图。常用于语义分割、生成对抗网络等需要还原图像尺寸的任务。

# FCN

1

21 深度就是 21 种类别,VOC 是 20 类然后还有一个是背景一共 21 类,然后经过上采样得到每一个像素的类别就完成分割了,FCN 使用全卷积操作,这避免了全连接层对图片大小的严格限制所导致的报错问题。

1

其实这个主要是把 VGG 的全连接层修改为卷积,当然还有更多细节,下面是 FCN-32S,即直接进行对 pool5 的 32 倍上采样,VGG16 的骨干网络就是对原图进行 32 倍下采样

# FCN-32S

1

# FCN-16S

1

# FCN-8S

1

# FCN 损失函数 - 像素级多类别交叉熵损失

对于单张图片,总损失 LL 定义为:

L=−1H×W∑i=1H×W∑c=1Cyi,clog⁡(y^i,c)L = -\frac{1}{H \times W}\sum_{i=1}^{H \times W} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})

FCN 的损失函数是对每一个像素进行 softmax 分类交叉熵后,在对全图进行平均。

# 空洞卷积 / 膨胀卷积

PyTorch 深度学习 - 基础 - 深度学习 | KarryLiu = 诗岸梦行舟 = 分享计算机知识以及各种心得总结

增大感受野,一般我们会主动保持特征图大小。

# FCN 模型训练

现在基本上把骨干网络都换成 ResNet-50 了。

1

环境为 RTX 3080 x4 基于 fcn_resnet50: https://download.pytorch.org/models/fcn_resnet50_coco-1167a1af.pth 预训练权重训练 20 轮。

1

结果:

1 2

实际上这个预训练已经不错了,我这 20 轮基本上没啥贡献,也就让 meanIoU 提升了一点点。。

# U-Net

U-Net 是由 Ronneberger 等人于 2015 年提出的一种端到端的全卷积网络,主要用于像素级分类。

1

这个中间的连接并不是全像素的连接,他会从源特征图裁剪一部分连接到上采用后的特征图。

1

# 在 DRIVE 数据集上进行训练

DRIVE 数据集一般指的是是视网膜血管分割领域最经典、使用最广泛的数据集之一。

1 1

200 轮训练后…

[epoch: 199]
train_loss: 0.3152
lr: 0.000000
dice coefficient: 0.814
global correct: 95.3
average row correct: ['97.2', '82.0']
IoU: ['94.7', '68.8']
mean IoU: 81.7
1 2
### 使用VGG-U-Net在CamVid-32数据集进行训练

CamVid 是语义分割领域里一个非常经典、但规模较小的自动驾驶场景数据集,经常被用来做教学、算法验证和轻量实验。真实城市驾驶视频 + 像素级语义标注。

# PSPNet

1

PSPNet,全称:Pyramid Scene Parsing Network,金字塔场景解析网络,是计算机视觉领域,特别是语义分割任务中一个非常经典的模型。它由 Hengshuang Zhao 等人提出,主要解决了传统分割网络对全局场景上下文信息利用不足的问题。在语义分割中,模型不仅要给每个像素分类,还需要理解整个场景。传统的 FCN(感受野有限,容易产生 “误分割”。例如,把水中的船识别成汽车,或者分不清同样外观但处于不同场景的物体。

根源: 模型缺乏对全局场景的上下文语义理解。

PSPNet 最大的亮点是引入了 Pyramid Pooling Module ,PPM,金字塔池化模块。将特征图分成不同尺度的网格(例如 1×1, 2×2, 3×3, 6×6),对每个网格内部进行池化操作,这相当于用不同大小的 “眼镜” 去看图片。

# 网络架构

  1. 基础层: 通常使用预训练的 ResNet 作为骨干网络提取特征。
  2. 池化模块: 将骨干网络输出的特征图送入上述的金字塔池化模块。
  3. 上采样与融合: 将池化后的丰富特征通过上采样恢复分辨率,并拼接到底层特征上。
  4. 卷积与输出: 通过卷积层进行最终的分类,输出分割结果。

PSPNet 通过在网络中引入金字塔池化模块,有效聚合了不同区域的全局上下文信息,从而显著提升了语义分割模型对复杂场景的理解能力。

# DeepLabv1

【DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs】:https://arxiv.org/abs/1606.00915

1

值得注意的是,当空洞卷积的膨胀率为 1 时,会退化为普通卷积。

# DeepLabv2

1

# VOC 镜像站

https://data.brainchip.com/dataset-mirror/voc

更新于

请我喝[茶]~( ̄▽ ̄)~*

KarryLiu 微信支付

微信支付

KarryLiu 支付宝

支付宝