4. 语义分割标注:单类别标注、多类别标注、标签颜色配置、JSON文件结构解析

语义分割标注,说白了就是给图像里的每个像素打上标签。你想想看,一张照片里有人、有车、有树,我们要让机器知道哪个像素属于人,哪个属于车。这就是语义分割的核心任务。

我刚开始做这个的时候,总觉得跟目标检测差不多。后来才发现,完全不是一回事。检测只需要画个框,分割得把轮廓抠得清清楚楚。嗯,这里面的门道不少,咱们一个一个说。

4.1 单类别标注:从简单开始

单类别标注,就是一张图里只标一种物体。比如只标「道路」,或者只标「天空」。听起来简单吧?但实际操作中,我踩过不少坑。

核心要点:单类别标注时,背景区域默认是未标注的。你只需要把目标物体的轮廓描出来就行。

我记得第一次带团队做道路分割标注,有个新人把整张图都涂满了。他说:「道路不就是地面吗?」我哭笑不得。其实单类别标注的关键在于:只标你关心的那一类,其他区域留空。

具体操作步骤:

  1. 打开标注工具,加载图像
  2. 选择「多边形」或「画笔」工具
  3. 沿着目标物体边缘描点或涂抹
  4. 保存为单通道掩码图(mask)

我的习惯:单类别标注时,我一般用白色(像素值255)表示目标,黑色(像素值0)表示背景。这样生成的掩码图一目了然。

4.2 多类别标注:区分不同物体

多类别标注就复杂多了。一张图里可能有行人、车辆、交通标志、路灯……每个类别都得用不同的标签值来区分。

为什么会这样?因为神经网络需要知道「这是人,不是车」。如果都用同一个值,模型就学不会区分。

我在项目中遇到过最头疼的事:两个标注员对同一张图标出了不同的类别编号。一个人把「轿车」标为1,另一个人标为2。结果模型训练出来,完全混乱了。所以,类别编号必须统一

多类别标注的常用做法:

  • 每个类别分配一个固定的整数值(如:人=1,车=2,树=3)
  • 背景统一为0
  • 不同类别的区域不能重叠

注意:我曾经犯过一个低级错误——两个相邻的类别之间留了缝隙。模型训练时,那些缝隙像素就成了「未知区域」,导致分割结果出现锯齿。标注时一定要让不同类别的边界紧密贴合。

4.3 标签颜色配置:让标注可视化

标注数据是数值,但人眼看数值很费劲。所以我们需要给每个类别配一种颜色。比如人用红色,车用蓝色,树用绿色。

颜色配置看起来是小事,但影响很大。我见过一个项目,用了相近的橙色和黄色来标道路和路肩,结果标注员自己都分不清。后来我定了个规矩:相邻类别的颜色必须有明显差异

常用的颜色配置方案:

类别 标签值 颜色(RGB) 备注
背景 0 (0, 0, 0) 黑色
1 (255, 0, 0) 红色
2 (0, 255, 0) 绿色
道路 3 (128, 128, 128) 灰色
建筑 4 (0, 0, 255) 蓝色

小技巧:我习惯把颜色配置写成一个JSON文件,跟标注数据放在一起。这样换工具、换人,颜色都不会乱。

4.4 JSON文件结构解析:标注数据的「身份证」

标注完的图像,最终要存成结构化的数据。JSON格式是最常用的。它记录了每张图的标注信息,包括图像路径、尺寸、每个物体的类别和轮廓坐标。

一个典型的语义分割JSON文件长这样:

{
  "version": "1.0",
  "images": [
    {
      "id": 1,
      "file_name": "img_001.jpg",
      "width": 1920,
      "height": 1080
    }
  ],
  "categories": [
    {"id": 1, "name": "person", "color": [255, 0, 0]},
    {"id": 2, "name": "car", "color": [0, 255, 0]},
    {"id": 3, "name": "road", "color": [128, 128, 128]}
  ],
  "annotations": [
    {
      "image_id": 1,
      "category_id": 1,
      "segmentation": [
        [x1, y1, x2, y2, x3, y3, ...]
      ],
      "area": 12345.6,
      "bbox": [100, 200, 300, 400]
    }
  ]
}

我来拆解一下这个结构:

  • images:记录每张图的基本信息。id是唯一标识,file_name是文件名,width和height是图像尺寸。
  • categories:定义所有类别。每个类别有id、name和color。color就是前面说的可视化颜色。
  • annotations:标注的具体内容。image_id关联到哪张图,category_id关联到哪个类别,segmentation是轮廓坐标列表。

重点:segmentation里的坐标是「多边形顶点」的x,y值,按顺序连接起来就是物体的轮廓。area是轮廓围成的面积,bbox是外接矩形。

我记得有一次,解析别人的JSON数据时发现segmentation坐标是乱序的。结果画出来的轮廓像一团乱麻。后来我养成了习惯:标注完成后,用可视化工具检查一遍轮廓。别偷懒,这一步能省很多后期调试的时间。

4.5 知识体系总览

下面这张图,是我自己总结的语义分割标注知识体系。你可以把它当作一个「地图」,随时回来对照。

语义分割标注知识体系 单类别标注 只标一种物体 多类别标注 区分不同物体 颜色配置 可视化标签 JSON结构 数据存储格式 四个核心模块,相互关联,构成完整的标注流程

从这张图你能看到,四个模块是环环相扣的。单类别是多类别的基础,颜色配置让标注可视化,JSON结构则是最终的存储形式。你想想看,少了任何一个环节,标注流程都跑不通。

我的建议:刚开始做语义分割标注时,先拿单类别练手。等熟悉了工具和流程,再挑战多类别。别一上来就搞十几个类别,容易乱。

好了,这一章的内容就到这里。标注这件事,看起来是体力活,但里面的门道不少。多动手、多总结,慢慢就有感觉了。


公众号:蓝海资料掘金营,微信deep3321