语义分割与对象检测有什么区别?
语义分割可以作为对象检测的一种有用替代方法,因为它允许感兴趣对象在像素级别上跨越图像中的多个区域。这种技术可以清楚地检测到形态不规则的对象,相比之下,对象检测要求对象必须位于有边界的方框内(图 2)。
如何使用语义分割?
因为语义分割会给图像中的像素加上标签,所以精确性高于其他形式的对象检测。这使得语义分割适用于各种需要准确图像映射的行业应用,比如:
- 自动驾驶 — 通过区分道路与障碍物,比如行人、人行道、电线杆和其他汽车,让汽车识别可行驶的路径
- 工业检测 — 用于检测材料中的缺陷,如晶圆检验
- 卫星影像 — 用于识别高山、河流、沙漠和其他地形
- 医学成像 — 用于分析和检测细胞中的癌变
- 机器人视觉 — 用于识别物体和地形并进行导航
示例:自动驾驶应用
图 4 中的序列显示了用于自动驾驶的语义分割的真实示例。道路的图像自动从其他车辆中分割出来。下一段显示如何创建这些网络。
了解架构
语义分割的一个常用方法是创建 SegNet,该网络基于卷积神经网络 (CNN) 架构。典型的 CNN 架构图 5 所示。
此 CNN 将整个图像划分为许多预定义类别中的一个。
要在像素级别上分类,而不是对整个图像分类,您可以追加一个 CNN 的逆向实现。上采样过程的执行次数与下采样过程相同,以确保最终图像的大小与输入图像相同。最后使用一个像素分类输出层,将每个像素映射到一个特定类。这就形成了一个编码器-解码器架构,从而实现语义分割。
步骤 1:给数据加标签或获取带标签的数据。
深度学习模型建立于大量数据之上,语义分割也不例外。其中一个选择是在互联网上查找带标签的数据。如果您有自己的数据集,则可以使用 MATLAB 中的 Image Labeler 应用程序。您可以使用此数据集训练 SegNet。
了解更多
步骤 2:为原始图像和带标签的图像创建数据存储。
在处理大量数据时,通常不可能将所有信息加载到内存中。要管理大型数据集,您可以使用数据存储。数据存储包含您想要访问的文件的位置,只有在您需要操作这些文件时,才将它们读入内存。
要创建 SegNet,您需要两个数据存储:
- ImageDatastore,它包含原始图像
- PixelLabelDatastore,它包含带标签的图像
步骤 3:分割数据存储。
在创建 SegNet 时,必须将数据存储分割为两部分:
- 训练集,用来训练 SegNet
- 测试集,用来评估网络的准确性
步骤 4:导入一个 CNN 并将其修改为 SegNet。
加载预训练的网络(如 VGG16),并使用 SegNetLayers 命令创建像素级标注所需的编码器-解码器架构。
步骤 5:训练和评估网络。
在最后一步中,设置网络的超参数并训练网络。
如何了解有关语义分割的更多信息
支持使用语义分割进行图像分析的产品包括 MATLAB、用于像素标记的 Computer Vision Toolbox 和用于创建和训练网络的 Deep Learning Toolbox。
支持 CUDA® 且计算功能集版本为 3.0 或更高的 GPU 才能支持训练和预测。建议使用 GPU,并且需要有 Parallel Computing Toolbox。
软件参考
- 语义分割基础知识 – 文档
- 卷积神经网络 – 文档
- Image Labeler 应用 – 文档