使用labelme对图像进行语义分割标注
写在前面
这个文档旨在教大家如何使用labelme软件进行语义分割标签的标注。
语义标注
cityscapes里面有效的标注是19类,还有很多虽然标注了,但是是无效的类别。
序号 | 名称 | category | 说明(CS的官方说明翻译而来) |
---|---|---|---|
0 | road(道路) | flat | 汽车通常行驶的地面部分,即所有车道、所有方向、所有街道。包括道路上的标记。仅由标线与主干道划定的区域(无纹理变化)也是道路,如自行车道、环岛车道或停车位。这个标签不包括路缘石。 |
1 | sidewalk(人行道) | flat | 指定给行人或骑自行车者的部分地面。由一些障碍物,如路缘石或杆子(可能很小),而不仅仅是由标记来划分的道路。与道路相比,通常被抬高。通常位于道路的两侧。这个标签包括一个可能限定的路边,交通岛(可行走的部分),或行人区(通常在白天不允许汽车行驶的地方)。 |
parking (停车场) | flat | 停车场和车道。不是用于常规驾驶,而是用于停放车辆。与道路的质地不同。在车道未与人行道分开的模糊情况下(如建筑物入口),标记为人行道。 | |
rail track(铁轨) | flat | 所有不能被汽车驾驶的轨道,如地铁和火车轨道,而有轨电车轨道通常可以被汽车驾驶,因此是道路的一部分。 | |
2 | building(建筑) | construction | 建筑物,摩天大楼,房屋,公共汽车站建筑,车库,汽车港口。如果建筑物有一堵可以看穿的玻璃墙,这堵墙仍然是建筑物。包括附属于建筑物的脚手架。 |
3 | wall | construction | 独立的立墙。不是建筑物的一部分。 |
4 | fence(栅栏) | construction | 栅栏,包括任何孔洞。 |
guard rail | 所有类型的护栏/碰撞屏障。 | ||
bridge | 桥。只有桥。栅栏、上面的人或车辆是单独标注的。 | ||
tunnel | 隧道墙和 "黑暗"。没有车辆。 | ||
5 | pole(杆) | object | 主要是垂直方向的小杆。如:标志杆、交通灯杆。如果杆子有一个水平部分(通常为交通灯杆),这部分也被认为是杆子。如果在杆子上安装有既不是交通灯也不是交通标志的东西(例如路灯),并且其直径(以像素计)最多为杆子直径的两倍,那么这些东西也可能被标为杆子。如果它们更大,则被标记为静态。 |
pole group | 多个杆子,单独标注起来很麻烦。如果两根柱子之间的空隙最多只有一个柱子的宽度,那么使用这种标签是可以的。 | ||
6 | traffic light | object | 没有杆子的交通灯箱。 |
7 | traffic sign | object | 由国家/城市当局安装的标志,通常在日常交通场景中为司机/骑车人/行人提供信息,例如,交通标志、停车标志、方向标志--不包括其杆子。没有广告/商业标志。只有标志的正面包含信息。背面是静态的。请注意,附着在建筑物上的商业标志成为建筑物,附着在电线杆上或自己站立的标志成为静态的。 |
8 | vegetation(植被) | nature | 树木、树篱、各种垂直植被。附着在建筑物上的植物通常不单独注解,也标明建筑物。如果生长在墙壁或建筑物的侧面,如果覆盖了表面的很大一部分(超过20%),则标记为植被。 |
9 | terrain(地形) | nature | 草,各种水平植被,土壤或沙子。这些区域是不允许在上面行驶的。这个标签包括一个可能是划定的路边。单个的草茎不需要注释,得到它们所生长的区域的标签。 |
10 | sky(天空) | sky | 开放的天空,没有树叶。包括在天空前面的细电线。 |
11 | person(行人) | human | 一个符合以下标准的人。假设这个人移动了1米的距离,然后又停下来。如果这个人会走路,标签就是人,否则就不是。例如,人在地上、长椅上、椅子上行走、站立或坐着。这个类别还包括幼儿、推着自行车的人或站在自行车旁边,两只脚在自行车的同一侧。这类人包括由人携带的任何东西,如背包,但不包括接触地面的物品,如手推车。 |
12 | rider | human | 一个会使用某种设备移动1米距离的人。包括,自行车、摩托车、滑板车、滑板、马、轮滑、轮椅、道路清洁车、无车顶汽车的骑手/司机。注意,有车顶的汽车的可见司机只能通过窗户看到。由于洞口没有标示,所以人被列入汽车标签中。 |
13 | car(汽车) | vehicle | 轿车、吉普车、SUV、有连续车身形状的面包车、大篷车,没有其他拖车。 |
14 | truck | vehicle | 卡车,箱式卡车,皮卡。包括其拖车。后部/装载区与驾驶室物理隔离。 |
15 | bus | vehicle | 9人以上的巴士,公共运输或长途运输。 |
16 | train | vehicle | 轨道上的车辆,如有轨电车、火车。 |
17 | motorcycle | vehicle | 摩托车、轻便摩托车、没有司机的踏板车(那是骑手,见上文)。 |
18 | bicycle | vehicle | 没有司机的自行车(那是骑手,见上文)。 |
caravan | 像卡车一样,但后面主要是用来居住/睡觉的。包括大篷车拖车。 | ||
trailer | 拖车通常由汽车拉动。请注意,卡车拖车的标签是卡车,大篷车拖车的标签是大篷车,自行车或马拖车的标签是动态。 | ||
ground | 所有其他形式的不符合上述任何一条的水平地面结构。例如汽车和行人全天共用的区域,平坦但由路缘石与道路隔开的环岛,交通岛的高架部分,水。平坦区域的虚空标签。 | ||
dynamic | 第二天/一小时/一分钟后可能不再存在的东西。可移动的垃圾桶、手推车、袋子、轮椅、动物。 | ||
static | 背景中无法区分的杂物。不符合上述任何一项的物体。例如,小我私家车辆的可见部分、山、路灯、标志的背面。另外,图像中相当小的区域也是上述的一些类别,但要精确标注却很麻烦,可能会被注释为静态。 |
关于以上的类别的具体的含义,可以见CS的这个链接。
上面表格中的红色部分是CS虽然标记了的,但是并没有作为真实的类别去考虑,也就是作为无效的类别。
对我们的问题而言,标注很多类需要巨大的工作量,所以为了简便起见,只标注了六类,如下表格所示
序号 | 名称 | category | 注意事项 |
---|---|---|---|
0 | road (道路) | flat | 注意和sidewalk以及parking进行区分 |
2 | building(建筑) | construction | |
5 | pole(杆) | object | |
7 | sign | object | 原来为traffic sign,只要是sign都可以标注,详见cs:由国家/城市当局安装的标志,通常在日常交通场景中为司机/骑车人/行人提供信息,例如,交通标志、停车标志、方向标志--不包括其杆子。没有广告/商业标志。只有标志的正面包含信息。背面是静态的。请注意,附着在建筑物上的商业标志成为建筑物,附着在电线杆上或自己站立的标志成为静态的。交通标识的背面不标记 |
8 | vegetation | nature | 注意和terrain的区别 |
10 | sky(天空) | sky | |
11 | person(行人) | human | rider不算行人,哪怕推着自行车也不行 |
13 | car(汽车) | vehicle |
软件安装
label是一个开源的软件,通过conda配置环境,并且进行安装,链接。视频教程链接。
软件使用
下载修改之后的仓库
软件安装完成之后,需要这个链接下载labelme这个修改过之后的代码仓库,切换到该仓库下的examples\semantic_segmentation目录下,然后运行启动labelme的,并且加载对应的标签的命令
# linux or mac用户:
labelme 需要标注的数据路径 --labels labels.txt --nodata --validatelabel exact --config '{shift_auto_shape_color: -2}'
# 对windows用户而言,需要将最后config的单引号修改为双引号
labelme 需要标注的数据路径 --labels labels.txt --nodata --validatelabel exact --config "{shift_auto_shape_color: -2}"
比如我将需要标注的数据和仓库放到同一目录,运行命令如下
labelme ../../../../source_data3 --labels labels.txt --nodata --validatelabel exact --config "{shift_auto_shape_color: -2}"
进行标注
标注过程见教程链接.
- rider不是person,可以不进行标注
- sign的背面不是sign
数据可视化
python ./labelme2voc.py 包含json的文件夹 存储的诸如Pascal voc的路径 --labels labels.txt