Skip to content

语义分割和数据集

一、什么是语义分割

语义分割是计算机视觉里的一个任务,它的目标是把图像里的每个像素都分到对应的语义类别里,比如区分出图像里的狗、猫、背景这些区域,每个像素都有明确的类别标签。和目标检测不一样,目标检测是用矩形框把目标框出来,而语义分割是像素级的标注,能更精细地识别图像里的内容。

alt text

二、相关的几个任务

1. 图像分割

图像分割和语义分割不一样,它不需要标注信息,只是把图像分成不同的区域,这些区域不一定有语义意义。比如它可能把狗的身体分成黑色的嘴眼区域和黄色的身体区域,但不知道这是狗。

2. 实例分割

实例分割不仅要区分语义,还要区分不同的实例。比如图像里有两条狗,实例分割要能区分出每个像素属于哪条狗,而语义分割只需要知道是狗就行,不管是哪一条。

三、Pascal VOC2012 语义分割数据集

Pascal VOC2012 是一个很重要的语义分割数据集,里面有很多标注好的图像,每个图像都有对应的标签图像,标签图像里的每个像素都有对应的语义类别。

1. 数据集的结构

这个数据集里有几个重要的文件夹:

  • ImageSets/Segmentation:里面是文本文件,记录了哪些图像是训练用的,哪些是测试用的。

  • JPEGImages:存放的是原始的输入图像。

  • SegmentationClass:存放的是标签图像,标签图像里不同颜色的像素代表不同的语义类别。

2. 读取数据集

我们可以写一个函数来读取数据集里的图像和标签,把它们加载到内存里。读取的时候要注意,输入图像是 RGB 格式的,标签图像也是 RGB 格式,不同的 RGB 值对应不同的类别。

3. 预处理数据

在语义分割里,我们不能像图像分类那样缩放图像,因为缩放之后再把预测结果映射回原始尺寸会不够精确。所以我们用随机裁剪的方法,把输入图像和标签裁剪成固定的大小,这样保证输入和标签的像素是一一对应的。

4. 自定义数据集类

我们可以自定义一个数据集类,方便我们加载和处理数据。这个类要实现几个功能:

  • 过滤掉尺寸太小的图像,因为这些图像没法裁剪成我们需要的大小。

  • 对输入图像进行标准化,把 RGB 通道的值调整到合适的范围。

  • 随机裁剪输入图像和标签,保证它们的区域是一致的。

  • 把标签图像里的 RGB 值转换成类别索引,方便模型处理。

5. 加载数据集

我们可以用自定义的数据集类来创建训练集和测试集的实例,然后用数据加载器来批量读取数据。和图像分类不一样,语义分割的标签是三维数组,因为每个像素都有一个类别索引。

四、小结

  1. 语义分割是像素级的图像识别任务,能更精细地理解图像内容。

  2. 图像分割和实例分割是和语义分割相关的任务,但它们的目标不一样。

  3. Pascal VOC2012 是一个常用的语义分割数据集,使用的时候要注意用随机裁剪的方法预处理数据,不要缩放图像。

  4. 自定义数据集类可以方便我们加载和处理语义分割的数据。

(注:文档部分内容可能由 AI 生成) 源地址

京ICP备2024093538号-1