4. 语义分割标注:单类别标注、多类别标注、标签颜色配置、JSON文件结构解析
语义分割标注,说白了就是给图像里的每个像素打上标签。你想想看,一张照片里有人、有车、有树,我们要让机器知道哪个像素属于人,哪个属于车。这就是语义分割的核心任务。
我刚开始做这个的时候,总觉得跟目标检测差不多。后来才发现,完全不是一回事。检测只需要画个框,分割得把轮廓抠得清清楚楚。嗯,这里面的门道不少,咱们一个一个说。
4.1 单类别标注:从简单开始
单类别标注,就是一张图里只标一种物体。比如只标「道路」,或者只标「天空」。听起来简单吧?但实际操作中,我踩过不少坑。
核心要点:单类别标注时,背景区域默认是未标注的。你只需要把目标物体的轮廓描出来就行。
我记得第一次带团队做道路分割标注,有个新人把整张图都涂满了。他说:「道路不就是地面吗?」我哭笑不得。其实单类别标注的关键在于:只标你关心的那一类,其他区域留空。
具体操作步骤:
- 打开标注工具,加载图像
- 选择「多边形」或「画笔」工具
- 沿着目标物体边缘描点或涂抹
- 保存为单通道掩码图(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结构则是最终的存储形式。你想想看,少了任何一个环节,标注流程都跑不通。
我的建议:刚开始做语义分割标注时,先拿单类别练手。等熟悉了工具和流程,再挑战多类别。别一上来就搞十几个类别,容易乱。
好了,这一章的内容就到这里。标注这件事,看起来是体力活,但里面的门道不少。多动手、多总结,慢慢就有感觉了。
公众号:蓝海资料掘金营,微信deep3321