图像处理和计算机视觉

语义分割是什么?

语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。它用来识别构成可区分类别的像素集合。例如,自动驾驶汽车需要识别车辆、行人、交通信号、人行道和其他道路特征。

语义分割可用于多种应用场合,比如自动驾驶、医学成像和工业检测。

语义分割的一个简单例子是将图像划分成两类。例如,在图 1 中,一幅图像显示一个人在海边,与之相配的版本显示分割为两个不同类别的图像像素:人和背景。

语义分割 -- 图像和有标签的像素

图 1:图像和有标签的像素。

语义分割并不局限于两个类别。您可以更改对图像内容进行分类的类别数。例如,这幅图像也可能分割为四个类别:人、天空、水和背景。

语义分割与对象检测有什么区别?

语义分割可以作为对象检测的一种有用替代方法,因为它允许感兴趣对象在像素级别上跨越图像中的多个区域。这种技术可以清楚地检测到形态不规则的对象,相比之下,对象检测要求对象必须位于有边界的方框内(图 2)。

语义分割 -- 对象检测

图 2:对象检测,显示用来识别对象的边框。

如何使用语义分割?

因为语义分割会给图像中的像素加上标签,所以精确性高于其他形式的对象检测。这使得语义分割适用于各种需要准确图像映射的行业应用,比如:

  • 自动驾驶 — 通过区分道路与障碍物,比如行人、人行道、电线杆和其他汽车,让汽车识别可行驶的路径
  • 工业检测 — 用于检测材料中的缺陷,如晶圆检验
  • 卫星影像 — 用于识别高山、河流、沙漠和其他地形
  • 医学成像 — 用于分析和检测细胞中的癌变
  • 机器人视觉 — 用于识别物体和地形并进行导航
语义分割 -- 多谱段卫星图像

图 3:多谱段卫星图像的语义分割。

语义分割的工作原理

训练语义分割网络进行图像分类的过程遵循以下步骤:

  1. 分析一组带像素标签的图像。
  2. 创建一个语义分割网络。
  3. 训练该网络将图像划分为不同像素类别。
  4. 评估网络的准确性。

示例:自动驾驶应用

图 4 中的序列显示了用于自动驾驶的语义分割的真实示例。道路的图像自动从其他车辆中分割出来。下一段显示如何创建这些网络。

自动驾驶应用的语义分割

图 4:自动驾驶应用的语义分割。

了解架构

语义分割的一个常用方法是创建 SegNet,该网络基于卷积神经网络 (CNN) 架构。典型的 CNN 架构图 5 所示。

此 CNN 将整个图像划分为许多预定义类别中的一个。

语义分割 -- CNN 的典型结构

图 5:CNN 的典型结构。

要在像素级别上分类,而不是对整个图像分类,您可以追加一个 CNN 的逆向实现。上采样过程的执行次数与下采样过程相同,以确保最终图像的大小与输入图像相同。最后使用一个像素分类输出层,将每个像素映射到一个特定类。这就形成了一个编码器-解码器架构,从而实现语义分割。

语义分割 -- CNN 执行图像相关的功能

图 6:CNN 在每一层执行图像相关的功能,然后使用池化层(绿色)对图像进行下采样。对于网络的前半部分,此过程会重复多次。此图形前半部分的输出后面紧接着同等数量的反池化层(橙色)。

使用 MATLAB 实现语义分割

 

在 MATLAB 中,执行语义分割的工作流程遵循以下五个步骤:

  1. 给数据加标签或获取带标签的数据。
  2. 为原始图像和带标签的图像创建数据存储。
  3. 分割数据存储。
  4. 导入一个 CNN 并将其修改为 SegNet。
  5. 训练和评估网络。

步骤 1:给数据加标签或获取带标签的数据。

深度学习模型建立于大量数据之上,语义分割也不例外。其中一个选择是在互联网上查找带标签的数据。如果您有自己的数据集,则可以使用 MATLAB 中的 Image Labeler 应用程序。您可以使用此数据集训练 SegNet。

语义分割 -- Image Labeler 应用

图 7:用来标记图像实现语义分割的 MATLAB Image Labeler 应用。 

了解更多

步骤 2:为原始图像和带标签的图像创建数据存储。

在处理大量数据时,通常不可能将所有信息加载到内存中。要管理大型数据集,您可以使用数据存储。数据存储包含您想要访问的文件的位置,只有在您需要操作这些文件时,才将它们读入内存。

要创建 SegNet,您需要两个数据存储:

  1. ImageDatastore,它包含原始图像
  2. PixelLabelDatastore,它包含带标签的图像

步骤 3:分割数据存储。

在创建 SegNet 时,必须将数据存储分割为两部分:

  1. 训练集,用来训练 SegNet
  2. 测试集,用来评估网络的准确性
语义分割 -- 标注高速公路场景

图 8:显示彩色图像(左)和对应带标签像素(右)的高速公路场景。

步骤 4:导入一个 CNN 并将其修改为 SegNet。

加载预训练的网络(如 VGG16),并使用 SegNetLayers 命令创建像素级标注所需的编码器-解码器架构。

语义分割 - 用来创建 SegNet 架构的代码

图 9:使用 MATLAB 中的一行代码创建 SegNet 架构。

步骤 5:训练和评估网络。

在最后一步中,设置网络的超参数并训练网络。

如何了解有关语义分割的更多信息

支持使用语义分割进行图像分析的产品包括 MATLAB、用于像素标记的 Computer Vision Toolbox 和用于创建和训练网络的 Deep Learning Toolbox

支持 CUDA® 且计算功能集版本为 3.0 或更高的 GPU 才能支持训练和预测。建议使用 GPU,并且需要有 Parallel Computing Toolbox

软件参考

30天免费试用

快速入门