飞桨学习笔记之图像分割套件PaddleSeg

2023-11-03

1 概述

一个分割网络的输出是一个 N×H×W 的概率图,其中 N 是一个向量,向量的维数表示为类别的数量,也就是说向量的每个元素对应一个类别,而这个元素的数值是概率值,表示为对应类别的概率。因为要给出每一个像素的类别,所以 H×W 大小需要与原图保持一致。分割网络可以看作是一个没有全连接层的全卷积网络,常见的网络结构可以分为 Encoder 和 Decoder 两个部分:

  • Encoder 部分特征图的长宽会逐步缩小,也就是需要下采样。
  • Decoder 部分特征图的长宽会逐步增大,也就是需要上采样。

一个好的分割网络需要解决哪些问题?

  1. 如何通过较少的 Encoder 层数来获得较大的感受野。

提高感受野大小最直接的方法就是提高 Encoder 网络的层数,但是这种方法会在扩大感受野的同时,带来一些弊端,比如增加网络参数规模,导致训练耗时增加。此时更好的办法就是使用空洞卷积。

通过扩大卷积核可触达的区域来增大感受野,扩大卷积所包含的信息范围。

  1. 下采样过程中特征的长和宽在不断减少。

虽然得到了高阶特征,但是维度较小,如果直接作为上采样输入,则有可能丢失一部分信息,这时可以使用跳跃连接功能。通过跳跃连接,使上采样过程不仅使用高阶特征,也可以使用同维度的低阶特征。

  1. 多尺度问题。

可以使用 ASPP (Atrous Spatial Pyramid Pooling) 网络结构,通俗地讲,就是把不同尺度的目标交给不同感受野的卷积层来处理,大感受野处理大目标,小感受野处理小目标。

2 基本原理

2.1 DeepLabv3+


Encoder 的主体是带有空洞卷积 (Atrous Convolution) 的骨干网络,骨干网络可采用 ResNet 等常用的分类网络,作者使用了改进的 Xception 模型作为骨干网络。紧跟其后的空洞空间金字塔池化模块 (ASPP) 则引入了多尺度信息。相比前作 DeepLabv3,DeepLabv3+ 加入 decoder 模块,将浅层特征和深层特征进一步融合,优化分割效果,尤其是目标边缘的效果。此外,作者将深度可分离卷积 (Depthwise Separable Convolution) 应用到 ASPP 和 Decoder 模块,提高了语义分割的健壮性和运行速率。

在 PaddleSeg 当前实现中,支持两种分类骨干网络的切换:

  • MobileNetv2:适用于移动设备的快速网络,如果对分割性能要求较高,可使用此骨干网络。
  • Xception:DeepLabv3+ 原始实现的骨干网络,兼顾了精度和性能,适用于服务端部署。

2.2 U-Net

原始 U-Net 的结构是标准的编码器-解码器结构。

左侧可视为一个编码器,右侧可视为一个解码器。

  • 编码器由四个子模块组成,每个子模块包含两个卷积层,每个子模块之后又通过 max pool 进行下采样。编码器整体呈现逐渐缩小的结构,不断减少池化层的空间维度,缩小特征图的分辨率,以捕获上下文信息。
  • 解码器呈现与编码器对称的扩张结构,逐步修复分割对象的细节和空间维度,实现精准的定位。解码器同样也包含四个子模块,分辨率通过上采样操作依次增大,直到与输入图像的分辨率基本一致。

该网络还使用了跳跃连接,即解码器每上采样一次,就以拼接的方式将解码器和编码器中对应相同分辨率的特征图进行特征融合,帮助解码器更好地恢复目标的细节。

2.3 PSPNet

Pyramid Scene Parsing Network(PSPNet)起源于场景解析 (Scene Parsing) 领域。
普通 FCN 面向复杂场景出现三种误分割现象:

  1. 关系不匹配。将船误分类成车,显然车一般不会出现在水面上。
  2. 类别混淆。摩天大厦和建筑物这两个类别相近,误将摩天大厦分类成建筑物。
  3. 类别不显著。枕头区域较小且纹理与床相近,误将枕头分类成床。

为了融合图像中不同区域的上下文信息,PSPNet 使用了特殊设计的全局均值池化操作(Global Average Pooling)和特征融合构造金字塔池化模块 (Pyramid Pooling Module)。

2.4 ICNet

Image Cascade Network(ICNet) 是一个基于 PSPNet 的语义分割网络,设计目的是减少 PSPNet 在推断阶段的耗时。ICNet 主要用于图像实时语义分割。

由三个不同分辨率的子网络组成,将输入图像变换为不同的分辨率,随后使用计算复杂度高的网络处理低分辨率输入,计算复杂度低的网络处理高分辨率输入,通过这种方式在高分辨率图像的准确性和低复杂度网络的效率之间获得平衡。并在 PSPNet 的基础上引入级联特征融合单元(cascade feature fusion unit),实现速度快且质量高的分割模型。

2.5 HRNet

HRNet(HighResolution Net)能够在整个过程中保持高分辨率表示。

以高分辨率子网开始作为第一阶段,逐个添加高到低分辨率子网以形成更多阶段,并且并行连接多分辨率子网。在整个过程中反复交换并行多分辨率子网络中的信息来进行重复的多尺度融合。在像素级分类、区域级分类和图像级分类中,证明了这些方法的有效性。在人体姿态估计、语义分割和目标检测领域都取得了显著的性能提升。

2.6 Fast-SCNN


Fast-SCNN 是一个实时语义分割网络。在双分支的结构基础上,大量使用了深度可分离卷积和逆残差(inverted-residual)模块,并且使用特征融合构造金字塔池化模块(Pyramid Pooling Module)来融合上下文信息,这使得 Fast-SCNN 在保持高效的情况下能学习到丰富的细节信息。在推理计算时仅需要较小的 FLOPs(floating point operations,浮点运算次数,可以用来衡量算法/模型复杂度),就可以快速推理出一个不错的结果。

2.7 模型选择

  • 语义分割的初学者,推荐使用 U-Net 和 PSPNet 模型。
  • 如果希望以较快的速度完成训练和预测,则推荐使用 Fast-SCNN 或 ICNet。
  • 如果希望获得最佳的综合性能,则推荐使用 HRNet 或 DeepLabv3+(Xception65)。

2.8 模型评估

在图像分割领域中,评估模型质量主要是通过三个指标进行判断,准确率(acc)、平均交并比(Mean Intersection over Union,简称 mIoU)、Kappa 系数。

  • 准确率:指类别(背景类和目标类)预测正确的像素占图像总像素的比例。
  • 平均交并比:对每个类别数据集单独进行推理计算,计算出的预测区域和实际区域交集除以预测区域和实际区域的并集,然后将所有类别得到的结果取平均。
  • Kappa 系数:一个用于一致性检验的指标,可以用于衡量分类的效果。kappa 系数的计算是基于混淆矩阵的,取值为-1到1之间,通常大于0。

    其中 P0 为分类器的准确率,Pe 为随机分类器的准确率。Kappa 系数越高模型质量越好。

3 具体实现过程

3.1 准备数据集

一般的分割库使用单通道灰度图作为标注图片,但是这种标注图片显示为全黑的效果,无法直接观察标注是否正确,模型测试过程中也无法直接判断图像分割的效果。

为了解决上述问题,PaddleSeg 在支持灰度标注图的基础上,同时支持了伪彩色标注图。伪彩色标注图是在原来单通道图片基础上,注入调色板。在图片大小基本不变的基础上,显示出彩色的效果。
PddleSeg 已支持2种标注工具对图片做伪彩色标注,LabelMe 和精灵数据标注工具。

3.2 数据预处理

标注文件列表的内容形式为:原始图片路径 [SEP] 标注图片路径,其中 [SEP] 是文件路径分割符,缺省情况下为空格。
在整理目录结构并生成标注文件列表后,即可开始 PaddleSeg 训练。

3.3 选择并下载预训练模型

PaddleSeg 对所有内置的分割模型都提供了公开数据集下的预训练模型,因为对于自定义数据集的场景,使用预训练模型进行训练可以得到更稳定的效果。

3.4 设置配置文件

需要创建配置文件来设置模型类型、训练批次等信息,配置文件的格式为 yaml 格式。PaddleSeg 自带的配置文件保存在 ./configs 目录中,配置文件的命名中都带有模型类型、骨干网络和预训练数据集等信息,可以根据这些信息挑选合适的配置文件进行修改。

配置文件中除了可以设置常用的模型和训练信息之外,用户还可以规划数据增强策略(AUG)以及挑选损失函数(LOSS)。PaddleSeg 支持 softmax_loss、dice_loss、bce_loss、lovasz loss 四种损失函数。默认使用 softmax_loss,但是对于二分类图像分割任务,往往存在类别分布不均的情况,例如瑕疵检测、道路提取及病变区域提取等。此类任务一般背景图像所占比例远大于前景比例,此时使用 dice_loss 的效果比 softmax_loss 更好,这是因为 dice_loss 通过预测和标注的交集除以它们的总体像素进行计算,它将一个类别的所有像素作为一个整体进行考量,计算交集在总体中的占比,所以不受大量背景像素的影响,因此对于该场景用户可以在配置文件中将损失函数设置为 dice_loss。
对于多分类图像分割任务,也经常出现类别分布不均匀的情况。可使用 lovasz loss 解决这个问题。Lovasz loss 根据分割目标的类别数量可分为两种:lovasz_hinge_loss 适用于二分类问题,lovasz_softmax_loss 适用于多分类问题。

注意:softmax_loss 不能与 dice_loss 或 bce_loss 或lovasz_hinge_loss 组合使用,dice_loss、bce_loss、lovasz_hinge_loss 可以组合使用,例如 LOSS: [“dice_loss”, “bce_loss”]。

4 人像分割模型HumanSeg

4.1 视频流人像分割

移动端小模型分割效果经常不理想,可利用时序信息结合光流法,对分割结果进行优化。
光流是指运动物体在观察成像平面上的像素运动的瞬时速度。计算部分像素的光流的方式被称为稀疏光流,速度快,但是效果差;计算每个像素的光流的方式被称为稠密光流,速度慢,但是效果好。

DIS(Dense Inverse Search-basedmethod)光流算法是一种在光流质量和计算时间中取得平衡的算法,实现快速稠密光流,可达到实时要求。
DIS 光流算法主要包含3个方面:

  1. 基于块对应关系的逆搜索
  2. 沿着多尺度做图像块的聚合从而获得稠密的光流场
  3. 精细化搜索

光流后处理如何用光流改善视频分割结果?其方法是将 DIS 光流预测结果与分割结果相结合:

  1. 根据时序图像,计算相邻两帧的 DIS 光流(对应像素的位置关系)。
  2. 根据 DIS 光流找到前一帧融合结果 Flast 的运动预测结果 P。
  3. 根据光流大小判断融合权重 W。
  4. 融合结果 F=S×W+P×(1−W),其中 S 为当前帧分割结果,P 为上一帧的运动预测结果。

可以在“PaddleSeg/output/”目录下找到分割后的结果。

4.2 训练与推理

  1. 训练。确保选用的模型结构 model_type 与模型参数 pretrained_weights 匹配。
  2. 评估。
  3. 推理。可以在“PaddleSeg/output/result”目录下看到推理结果。
  4. 模型导出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

飞桨学习笔记之图像分割套件PaddleSeg 的相关文章

  • 【stm32学习】正点原子stm32f103学习——开发板入门

    一 连接外设 数据手册中FT标志的IO口是兼容5V的 原理图上带ADC都是不兼容5V 判断能否作为ADC输入 外设 首先了解一下ADC ADC是Analog to DigitalConverter的缩写 指模 数转换器或者模拟 数字转换器
  • 真实业务场景展现CAS原理的ABA问题及解决方案

    文章目录 阅读提示 CAS原理 ABA问题介绍 真实业务场景 如何解决ABA问题 CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题 以及解决方案 基于此 请先深入理解CAS原理 以
  • 将Flutter添加到现有应用——过程中遇到的问题

    参照官方文档试着将Flutter集成到现有的Android应用 出现了错误特此来记录一下 本文所展示项目的运行环境 Flutter SDK Version 2 8 1 AndroidStudio Version Bumblebee 2021
  • Java学习路线图(2021年最新版)

    第一阶段 Java基础 JavaSE基础是Java中级程序员的起点 是帮助你从小白到懂得编程的必经之路 在Java基础板块中有6个子模块的学习 基础语法 可帮助你建立基本的编程逻辑思维 面向对象 以对象方式去编写优美的Java程序 集合 后
  • 从GIS地图生成生成建筑模型

    01截取要生成的地块 02PS处理要生成的地块 03inkscape生成SVG 04Blender导入SVG减面后再生成建筑体块 05最终效果
  • 名爵5显示服务器异常,名爵5危险警告灯异常闪烁

    一辆行驶里程仅有3000km的12年上汽名爵5轿车 车主反映 该车危险警告灯在刚打开点火开关的时候就开始闪烁 但是用危险警告灯开关能正常控制其闪烁 在该车进行首保时 笔者反复关闭和打开点火开关 发现在点火开关打开的同时 该车的所有转向灯都开

随机推荐