ARTICLE DETAIL

资讯详情

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

CVAT SDK Project Recipes:用 Python 管理项目创建、标签、备份、恢复与数据集导出全生命周期

CVAT SDK Project Recipes:用 Python 管理项目创建、标签、备份、恢复与数据集导出全生命周期 CVAT SDK Project Recipes用 Python 管理项目创建、标签、备份、恢复与数据集导出全生命周期【免费下载链接】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/cvatCVATComputer Vision Annotation Tool的 Python SDK 提供了一组开箱即用的项目级 Recipe 脚本覆盖一个项目从出生到迁移的完整生命周期创建与改名、扩展标签体系、备份与恢复、按任务批量导出数据集本地 云存储。本文基于官方 SDK 示例逐一拆解 5 个脚本的参数、执行流程与底层 SDK 调用链读完你即可直接复制命令跑通「建项目 → 加标签 → 备份 → 恢复 → 导出」的完整链路并能将其中用到的Project代理方法迁移到自己的自动化脚本中。一、总览五个 Recipe 覆盖的项目生命周期文档用一句话概括了这组脚本的定位one recipe per file一个文件一个操作场景。五个脚本分别对应项目生命周期的五个阶段脚本对应阶段核心能力project_create_and_list.py创建/查询创建带标签的项目列出、按名字过滤、按 id 检索、改名、可选删除project_add_labels.py扩展为已有项目追加标签可附带可选属性selectable attributes幂等可重跑project_backup.py迁移/克隆将整个项目任务、任务段、标注、设置打包为 zip 下载project_restore.py迁移/克隆从备份 zip 恢复出一个全新项目可与备份脚本配对使用project_export_dataset.py导出将项目内每个任务逐个导出为数据集同时写本地 zip 与云存储此外若只想对项目下的任务段jobs做 CSV 概览不含标注几何可搭配 job recipes 中的job_list.py --project-id --csv。所有脚本的运行前置条件一致一个可访问的 CVAT 服务地址--host和一个 Personal Access Token--token在 CVAT UI 的 Profile → Security 中生成。更完整的认证方式token / profile / CLI 三种见 authentication.md。二、创建、列出、过滤、检索与重命名project_create_and_list.py这是最常用的 CRUD 路径创建一个带标签的项目然后演示 SDK 的查询与更新能力。参数一览Flag必填含义--host是服务器地址如https://app.cvat.ai--token是Personal Access Token--name否项目名默认Example project--labels否标签名空格分隔默认car person--cleanup否结束时删除创建的项目运行命令python project_create_and_list.py --host https://app.cvat.ai --token your token \ --name My project --labels car person脚本实现与 SDK 调用链从 project_create_and_list.py 的源码可以看到完整流程每一步都对应client.projects仓库Repo上的一个高层方法创建项目client.projects.create(models.ProjectWriteRequest(...))其中标签通过models.PatchedLabelRequest(namename)逐条构造最终提交为 JSON 写入POST /api/projects。列出全部项目client.projects.list()。脚本注释明确指出「pagination is handled by the SDK」——底层通过get_paginated_collection自动翻页聚合调用方拿到的就是一个完整列表无需自行处理分页游标。按名字子串过滤client.projects.list(filterF.name.contains(args.name))。这里的F是 SDK 的过滤 DSL见 filters.pyF.name.contains(...)会被序列化为 JSON Logic 表达式{in: [substring, {var: name}]}随查询参数发送由服务端执行过滤而不是把全部项目拉到本地再筛。按 id 检索client.projects.retrieve(project.id)随后用fetched.get_labels()读取项目标签。get_labels同样走get_paginated_collection调labels_api.list_endpoint见 projects.py。改名fetched.update(models.PatchedProjectWriteRequest(name...))一次 PATCH 完成更新。可选清理传--cleanup时调用renamed.remove()删除项目便于反复演示不留垃圾数据。过滤 DSL 的扩展用法Field除了contains还提供、!、、、、、one_of、between、is_set等运算符并支持、|、~组合成复杂条件如F.name.contains(car) F.id 100。这些条件在服务端生效是处理大项目时保持查询廉价的关键。三、为已有项目添加标签与可选属性project_add_labels.py实际标注工作流中项目建好后经常要补充标签。这个脚本演示了如何安全地扩展标签体系且标签以项目为源头项目内所有任务会自动继承变更。参数一览Flag必填含义--host是服务器地址--token是Personal Access Token--project-id是待扩展的项目 id--labels是要新增的标签名空格分隔--attr LABEL NAME VALUE [...]否为某个--labels中的标签添加一个可选属性可重复出现多次以添加多个属性运行命令# 仅加标签 python project_add_labels.py --host https://app.cvat.ai --token your token \ --project-id 7 --labels car person # 加标签的同时为 car 添加颜色可选属性red/green/blue python project_add_labels.py --host https://app.cvat.ai --token your token \ --project-id 7 --labels car --attr car color red green blue脚本实现要点从 project_add_labels.py 源码可以看到三个关键设计幂等安全脚本先用client.projects.retrieve(args.project_id)拉取项目取出已有标签名集合{label.name for label in project.get_labels()}凡是在--labels中但已存在的标签直接跳过并打印Label xx already exists, skipping因此重复运行不会产生重复标签。--attr参数校验--attr使用actionappend收集多组值每组至少需要「标签名 属性名 至少一个属性值」若引用了不在--labels中的标签会直接parser.error拒绝执行。属性模型构造每个属性被封装为models.AttributeRequest(name..., input_typemodels.InputTypeEnum(select), values[...], default_valuevalues[0], mutableTrue)——即构建一个「下拉选择型select」属性首个值作为默认值且运行中可变。随后通过一次project.update(models.PatchedProjectWriteRequest(labelsnew_labels))将新标签整体提交。底层原理佐证任务Task的标签来源于其所属项目因此修改项目标签后任务内的标注界面会自动出现新标签这正是脚本 docstring 中「Labels of the tasks inside the project come from the project itself, so they all pick up the change」的含义。若需要在项目级批量导入标注/数据集可参考第六节的Project.import_dataset。四、备份项目project_backup.py备份是把整个项目「带走」的第一步下载一个包含任务、任务段jobs、标注与设置的项目备份 zip与project_restore.py配对即可实现项目迁移或克隆。参数一览Flag必填含义--host是服务器地址--token是Personal Access Token--project-id是要备份的项目 id--output否目标文件路径默认project_id_backup.zip运行命令python project_backup.py --host https://app.cvat.ai --token your token \ --project-id 42执行后当前目录生成project_42_backup.zip。脚本实现与底层机制project_backup.py 核心只有两步client.projects.retrieve(args.project_id)获取项目对象然后project.download_backup(output)。download_backup定义于 model_proxy.py 的DownloadBackupMixin它最终调用create_backup_export_endpoint属于异步导出服务端先在后台打包创建 RQ 任务SDK 按status_check_period默认取Config.status_check_period轮询完成状态完成后把结果文件下载到本地--output。因此大项目的备份可能需要等待一段时间属正常现象。值得注意的两点原文档 Notes 部分备份 zip 捕获的是任务、任务段、用户与设置但不包含超出export_dataset范围的原始媒体——备份用于迁移结构与标注不是媒体归档方案。若只关心标注/结构、不关心媒体体积可用Project.download_backup(..., lightweightTrue)生成更小的备份包仅对以云存储为数据源的任务生效见 model_proxy.py 的参数说明。五、从备份恢复项目project_restore.py恢复是备份的逆操作把一个备份 zip 还原为一个全新项目新 id因此可安全地在同一实例上「克隆」项目或在不同实例间「迁移」项目。参数一览Flag必填含义--host是服务器地址--token是Personal Access Token--backup是项目备份 zip 的路径--cleanup否恢复完成后删除恢复出的副本绝不触碰源备份文件运行命令python project_restore.py --host https://app.cvat.ai --token your token \ --backup ./project_42_backup.zip脚本实现与底层机制project_restore.py 在调用前会先检查args.backup.is_file()文件不存在则直接sys.exit报错随后核心一步是client.projects.create_from_backup(args.backup)。create_from_backup定义在 projects.py其实现揭示了恢复的内部流程通过Uploader以 multipart 方式上传备份 zip 到create_backup_endpoint从服务端响应 JSON 中取出rq_id一个后台任务标识脚本断言其必存在调用client.wait_for_completion(rq_id, status_check_period...)轮询等待服务端完成导入完成后从任务结果的result_id拿到新项目 id最后retrieve(project_id)返回新项目对象。推荐用法用--cleanup验证备份文件的有效性——恢复出一个副本、确认其内容无误后立即删除副本源备份文件始终不受影响非常适合作为备份完整性检查的例行步骤。六、按任务逐个导出数据集本地 云存储project_export_dataset.py这是功能最丰富的脚本把项目内的每个任务分别导出为独立数据集同时写入本地 zip 与已注册的云存储且默认不含图片include_imagesFalse体积更小。脚本 docstring 还说明这是当前 SDK 层面实现的「批量按任务导出」替代方案。参数一览Flag必填含义--host是服务器地址--token是Personal Access Token--project-id是要导出的项目 id--cloud-storage-id是已注册的云存储 id云存储注册见 cloud_storage_register.py--export-format否导出格式名默认COCO 1.0--task-id否只导出的任务 id空格分隔默认项目内所有任务运行命令# 导出项目内所有任务 python project_export_dataset.py --host https://app.cvat.ai --token your token \ --project-id 42 --cloud-storage-id 7 --export-format COCO 1.0 # 只导出任务 10 和 11 python project_export_dataset.py --host https://app.cvat.ai --token your token \ --project-id 42 --cloud-storage-id 7 --task-id 10 11脚本实现三步走project_export_dataset.py 的main()严格按三步执行校验格式名由于格式列表尚无高层代理脚本直接使用底层 APIclient.api_client.server_api.retrieve_annotation_formats()从返回的formats.exporters中提取合法格式名列表若--export-format不在其中立即sys.exit并打印可选格式避免无效请求。解析目标任务集合project.get_tasks()返回项目内全部任务同样自动分页构建{task.id: task}映射若传了--task-id会先校验每个 id 都属于该项目缺失则报错退出未传则默认导出全部任务项目无任务时也会提前退出。逐个导出双目的地对每个任务执行两次task.export_dataset(...)本地task.export_dataset(format, local_path, include_imagesFalse, locationLocation.LOCAL)生成task_id_dataset.zip云端同样参数但locationLocation.CLOUD_STORAGE, cloud_storage_idargs.cloud_storage_idSDK 直接把导出结果上传到指定云存储无需本地中转下载。Location枚举定义于 types.pyLOCAL local、CLOUD_STORAGE cloud_storage且脚本内有一条断言保证该枚举与 OpenAPI 生成的LocationEnum保持一致。导出混入的实现task.export_dataset来自 model_proxy.py 的ExportDatasetMixin其签名支持include_images默认True传False表示仅标注数据体积小得多、location、cloud_storage_id与status_check_period。源码注释明确了边界条件locationLocation.CLOUD_STORAGE但未传cloud_storage_id会抛出ValueError导出仍是异步任务 轮询完成 按位置落盘/上传的同一套机制。七、配套技巧用 job_list.py 输出项目任务段 CSV 概览如果不需要导出数据集只想快速掌握项目的工作分配情况比如用于排期或审计原文档推荐使用 job recipes 中的job_list.pypython job_list.py --host https://app.cvat.ai --token your token \ --project-id 7 --csv从 job_list.py 源码看它有几个值得注意的设计服务端过滤--task-id与--project-id互斥二选一add_mutually_exclusive_group(requiredTrue)--stage如annotation与--state如new会追加为过滤条件最终通过all_(*conditions)组合按sort-updated_date最近更新优先在服务端完成查询大项目也不会把全量任务段拉到本地。CSV 列结构--csv会在当前目录写出report.csv包含project_id, project_name, task_id, task_name, job_id, stage, state, assignee, frames共 9 列其中assignee为空时写空字符串frames取自job.frame_count。与导出的分工CSV 概览不含标注几何真正的数据集导出请使用project_export_dataset.py。八、更多 SDK 能力与注意事项原文档最后给出了一张「其他 SDK 选项」速查表这些方法都定义在 projects.py 的Project/ProjectsRepo类中可直接在自己的脚本里组合使用SDK 方法 / 参数补充能力Project.download_backup(..., lightweightTrue)生成更小的备份包省略媒体仅影响以云存储为数据源的任务client.projects.create_from_dataset(...)直接从数据集归档创建项目底层是先create再import_dataset默认格式CVAT XML 1.1可传dataset_format指定Project.import_dataset(format_name, path)向已有项目导入标注/数据是export_dataset的导入对应物内部经DatasetUploader上传并等待完成Project.get_annotations()获取项目的标注数据返回models.ILabeledData使用时的四条注意事项原文档 Notes 原文要点list()返回完整集合分页由 SDK 自动处理无需手动翻页项目备份 zip 包含任务、任务段、用户与设置但不含超出export_dataset范围的原始媒体项目任务段的 CSV 概览无标注几何用job_list.py --project-id id --csv真正的数据集导出用project_export_dataset.pyinclude_imagesFalse时仅导出标注数据产物显著更小适合纯标注交换场景。九、完整 Recipe 索引所有脚本均位于仓库 cvat-sdk/examples 目录可直接运行python script.py --help查看实时参数说明project_create_and_list.py创建 → 列出 → 过滤 → 检索 → 改名project_add_labels.py给已有项目追加标签与可选属性project_backup.py下载项目备份 zipproject_restore.py从备份恢复为全新项目project_export_dataset.py按任务逐个导出数据集本地 云存储对应的上层代理实现位于 projects.pyProject与ProjectsRepo导出/备份等通用能力位于 model_proxy.pyExportDatasetMixin、DownloadBackupMixin过滤 DSL 位于 filters.py。将这 5 个脚本串起来即可用纯 Python 完成 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),仅供参考
返回列表