
CVAT 分割掩码数据集实战Segmentation 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/cvatCVAT 内置的 Segmentation Mask 格式面向语义分割、实例分割与全景分割等图像分割任务提供一套基于 Pascal VOC 分割格式的简化数据交换方案导出时生成包含逐像素掩码图片与labelmap.txt颜色映射的 ZIP 归档导入时可将这些掩码还原为 CVAT 中的 Mask 或 Polygon 标注。读完本文你将掌握该格式的文件结构、labelmap.txt的 3 通道与 1 通道两种编写规则、掩码着色的 Pascal VOC 颜色算法以及 CVAT 后端在cvat/apps/dataset_manager/formats/mask.py中实现的完整导出/导入流水线。格式定位基于 Pascal VOC 的分割掩码Segmentation Mask 是一种简单的图像分割数据格式适用于语义分割semantic segmentation、实例分割instance segmentation和全景分割panoptic segmentation任务。它是 CVAT 自定义格式底层基于 Pascal VOC 分割格式扩展而来文档中明确了这一定位因此在文件目录布局、labelmap.txt约定上与 VOC 家族保持一致但将标注统一落盘为逐像素的 PNG 掩码图像便于与常见的分割数据集工具和训练框架对接。Segmentation Mask 导出支持的标注类型与限制支持的标注Mask、BoundingBox转换为掩码、Polygon转换为掩码、Ellipse转换为掩码属性Attributes不支持轨迹Tracks不支持导出时会拆分为独立的形状导出文件的目录结构下载得到的文件是一个.zip归档结构如下taskname.zip/ ├── labelmap.txt # optional, required for non-Pascal VOC labels ├── ImageSets/ │ └── Segmentation/ │ └── default.txt # list of image names without extension ├── SegmentationClass/ # merged class masks │ ├── image1.png │ └── image2.png └── SegmentationObject/ # merged instance masks ├── image1.png └── image2.png # labelmap.txt # label : color (RGB) : body parts : actions background:0,128,0:: aeroplane:10,10,128:: bicycle:10,128,0:: bird:0,108,128:: boat:108,0,100:: bottle:18,0,8:: bus:12,28,0::其中ImageSets/Segmentation/default.txt列出参与导出的图像名不含扩展名SegmentationClass/按类别合并的掩码merged class masks同一类别的所有实例像素合并到同一张图上适合语义分割SegmentationObject/按实例合并的掩码merged instance masks每个实例占据一个独立颜色索引适合实例分割。掩码图像的像素编码规则每张掩码都是一张 1 通道或 3 通道的.png图像图像中每个像素的颜色对应一个特定标签。颜色按 Pascal VOC 官方配色算法生成默认使用颜色(0, 0, 0)表示背景。labelmap.txt的每一行遵循label : color (RGB) : body parts : actions的格式冒号分隔 4 个字段第一行注释说明了这一约定对 CVAT 来说关键是前两个字段——标签名与 RGB 颜色。源码级解析导出流水线CVAT 后端在 cvat/apps/dataset_manager/formats/mask.py 中注册了该格式导出函数名为 Segmentation mask、扩展名 ZIP、版本号 1.1exporter(nameSegmentation mask, extZIP, version1.1) def _export(dst_file, temp_dir, instance_data, save_imagesFalse): with GetCVATDataExtractor(instance_data, include_imagessave_images) as extractor: dataset Dataset.from_extractors(extractor, envdm_env) 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_mediasave_images, apply_colormapTrue, label_mapmake_colormap(instance_data), ) make_zip_archive(temp_dir, dst_file)从这条调用链可以读出文档中标注支持结论的实现依据GetCVATDataExtractor从 CVAT 任务/项目中抽取标注数据构建 Datumaro 数据集RotatedBoxesToPolygons定义于 cvat/apps/dataset_manager/formats/transformations.py先把带旋转角度的 Bounding Box 展开为 Polygon再经polygons_to_masks转为掩码——这就是BBox 作为掩码导出的路径boxes_to_masks处理普通 Bounding Box将其外扩为矩形掩码EllipsesToMasks使用 OpenCV 的cv2.ellipse绘制填充椭圆并编码为 RLE实现Ellipse 作为掩码merge_instance_segments将同图内的掩码合并从而同时产出SegmentationClass与SegmentationObject两个目录最终以voc_segmentation格式落盘并打包为 ZIP。其中label_mapmake_colormap(instance_data)决定了labelmap.txt的内容。cvat/apps/dataset_manager/formats/utils.py 中的make_colormap会读取任务的标签定义若标签列表中不存在background会自动在首位插入{name: background, color: #000000}并把每个标签的十六进制颜色解析为 RGB 三元组。这解释了文档中默认背景色为(0, 0, 0)以及labelmap.txt首行为background:0,128,0::这类示例数据的来源示例中背景颜色来自标签自身的配色而非强制覆写为黑色。另外两点与源码相关的事实格式注册入口在 cvat/apps/dataset_manager/formats/registry.py 中统一导入mask模块导出/导入格式分别登记到EXPORT_FORMATS/IMPORT_FORMATS字典前端导出/导入对话框里的 Segmentation mask 1.1 (ZIP) 选项即来自这里标签颜色与预定义颜色表 cvat/apps/dataset_manager/formats/predefined_colors.txt 及 Pascal VOC 哈希配色get_color_from_index将 8 位颜色索引展开为 3 个 8 位颜色通道保持一致保证掩码像素颜色可被标准 VOC 工具链正确解析。Segmentation Mask 导入支持的标注类型与限制支持的标注MaskPolygon当启用 Convert masks to polygons 选项时属性Attributes不支持轨迹Tracks不支持上传的文件是如下结构的.zip归档archive.zip/ ├── labelmap.txt # optional, required for non-Pascal VOC labels ├── ImageSets/ │ └── Segmentation/ │ └── any_subset_name.txt ├── SegmentationClass/ │ ├── image1.png │ └── image2.png └── SegmentationObject/ ├── image1.png └── image2.png与导出相比导入对子集名的要求更宽松any_subset_name.txt且同时支持 3 通道彩色掩码和灰度1 通道掩码。3 通道掩码导入用 labelmap.txt 声明全部颜色导入 3 通道掩码时labelmap.txt必须声明数据集中用到的所有颜色# labelmap.txt # label : color (RGB) : body parts : actions background:0,128,0:: aeroplane:10,10,128:: bicycle:10,128,0:: bird:0,108,128:: boat:108,0,100:: bottle:18,0,8:: bus:12,28,0::即每一行把颜色 (RGB)与标签名绑定CVAT 按掩码图中的实际像素颜色查表反解出标签。1 通道掩码导入无间隙的连续颜色索引导入 1 通道灰度掩码时labelmap.txt的编写规则完全不同——它按行号即颜色索引的方式声明且要求声明的颜色索引不能有空缺no gaps行数必须等于掩码图中出现的最大颜色索引注意文档表述为行数量与最大索引对应的声明关系行的顺序必须与颜色索引一一对应第 n 行对应颜色索引 n每行的颜色字段可以任意且互不相同若标注中实际使用的颜色索引存在跳号必须用任意占位标签dummy labels把空位补齐。示例# labelmap.txt # label : color (RGB) : body parts : actions q:0,128,0:: # color index 0 aeroplane:10,10,128:: # color index 1 _dummy2:2,2,2:: # filler for color index 2 _dummy3:3,3,3:: # filler for color index 3 boat:108,0,100:: # color index 4 ... _dummy198:198,198,198:: # filler for color index 198 _dummy199:199,199,199:: # filler for color index 199 ... the last label:12,28,0:: # color index 200这种约定保证了像素值 → 行号 → 标签名的映射是确定的CVAT 无需知道灰度值本身对应什么 RGB 颜色。源码级解析导入流水线与掩码转多边形选项导入实现同位于 cvat/apps/dataset_manager/formats/mask.pyimporter(nameSegmentation mask, extZIP, version1.1) def _import(src_file, temp_dir, instance_data, load_data_callbackNone, **kwargs): shutil.unpack_archive(src_file.name, temp_dir, zip) detect_dataset(temp_dir, format_namevoc, importerdm_env.importers.get(voc)) dataset Dataset.import_from(temp_dir, voc, envdm_env) dataset MaskToPolygonTransformation.convert_dataset(dataset, **kwargs) if load_data_callback is not None: load_data_callback(dataset, instance_data) import_dm_annotations(dataset, instance_data)流程与导出形成镜像解压 ZIP → 用 Datumaro 的voc导入器解析掩码目录detect_dataset先做合法性校验格式不符时提前报错→ 可选地执行掩码到多边形的转换 →import_dm_annotations将 Datumaro 数据集写回 CVAT。Convert masks to polygons 选项对应 cvat/apps/dataset_manager/formats/transformations.py 中的MaskToPolygonTransformationclass MaskToPolygonTransformation: classmethod def declare_arg_names(cls): return [conv_mask_to_poly] classmethod def convert_dataset(cls, dataset, **kwargs): if kwargs.get(conv_mask_to_poly, True): dataset.transform(masks_to_polygons) return dataset从源码结构看该开关的参数名为conv_mask_to_poly默认值为 True——即默认启用时将导入的掩码转换为 Polygon 以便在 CVAT 界面中以矢量形式编辑取消勾选后则按 Mask 形状导入。这也解释了文档中Supported annotations: Masks, Polygons (if Convert masks to polygons is enabled)的措辞。值得对比的是 cvat/apps/dataset_manager/formats/pascal_voc.py 中 PASCAL VOC 格式导入器当归档缺少labelmap.txt时它会用任务已有标签自动生成一份兜底映射。而 Segmentation Mask 导入器mask.py没有这一步——因此对非 Pascal VOC 标签的数据集labelmap.txt是硬性要求这一点与文档optional, required for non-Pascal VOC labels的说明一致。格式选型与实操要点如果你的目标是训练语义/实例分割模型且希望用最少配置得到一张图一个掩码文件的经典布局Segmentation Mask 导出是首选SegmentationClass与SegmentationObject两个目录分别对应类级与实例级需求。标签使用 Pascal VOC 标准类别名aeroplane、bicycle、bird 等时labelmap.txt可省略或保持 VOC 标准配色自定义标签则必须提供labelmap.txt且 1 通道掩码要严格遵守无间隙索引 占位补齐规则行序即索引。导出侧所有属性信息和轨迹分组都会被丢弃Tracks 拆分为独立形状若需要保留属性或时序信息应改用 CVAT for video 等其他格式。想深入了解底层的 Datumaro 集成与数据集绑定GetCVATDataExtractor、import_dm_annotations、detect_dataset等符号可继续查看 cvat/apps/dataset_manager/bindings.py格式注册机制见 cvat/apps/dataset_manager/formats/registry.py。【免费下载链接】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),仅供参考