ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CVAT 中的 YOLO 格式:数据集导出、导入与 YOLO 风格任务创建的完整指南

CVAT 中的 YOLO 格式:数据集导出、导入与 YOLO 风格任务创建的完整指南 CVAT 中的 YOLO 格式数据集导出、导入与 YOLO 风格任务创建的完整指南【免费下载链接】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 将 YOLOYou Only Look Once作为官方支持的数据集交换格式之一用于在标注平台与实时目标检测模型之间流转边界框Bounding Box标注。本文基于 CVAT 仓库的官方文档与 formats/yolo.py 的源码实现系统讲解 YOLO 格式的目录结构、obj.data/obj.names/标注文本文件的内容规范、导入时的帧匹配机制以及如何从一个 YOLO 风格数据集例如由 VOC 转换而来批量创建 CVAT 标注任务读完即可独立完成“YOLO 数据集 ↔ CVAT”的双向流转。YOLO 格式概述YOLO 是实时目标检测领域的代表性框架其数据格式因结构简单、解析成本低也被许多其他目标检测模型采用。CVAT 对该格式的支持要点如下与官方文档 format-yolo.md 一致支持的标注类型仅 Bounding Boxes矩形边界框属性Attributes不支持Tracks跨帧跟踪不支持。在 CVAT 中该格式以显示名YOLO 1.1注册扩展名为ZIP。这一点可以从格式注册源码确认# cvat/apps/dataset_manager/formats/yolo.py exporter(nameYOLO, extZIP, version1.1) def _export_yolo(*args, **kwargs): _export_common(*args, format_nameyolo, **kwargs) importer(nameYOLO, extZIP, version1.1) def _import_yolo(*args, **kwargs): _import_common(*args, format_nameyolo, **kwargs)注册器 formats/registry.py 中的exporter/importer装饰器以NAME VERSION即YOLO 1.1作为键写入全局EXPORT_FORMATS/IMPORT_FORMATS字典前端界面和 REST API 中可选的“YOLO 1.1”即来自这张注册表。YOLO 导出zip 包结构与文件规范导出结果为.zip压缩包其目录结构必须与下方约定一致archive.zip/ ├── obj.data ├── obj.names ├── obj_subset_data │ ├── image1.txt │ └── image2.txt └── train.txt # list of subset image paths # the only valid subsets are: train, valid # train.txt and valid.txt: obj_subset_data/image1.jpg obj_subset_data/image2.jpg # obj.data: classes 3 # optional names obj.names train train.txt valid valid.txt # optional backup backup/ # optional # obj.names: cat dog airplane # image_name.txt: # label_id - id from obj.names # cx, cy - relative coordinates of the bbox center # rw, rh - relative size of the bbox # label_id cx cy rw rh 1 0.3 0.8 0.1 0.3 2 0.7 0.2 0.3 0.1各文件的语义与取值规范如下文件作用关键规范obj.names标签名称的有序列表每行一个类名行号从 0 起即类 id如cat是 0、dog是 1、airplane是 2obj.data数据集入口配置names obj.names指向名称文件train train.txt必选valid、backup、classes可选train.txt/valid.txt子集图片清单每行一个相对路径例如obj_train_data/image1.jpg合法的子集只有train与valid两种image_name.txt单张图片的标注与图片同名同目录例如frame_000001.txt对应frame_000001.jpg标注文本文件image_name.txt中每一行描述一个标签加一个边界框格式为label_id cx cy w hlabel_id该框的类别编号取值对应obj.names中的行序cx, cy边界框中心的归一化坐标相对图片宽高的比例0~1w, h边界框宽高占图片宽高的归一化比例0~1。“标注文件与图片文件同名仅扩展名不同”这一约定是 YOLO 格式的核心索引机制也是后续 CVAT 导入时进行帧匹配的基础。导出流程的源码实现从 formats/yolo.py 的_export_common可以看到完整的导出调用链通过GetCVATDataExtractor(instance_data, include_imagessave_images)构造从 CVAT 数据库/任务抽取标注可选抽取图片的 datumaro 抽取器用StreamDataset.from_extractors(...)把标注加载为流式数据集再调用 datumaro 的dataset.export(temp_dir, yolo, save_media..., **kwargs)按 YOLO 规范写出上述目录结构最后make_zip_archive(temp_dir, dst_file)把临时目录打包为下载的.zip文件。也就是说CVAT 本身不逐字段手写 YOLO 文本而是复用 datumaro 框架内建的yolo导出器CVAT 侧负责数据抽取、打包与错误包装_wrap_format会把AnnotationExportError转译为 CVAT 异常。仓库测试 tests/test_formats.py 中的test_empty_images_are_exported明确将(YOLO 1.1, yolo)纳入导出回归用例校验导出 zip 能被 datumaro 的yolo导入器重新读回且条目数与任务帧数一致。YOLO 导入帧匹配机制导入时上传的文件同样是上述结构的.zip压缩包。CVAT 必须能把包中的每个标注文件对应到任务中的一帧官方文档给出两种匹配方式按完整文件名匹配图片名与标注*.txt文件名完全一致适用于由图片或图片压缩包创建的任务按帧号匹配当 CVAT 无法按名称匹配时文件名需为number.jpg形式适用于由视频创建的任务CVAT 会把视频帧编号为0.jpg、1.jpg…。这两个规则在源码中的落点是 bindings.py 的match_dm_item函数其匹配顺序为# cvat/apps/dataset_manager/bindings.py def match_dm_item(item, instance_data, root_hintNone): frame_number None # 1) 名称扩展名 全匹配 if frame_number is None and isinstance(item.media, dm.Image): frame_number instance_data.match_frame(item.id item.media.ext, root_hint) # 2) 去掉扩展名再匹配对应 *.txt 与图片名一致的常见情况 if frame_number is None: frame_number instance_data.match_frame(item.id, root_hint, path_has_extFalse) # 3) 标注自带的 frame 属性 if frame_number is None: frame_number datumaro.util.cast(item.attributes.get(frame, item.id), int) # 4) 视频任务的 frame_N 前缀兜底 if frame_number is None and is_video: frame_number datumaro.util.cast(osp.basename(item.id)[len(frame_):], int) ...即 CVAT 依次尝试“全名匹配 → 去扩展名匹配 → 数值化匹配 → 视频帧前缀匹配”。导入流程_import_common会先解压 zip调用detect_dataset校验包结构确实符合yolo格式然后递归glob找出所有*.txt标注文件、用find_dataset_root推断数据集根前缀以便剥离多余目录层级最后经StreamDataset.import_from载入并应用SetKeyframeForEveryTrackShape转换由import_dm_annotations把 datumaro 标注写回 CVATbbox 映射为ShapeType.RECTANGLE。若某个标注文件匹配不到任何帧match_dm_item会抛出CvatImportError提示无法匹配的文件 id便于定位命名问题。从 YOLO 数据集如 VOC 转换而来创建 CVAT 任务官方文档给出了一个从零开始导入 YOLO 风格数据集的完整实操流程以 YOLO 官方指南从 VOC 准备的数据为例步骤完整保留如下第 1 步准备 YOLO 格式标注文件。参照 YOLO 官方指南中“Training YOLO on VOC”一节准备出 YOLO 格式的标注文件。第 2 步压缩 train 图片。zip images.zip -j - train.txt第 3 步创建 CVAT 任务标签设置为VOC 20 类与obj.names行序一一对应aeroplane bicycle bird boat bottle bus car cat chair cow diningtable dog horse motorbike person pottedplant sheep sofa train tvmonitor数据源选择images.zip。由于该压缩包通常超过 500MB官方建议借助 CVAT 的文件 share 功能挂载大文件详见文档 tasks-page 中创建标注任务的章节。第 4 步创建obj.names内容与任务标签顺序严格一致aeroplane bicycle bird boat bottle bus car cat chair cow diningtable dog horse motorbike person pottedplant sheep sofa train tvmonitor注意obj.names中的行序就是导入后的类 id务必与 CVAT 任务中 label 的创建顺序保持完全一致否则类别会张冠李戴。第 5 步把所有 train 子集对应的标注文件打包。cat train.txt | while read p; do echo ${p%/*/*}/labels/${${p##*/}%%.*}.txt; done | zip labels.zip -j - obj.names该 shell 管道的含义从train.txt逐行读取图片相对路径把路径中图片所在目录替换为labels/目录、扩展名替换为.txt列出全部标注文件路径-j丢弃目录层级-从标准输入读取文件列表最后把obj.names一并压入labels.zip。第 6 步在 CVAT 中点击Upload annotation格式选择YOLO 1.1上传上一步生成的标注 zip。CVAT 将按“名称匹配优先、帧号匹配兜底”的策略把每帧标注写入任务。源码级补充YOLO 家族与边界情况从 formats/yolo.py 的注册清单还可以看到CVAT 在同一模块中维护了一整套 YOLO 家族格式均注册为 ZIP、版本 1.0Ultralytics YOLO Detection 1.0/Ultralytics YOLO Detection Track 1.0后者通过write_track_idTrue额外写出跟踪 id是唯一支持 Tracks 变体Ultralytics YOLO Oriented Bounding Boxes 1.0带角度的边界框Ultralytics YOLO Segmentation 1.0分割多边形导出前会先用EllipsesToMasks与masks_to_polygons转换Ultralytics YOLO Pose 1.0关键点导入时从 CVAT 元数据读取骨架子标签作为skeleton_sub_labels;Ultralytics YOLO Classification 1.0图像分类。这些变体与经典YOLO 1.1共用_export_common/_import_common基础设施差别仅在于 datumaro 侧的format_name与少量转换参数。若你的数据包含 Tracks、多边形或关键点应优先考虑对应的 Ultralytics 变体而不是经典 YOLO 1.1后者仅边界框、无属性、无 Tracks。此外有两点边界情况值得注意空标注帧同样会被导出测试test_empty_images_are_exported保证无标注帧也会生成空.txt从而保持图片与标注文件的一一对应这是 YOLO 目录约定的要求导入失败的可诊断性匹配不到帧时抛出的是带文件 id 的CvatImportError结合 bindings.py 中match_dm_item的四级匹配顺序通常可以快速判断是命名不一致缺少扩展名匹配还是视频帧号问题应使用number.jpg形式。小结CVAT 对 YOLO 格式的支持覆盖了“导出即训练集、导入即预标注”两个方向导出按obj.dataobj.names 子集清单 同名.txt的标准目录组织label_id cx cy w h全部为归一化值导入依赖图片名/帧号与标注文件名的两级匹配源码中match_dm_item进一步提供去扩展名与数值化兜底。配合上文 VOC 示例的六步操作压缩图片、按序建标签、构造obj.names、管道命令打包标注、Upload annotation选择YOLO 1.1即可把既有 YOLO 数据集平滑接入 CVAT 工作流。相关实现与回归测试可分别参考 formats/yolo.py、formats/registry.py、bindings.py 与 tests/test_formats.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),仅供参考
返回列表