语义分割动手实践 - labelme标注和标签生成
最近接触到语义分割任务,借助deeplabv3+和BiSeNet v2对分割任务有了初步的了解,为自己记录下整个流程
1、语义分割数据标注
标注工具:由于语义/实例分割任务多是多边形(polygons)轮廓标注,在此选用labelme标注工具。
labelme安装,有需要可以创建虚拟环境,有python和pyqt5即可:
创建labelme虚拟环境
conda create -n labelme python=3.8
激活虚拟环境
conda activate labelme
pip安装pyqt5
pip install pyqt5
安装labelme
pip install labelme
界面:

语义分割标注需要十分精细化,标注过程很复杂耗时,便捷的工具很重要。labelme支持自定义快捷键,可提高标注效率:
在win10环境标注的话,在用户目录下,修改labelme的配置文件:C:\Users\yourUserName\.labelmerc
本文自定义快捷键 (可在.labelmerc对应位置修改):
左侧工具栏openDir:打开待标注的图像目录
按 A 和 D 进入上一张 / 下一张图像 (默认)
按 w - 进入多边形标注模式
按 E - 多边形框编辑模式 (可拖动点调整框的边缘和位置)
每标注完一张可以按E,观察一下这张图像是否有遗漏,是否紧密。
在编辑模式下按delete可以删除选中的多边形框
按ctrl + z 撤销上一步操作 ( 撤销上一个点 )
按Esc - 撤销当前未标注完的多边形框
需要在多边形的边上加点时,鼠标移动到polygons的边上,变成小手后,右键Add point to Edge, 或快捷键ctrl + shift + p
修改.labelmerc
auto_save: false,改为true,自动保存图像,标注完可以直接按D进入下一张
save: Ctrl+S 改为 save: [Space,Ctrl+S] 表示适用空格和Ctrl+s两种方法进行保存
create_polygon: Ctrl+N 改为 create_polygon: [W, Ctrl+N] 表示使用W 和ctrl+n 两种方式进行画框
edit_polygon: Ctrl+J 改为 edit_polygon: [E, Ctrl+J] 表示使用E 和Ctrl+j ;两种方式进行编辑框
2、根据json批量生成mask标签图像
- labelme_json_to_dataset脚本生成单张图像
labelme提供了生成数据的脚本:labelme_json_to_dataset
标注时如果没有取消File - save with image data,labelme会在json文件中自动保存该张图像的base64数据。
终端输入labelme_json_to_dataset + 文件名.json即可生成标签图像:

生成的__json文件夹中:
- img.png 对应的局部的jpg原图文件,训练时要用
- label.png 局部类别标签
- label_names.txt 在这张图像上目标的分类名称
- label_viz.png 可视化标签图,便于我们确认是否标记正确
观察labelme的源码可以发现,生成mask时会根据分类排序,自动从颜色表中匹配颜色。生成label.png,其中用到了imgviz库的label2rgb方法:
label_names=['_background_', 'person', 'car', 'land', 'sky']
# input: 从json中读取的标签分类lbl,灰度的img, label_names(分割种类字典)
lbl_viz = imgviz.label2rgb(
label=lbl, img=imgviz.asgray(img), label_names=label_names, loc="rb"
)
其中imgviz.label2rgb()的api:
我们只需修改前四个参数:label, image=None, alpha=0.5, label_names=None,本文浅显的理解是该函数根据分类序列分配alpha=0.5的颜色值,并将lbl当中的多边形数据copy - paste到输入的灰度图中,构成label_viz.png
alpha=0.5 即各个种类的颜色会128递增:颜色列表如下(最多可有256个分类):
return np.asarray([[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],
[0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],
[64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],
[64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],
[0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],
[0, 64, 128]])
imgviz.label2rgb():
imgviz.label2rgb(label, image=None, alpha=0.5, label_names=None, font_size=30, thres

本文详细介绍了如何使用LabelMe工具进行语义分割任务的精细标注,包括快捷键设置、json到mask的批量转换,以及数据集构建和划分的过程,重点在于解决掩膜颜色一致性问题。
最低0.47元/天 解锁文章
2296

被折叠的 条评论
为什么被折叠?



