在 CVAT 中创建与导出分割掩码(Mask):背景类打孔、类颜色与多格式导出实战指南
【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat
本指南围绕 CVAT 标注界面中的掩码(Mask)生成与导出能力展开:介绍如何在多边形标注中借助"背景类"与 z 轴排序实现打孔效果,梳理 CVAT 支持掩码导出的六种数据集格式,并深入讲解类颜色(Class Colors)与背景类(Background Class)在导出掩码中的底层约定。读完本文,你将掌握"从多边形标注到语义/实例分割掩码"的完整工作流,并能结合仓库源码理解掩码导出的变换管线与配色机制。
背景类与"打孔":在多边形中切割透明孔洞
在 CVAT 编辑器中,目前并不支持在多边形内部直接切割出透明的孔洞。不过,借助一个巧妙的标注约定,你可以在导出的实例掩码(instance mask)与类掩码(class mask)中生成孔洞效果:
- 在任务中定义一个背景类(background class);
- 用背景类以"额外的形状"形式,把孔洞画在需要打孔的形状之上(即在 z 轴顺序上处于更高层级)。
标注窗口中的效果如下(图中的深色多边形即为使用背景类绘制的孔洞形状,覆盖在目标形状之上):
绘制时请牢记使用z 轴排序快捷键来调整形状的层级:
[(左方括号):将选中形状的 z 轴层级下移;+或=(加号/等号):将选中形状的 z 轴层级上移。
z 轴顺序在 CVAT 前端由独立的图层状态管理。从源码可以看到,zLayer维护着min/max/cur三个关键状态(annotation-reducer.ts),而 switchZLayer 动作 负责在用户按下快捷键时切换当前层级。这一机制确保了"孔洞形状"始终绘制在目标形状之上。
按上述方式标注并导出后,得到的效果如下:类掩码(左)与实例掩码(右)中均出现了正确的孔洞:
注意:当前版本中,内部形状(孔洞)无法拥有独立的实例编号。导出的处理逻辑会先将内部形状合并到面积最大的外部形状中,再用背景类形状将其覆盖为"孔"。也就是说,孔洞只是视觉与像素意义上的空洞,并不会作为独立实例出现在实例掩码中。
可导出掩码的数据集格式
CVAT 提供多种支持掩码导出的数据集格式,覆盖语义分割、实例分割、文本检测与跟踪等常见场景:
| 格式 | 说明 |
|---|---|
Segmentation Mask | 基于 PASCAL VOC 分割格式的自定义掩码格式,同时产出类掩码与实例掩码(即本文后续重点讲解的格式) |
CamVid | 面向自动驾驶街景分割的经典格式 |
MOTS | 多目标跟踪与分割格式,掩码按帧导出 |
ICDAR | 面向文本检测/分割任务的格式 |
COCO | 以 RLE 编码导出实例掩码,详见 COCO 格式指南 |
Datumaro | Datumaro 通用数据格式,掩码以 PNG 或 RLE 形式存储 |
各格式的完整导出/导入说明可参见对应文档:Segmentation Mask、CamVid、MOTS、ICDAR、Datumaro。
以Segmentation Mask格式导出的掩码示例如下——左侧为合并后的类掩码,右侧为合并后的实例掩码:
在掩码导出时,有两个重要行为需要留意:
- 矩形框(boxes)与多边形(polygons)都会被转换为掩码,因此即使你的任务中只画了矩形框或多边形,也能得到完整的掩码结果;
- 被分组的对象被视为单个实例,会合并导出为一张掩码,其标签(label)与属性(attributes)取自组内面积最大的对象。
掩码导出的底层变换管线(源码级解析)
掩码导出并非简单的"形状转图片",在 mask.py 中可以看到一条完整的 Datumaro 变换管线:
dataset.transform(RotatedBoxesToPolygons) # 旋转框转为多边形 dataset.transform("polygons_to_masks") # 多边形转为掩码 dataset.transform("boxes_to_masks") # 矩形框转为掩码 dataset.transform(EllipsesToMasks) # 椭圆转为掩码 dataset.transform("merge_instance_segments")# 合并同一实例的片段 dataset.export( temp_dir, "voc_segmentation", save_media=save_images, apply_colormap=True, # 应用类颜色映射 label_map=make_colormap(instance_data), # 依据标签颜色构建色表 )关键点解读:
merge_instance_segments变换负责把属于同一实例(含分组对象)的多个掩码片段合并为一张掩码,这正是"组内对象导出为单一实例"以及"内部形状被并入最大形状"这一行为的实现来源。该变换同样出现在 camvid.py、mots.py、icdar.py 等掩码类格式的导出器中;make_colormap决定像素颜色(见 utils.py):它遍历任务的全部标签,并为每个标签建立label -> [RGB 颜色, [], []]的映射;值得注意的是,如果任务中没有名为background的标签,会自动在色表最前面插入{"name": "background", "color": "#000000"},这也是"默认背景为黑色"这一约定的代码根源;EllipsesToMasks(transformations.py)使用 OpenCV 的cv2.ellipse把椭圆栅格化为 RLE 掩码,并在转换时保留z_order、group等元数据,保证打孔与分组语义不丢失。
Segmentation Mask格式导出的产物是一个 ZIP 压缩包,其标准目录结构如下(详细说明见 format-smask.md):
taskname.zip/ ├── labelmap.txt # 可选,非 PASCAL VOC 标签时必需 ├── ImageSets/ │ └── Segmentation/ │ └── default.txt # 不含扩展名的图片名列表 ├── SegmentationClass/ # 合并后的类掩码 │ ├── image1.png │ └── image2.png └── SegmentationObject/ # 合并后的实例掩码 ├── image1.png └── image2.png掩码是 1 通道或 3 通道的 PNG 图片,每个像素的颜色对应一个标签;颜色依据 PASCAL VOC 的色板算法生成,默认用(0, 0, 0)表示背景。
类颜色(Class Colors):掩码配色的来源
所有标签都关联着一个颜色值,这个颜色就是生成掩码时该标签类别的像素颜色。你可以在**任务标签属性(Task Label Properties)**中通过取色器直接修改标签颜色:
标签颜色同时也会显示在标注窗口右侧的标签面板中,在那里你可以显示或隐藏特定标签(面板上只显示当前任务中已存在的标签):
从源码角度看,标签颜色在导出时被make_colormap读取(标签的color字段以十六进制字符串存储,如#ff0000,通过hex2rgb转为 RGB 元组),随后作为voc_segmentation导出的label_map传入,最终决定每个标签在掩码 PNG 中的像素颜色。标签的默认配色则由 predefined_colors.txt 与 utils.py 中的哈希算法共同决定。
背景类(Background Class)的三种定义方式
在导出掩码时,"背景"这一概念有三种等价定义方式,优先级从高到低:
- 默认隐式添加的类:即使任务中没有任何背景类定义,导出色表中也会自动插入一个纯黑色的背景类(RGB
0, 0, 0)。如前文所述,这一行为由 make_colormap 中的if "background" not in label_names: labels.insert(0, ...)保证; - 名为
background的标签类:可以为其指定任意颜色,且名称匹配大小写不敏感(如Background、BACKGROUND均可识别)。该名称具有最高优先级——只要存在名为background的标签,导出色表就会直接采用它的颜色作为背景色; - 任意黑色类:任何颜色为纯黑(RGB
0, 0, 0)的标签类,在掩码中同样会被视为背景。
修改背景色的方法:默认情况下导出掩码的背景为黑色。如果你希望背景呈现其他颜色,只需将任务中background标签的颜色改为目标颜色即可(例如改为(0, 128, 0)绿色),导出时色表便会以该颜色作为背景像素值。
小结:一套完整的掩码标注与导出工作流
综合以上内容,在 CVAT 中从多边形标注到高质量分割掩码的完整路径为:
- 建任务:定义目标标签,并视需要添加
background标签用于打孔(名称大小写不敏感,颜色可自定义); - 标注:用多边形/矩形/椭圆绘制目标形状,用
[与+/=调整 z 轴顺序,把背景类形状叠放在需要打孔的位置上方;需要合并为同一实例的对象使用分组功能; - 调色:在任务标签属性中为每个标签指定掩码颜色,确保类掩码的可辨识度;
- 导出:选择
Segmentation Mask、CamVid、MOTS、ICDAR、COCO或Datumaro格式导出,得到带孔洞、带类色的类掩码与实例掩码。
理解 mask.py 的变换管线、make_colormap 的配色约定,以及 format-smask.md 的 ZIP 结构规范,能帮助你在实际项目中精准控制掩码导出的每一个细节——无论是孔洞、实例合并还是背景色定制。
【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考