CVAT 中的 KITTI 格式:面向自动驾驶场景的标注导出与导入完整指南

发布时间:2026/9/14 19:27:34
CVAT 中的 KITTI 格式:面向自动驾驶场景的标注导出与导入完整指南 CVAT 中的 KITTI 格式面向自动驾驶场景的标注导出与导入完整指南【免费下载链接】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/cvatKITTI 格式是自动驾驶领域计算机视觉任务3D 目标检测、多目标跟踪、场景流估计等的通用数据交换格式。本文以 CVAT 仓库中 KITTI 格式文档site/content/en/docs/dataset_management/formats/format-kitti.md为主体结合后端数据集管理模块的真实实现讲解 KITTI 数据在 CVAT 中的导出与导入规则哪些标注类型和属性受支持、导出的 ZIP 包内部结构是什么、导入时需要准备怎样的压缩包以及底层转换管线旋转框转多边形、椭圆转掩码、掩码与多边形互转是如何工作的。读完后你可以直接按本文的目录结构准备检测/分割数据集并理解 CVAT 在实际导入导出时执行了哪些格式适配。一、KITTI 格式在 CVAT 中的定位KITTI 格式针对汽车场景设计通常与为 3D 目标检测、多目标跟踪、场景流估计等自动驾驶任务设计或改造的模型配套使用。CVAT 通过 cvat/apps/dataset_manager/formats/registry.py 中的import cvat.apps.dataset_manager.formats.kitti注册该格式实际导入/导出逻辑全部位于 cvat/apps/dataset_manager/formats/kitti.py并复用 Datumaro 的kitti格式插件datumaro.plugins.data_formats.kitti.format中的KittiPath、write_label_map等。注册声明如下说明 CVAT 侧的格式名称为KITTI、文件扩展名为ZIP、版本为1.0exporter(nameKITTI, extZIP, version1.0) def _export(dst_file, temp_dir, instance_data, save_imagesFalse): ... importer(nameKITTI, extZIP, version1.0) def _import(src_file, temp_dir, instance_data, load_data_callbackNone, **kwargs): ...二、KITTI 导出2.1 支持的标注类型与属性按照官方文档说明图像导出的支持范围是支持的标注Bounding Boxesdetection矩形框检测、Polygonssegmentation多边形分割、Maskssegmentation掩码分割、Ellipsessegmentation椭圆按掩码处理。支持的属性occluded同时作为 UI 选项和独立属性提供。表示边界框内的物体大部分被另一物体遮挡。truncated仅适用于边界框。要求标签上配置为checkboxes复选框类型的属性。表示边界框没有包含完整物体部分被裁切。is_crowd仅对多边形有效。同样应以标签checkboxes属性表示。表示该标注聚合同一类对象的多个实例人群/密集场景。Tracks不支持。跟踪数据在导出时会被拆分为逐帧的独立形状exported as separate shapes。2.2 导出 ZIP 包结构下载得到的文件是一个.zip归档内部结构为└─ annotations.zip/ ├── label_colors.txt # list of pairs r g b label_name ├── labels.txt # list of labels └── default/ ├── label_2/ # left color camera label files │ ├── image_name_1.txt │ ├── image_name_2.txt │ └── ... ├── instance/ # instance segmentation masks │ ├── image_name_1.png │ ├── image_name_2.png │ └── ... ├── semantic/ # semantic segmentation masks (labels are encoded by its id) │ ├── image_name_1.png │ ├── image_name_2.png │ └── ... └── semantic_rgb/ # semantic segmentation masks (labels are encoded by its color) ├── image_name_1.png ├── image_name_2.png └── ...各组成部分含义labels.txt标签列表label_colors.txt每行一组r g b label_name的颜色映射用于分割掩码的着色semantic_rgb/目录即按此颜色编码。label_2/KITTI 约定中“左侧彩色相机”的检测标签文件每张图一个image_name.txt。instance/实例分割掩码每实例一个颜色semantic/语义分割掩码像素值直接编码标签 idsemantic_rgb/语义分割掩码像素值按颜色编码。2.3 源码视角导出管线做了哪些转换从源码看_export 并不是把 CVAT 标注直接丢给 Datumaro而是先对数据集依次执行了四步归一化转换dataset Dataset.from_extractors(extractor, envdm_env) dataset.transform(RotatedBoxesToPolygons) # 带旋转角的边界框 - 多边形 dataset.transform(polygons_to_masks) # 多边形 - 掩码 dataset.transform(EllipsesToMasks) # 椭圆 - 掩码 dataset.transform(merge_instance_segments) # 合并同一实例的多个分割段 dataset.export( temp_dir, formatkitti, label_map{k: v[0] for k, v in make_colormap(instance_data).items()}, apply_colormapTrue, save_mediasave_images, )对应地旋转框转多边形cvat/apps/dataset_manager/formats/transformations.py 中的RotatedBoxesToPolygons只处理attributes[rotation]非空的 bbox以框中心为旋转中心对四个角点逐一做旋转变换后生成dm.Polygon保留原 label、attributes、group、z_order。这解释了为什么带旋转信息的框导出后表现为多边形轮廓。椭圆转掩码同文件中的 EllipsesToMasks 用cv2.ellipse在整幅图尺寸的二值矩阵上绘制椭圆thickness-1实心填充再经mask_utils.encode编码为 RLE最终以懒求值lazy方式挂在标注上转换要求 item 必须携带图像尺寸dm.Image否则抛异常。颜色映射label_map来自 cvat/apps/dataset_manager/formats/utils.py 中的make_colormap(instance_data)即按 CVAT 任务中配置的标签顺序建立“标签名 → 分割 id”的映射apply_colormapTrue使分割掩码写入label_colors.txt对应的颜色。打包make_zip_archive(temp_dir, dst_file)把临时目录压成最终 ZIPsave_images参数控制是否随标注一起保存原始图像include_imagessave_images。空标注限制格式测试 cvat/apps/dataset_manager/tests/test_formats.py 中“空图像导出”用例明确注释了(KITTI 1.0, kitti) format does not support empty annotations——即 KITTI 格式不支持导出没有任何标注的图像集合使用空数据集时需留意这一限制。三、KITTI 导入CVAT 支持两种方式上传 KITTI 标注检测任务上传矩形框分割任务上传掩码。所有标注文件和掩码本身必须遵循 KITTI 官方格式规范检测标签 txt 的分字段格式、分割掩码 PNG 的编码方式等。3.1 检测任务导入包结构└─ annotations.zip/ ├── labels.txt # optional, labels list for non-original detection labels └── subset_name/ ├── label_2/ # left color camera label files │ ├── image_name_1.txt │ ├── image_name_2.txt │ └── ...注意两点labels.txt是可选的仅在标签不是 KITTI 原始检测标签时需要提供subset_name可以是任意子集目录名导出数据时固定为default导入时不限定。3.2 分割任务导入包结构└─ annotations.zip/ ├── label_colors.txt # optional, color map for non-original segmentation labels └── subset_name/ ├── instance/ # instance segmentation masks │ ├── image_name_1.png │ ├── image_name_2.png │ └── ... ├── semantic/ # optional, semantic segmentation masks (labels are encoded by its id) │ ├── image_name_1.png │ ├── image_name_2.png │ └── ... └── semantic_rgb/ # optional, semantic segmentation masks (labels are encoded by its color) ├── image_name_1.png ├── image_name_2.png └── ...instance/为必需目录掩码按实例颜色编码semantic/与semantic_rgb/均为可选分别对应“像素值 标签 id”和“像素值 标签颜色”两种编码。label_colors.txt仅在标签不是 KITTI 原始分割标签时需要提供用于还原颜色到标签的映射。3.3 源码视角导入管线如何解析与还原_import 的完整流程与上述结构一一对应shutil.unpack_archive(src_file.name, temp_dir, zip) # 1. 解压 ZIP color_map {k: v[0] for k, v in make_colormap(instance_data).items()} color_map_path osp.join(temp_dir, KittiPath.LABELMAP_FILE) if not osp.isfile(color_map_path): write_label_map(color_map_path, color_map) # 2. 无 label_colors.txt 时按 CVAT 标签生成默认色表 detect_dataset(temp_dir, format_namekitti, ...) # 3. 探测数据子集 dataset Dataset.import_from(temp_dir, formatkitti, envdm_env) # 4. 交由 Datumaro KITTI importer 解析 labels_meta instance_data.meta[instance_data.META_FIELD][labels] if background not in [label[name] for _, label in labels_meta]: dataset.filter(/item/annotation[label ! background], filter_annotationsTrue) # 5. 任务无 background 标签时剔除背景标注 dataset MaskToPolygonTransformation.convert_dataset(dataset, **kwargs) # 6. 掩码转多边形默认开启逐点解读默认色表兜底当上传包中没有label_colors.txt时CVAT 用任务当前标签make_colormap现场生成一份写入临时目录再走 Datumaro 的 kitti importer——这就是“label_colors.txtoptional”在实现层的含义。background 过滤KITTI 分割天然带背景像素若 CVAT 任务标签中不含background导入时会用 XPath 过滤条件/item/annotation[label ! background]剔除这些标注避免引入任务里不存在的标签。掩码转多边形MaskToPolygonTransformation 受导入参数conv_mask_to_poly控制默认True调用 Datumaro 的masks_to_polygons变换使导入的分割掩码在 CVAT 中以多边形形式呈现便于人工编辑其类注释说明这是过渡期兼容行为。3.4 属性导入的约定与导出侧一致truncated必须配置为标签的复选框属性才能随 bbox 还原occluded可来自 UI 选项或独立属性is_crowd仅对多边形生效。这些约束在格式文档中定义由 Datumaro 的 kitti 解析器在字段层面落实。四、导出/导入速查表项目检测bounding box分割masks / polygons导出必含文件labels.txt、label_2/*.txtlabel_colors.txt、instance/*.png、semantic/*.png、semantic_rgb/*.png导入必需目录subset_name/label_2/subset_name/instance/导入可选文件labels.txtlabel_colors.txt、semantic/、semantic_rgb/关键属性occluded、truncated复选框occluded、is_crowd复选框仅多边形Tracks不支持按逐帧形状导出不支持按逐帧掩码导出空标注格式测试明确不支持空标注导出同左五、使用建议与限制小结准备检测数据集按subset_name/label_2/*.txt组织文件若类别不是 KITTI 原始类别额外提供labels.txt。准备分割数据集instance/必须齐全如标签颜色与任务标签不一致提供label_colors.txtCVAT 会在缺失时按当前任务标签自动生成默认色表。预期转换行为旋转框会变为多边形、椭圆会以掩码方式参与分割导出导入的掩码默认会被转回多边形以便编辑。不适用场景KITTI 格式不支持 Tracks 的直接导出会退化为逐帧独立形状空标注数据集无法走该格式导出源码测试用例中有明确注释佐证。各字段的具体取值范围与 txt 分列格式应以 KITTI 官方 devkit 规范为准CVAT 侧的实现cvat/apps/dataset_manager/formats/kitti.py只负责与 CVAT 内部标注模型的桥接。【免费下载链接】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),仅供参考