Appearance
语义分割和数据集
一、什么是语义分割
语义分割是计算机视觉里的一个任务,它的目标是把图像里的每个像素都分到对应的语义类别里,比如区分出图像里的狗、猫、背景这些区域,每个像素都有明确的类别标签。和目标检测不一样,目标检测是用矩形框把目标框出来,而语义分割是像素级的标注,能更精细地识别图像里的内容。
二、相关的几个任务
1. 图像分割
图像分割和语义分割不一样,它不需要标注信息,只是把图像分成不同的区域,这些区域不一定有语义意义。比如它可能把狗的身体分成黑色的嘴眼区域和黄色的身体区域,但不知道这是狗。
2. 实例分割
实例分割不仅要区分语义,还要区分不同的实例。比如图像里有两条狗,实例分割要能区分出每个像素属于哪条狗,而语义分割只需要知道是狗就行,不管是哪一条。
三、Pascal VOC2012 语义分割数据集
Pascal VOC2012 是一个很重要的语义分割数据集,里面有很多标注好的图像,每个图像都有对应的标签图像,标签图像里的每个像素都有对应的语义类别。
1. 数据集的结构
这个数据集里有几个重要的文件夹:
ImageSets/Segmentation:里面是文本文件,记录了哪些图像是训练用的,哪些是测试用的。JPEGImages:存放的是原始的输入图像。SegmentationClass:存放的是标签图像,标签图像里不同颜色的像素代表不同的语义类别。
2. 读取数据集
我们可以写一个函数来读取数据集里的图像和标签,把它们加载到内存里。读取的时候要注意,输入图像是 RGB 格式的,标签图像也是 RGB 格式,不同的 RGB 值对应不同的类别。
3. 预处理数据
在语义分割里,我们不能像图像分类那样缩放图像,因为缩放之后再把预测结果映射回原始尺寸会不够精确。所以我们用随机裁剪的方法,把输入图像和标签裁剪成固定的大小,这样保证输入和标签的像素是一一对应的。
4. 自定义数据集类
我们可以自定义一个数据集类,方便我们加载和处理数据。这个类要实现几个功能:
过滤掉尺寸太小的图像,因为这些图像没法裁剪成我们需要的大小。
对输入图像进行标准化,把 RGB 通道的值调整到合适的范围。
随机裁剪输入图像和标签,保证它们的区域是一致的。
把标签图像里的 RGB 值转换成类别索引,方便模型处理。
5. 加载数据集
我们可以用自定义的数据集类来创建训练集和测试集的实例,然后用数据加载器来批量读取数据。和图像分类不一样,语义分割的标签是三维数组,因为每个像素都有一个类别索引。
四、小结
语义分割是像素级的图像识别任务,能更精细地理解图像内容。
图像分割和实例分割是和语义分割相关的任务,但它们的目标不一样。
Pascal VOC2012 是一个常用的语义分割数据集,使用的时候要注意用随机裁剪的方法预处理数据,不要缩放图像。
自定义数据集类可以方便我们加载和处理语义分割的数据。
(注:文档部分内容可能由 AI 生成) 源地址