docs: 核实 CVAT SOP 与代码差异,修正百科中关于标注平台的错误描述
核实发现:代码中CVAT 零实现,SOP 四阶段中三阶段不可执行。已全面修正。 核实结论(依据 deepdata-20260928 @ ff22ed3) - 全库 2752 个跟踪文件 git grep -i cvat → 0 命中;变体与中文关键词同样0 命中 - Label Studio 硬编码三处:client/ 下只有 labelstudio/(无平台抽象层)、 interface/project.py:728-731 直接实例化、data-annotation-init.sql:69 字段注释写死且 labeling_project_id 为 VARCHAR(8)(装不下 CVAT 的 UUID task ID) - 前端创建弹窗无平台下拉,真实表单仅 4 字段 - SOP 11 条技术性错误,已逐条列出并标注证据行号 - 自动标注 Tab 已被整段注释屏蔽(CreateAnnotationTaskDialog.tsx:333-380, 542-638) - 即便未来接 CVAT,tags 字段填充方式也需重新设计(CVAT 是 task→job→frame 三层,无 predictions 概念,无 frame_id↔file_id 直接映射) 百科修改 - 使用说明:第六章重写为「标注作业 SOP(Label Studio 对接)」 6.1 平台硬编码实况 / 6.2 四阶段可执行性 / 6.3 可执行流程(LS) 6.4 数据落库机制与冲突消解细节 / 6.5 接入 CVAT 的 7 项开发清单 6.6 原始 SOP 逐字照抄(保留设计意图,附原文与实况对照表) - 修正 5.1 创建任务:删除不存在的"平台选择",改为实际4 字段 - 修正 5.2:标注自动标注 Tab 已屏蔽 - 修正产品功能、需求与定位、Home 中关于 CVAT 的全部描述 新增来源目录 /Users/figmarlite/deepdata-sources/ - 01-feishu-sop/:飞书 SOP 逐字照抄 + 来源信息 + 抓取过程记录 - 02-fetch-evidence/:SSR Slate JSON 提取落盘证据 - 03-code-verification/:SOP vs 代码逐条核实报告(含行号) 作者: 沃巴蒂 <figmar@ccoop.cc>
+2
-3
@@ -23,7 +23,7 @@ DeepData 把「原始数据」变成「可训练、可检索的语料」——
|
||||
| 算子市场 | 算子注册、打包、上传、复用 | `/data/operator-market` |
|
||||
| 数据清洗 | 可视化编排清洗流水线 | `/data/cleansing` |
|
||||
| 数据合成 | 指令数据合成、配比任务 | `/data/synthesis/task`、`/data/synthesis/ratio-task` |
|
||||
| 数据标注 | 标注项目、自动标注、对接 Label Studio/CVAT | `/data/annotation` |
|
||||
| 数据标注 | 标注项目、自动标注、对接 Label Studio | `/data/annotation` |
|
||||
| 数据评估 | 质量与效果评估 | `/data/evaluation` |
|
||||
| 知识生成 | RAG 知识库构建、索引 | `/data/knowledge-base` |
|
||||
|
||||
@@ -73,7 +73,6 @@ DeepData 把「原始数据」变成「可训练、可检索的语料」——
|
||||
| 算子 Operator | 单一处理能力的最小单元 | 有 metadata.yml 描述,支持打包上传 |
|
||||
| 算子实例 Operator Instance | 算子在具体任务中的一次配置 | 存于 `t_operator_instance` |
|
||||
| 任务 Task | 一次数据处理执行 | 清洗/标注/合成/评估各自有任务表 |
|
||||
| Job | CVAT 侧的标注工作切片 | 大任务必须切分才能并行 |
|
||||
| 血缘 Lineage | 数据加工的上下游关系 | `t_lineage_node` + `t_lineage_edge` |
|
||||
|
||||
---
|
||||
@@ -87,7 +86,7 @@ DeepData 把「原始数据」变成「可训练、可检索的语料」——
|
||||
| [技术架构](技术架构) | 技术栈、服务拆分、算子执行引擎、数据模型 |
|
||||
| [部署指南](部署指南) | Docker Compose 与 Helm K8s 两种形态 |
|
||||
| [运维手册](运维手册) | 日志、健康检查、备份、排障、已知坑 |
|
||||
| [使用说明](使用说明) | 界面操作指南、CVAT 标注 SOP |
|
||||
| [使用说明](使用说明) | 界面操作指南、标注作业 SOP(Label Studio 对接 + 原始参考材料) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
+8
-6
@@ -149,21 +149,23 @@
|
||||
|
||||
### 支持的标注平台
|
||||
|
||||
| 平台 | 对接方式 | 特点 |
|
||||
| 平台 | 对接状态 | 说明 |
|
||||
|---|---|---|
|
||||
| **Label Studio** | 内置双向同步服务 | 原生集成,支持自动标注、标签双向合并 |
|
||||
| **CVAT** | 任务创建时指定平台 | 适合大批量图像标注,支持 Job 切分分工 |
|
||||
| **Label Studio** | ✅ **已集成(唯一)** | 内置双向同步服务;硬编码三处,见 [使用说明 6.1](使用说明#61-代码实况平台硬编码为-label-studio) |
|
||||
| **CVAT** | ❌ **未实现** | 全库搜索 `cvat` 零命中。既无平台抽象层也无配置开关,接入需从零开发 |
|
||||
|
||||
### 核心表
|
||||
`t_dm_annotation_templates`(标注模板)、`t_dm_labeling_projects`(标注项目)、`t_dm_auto_annotation_tasks`(自动标注任务)
|
||||
|
||||
### 标注结果同步
|
||||
Label Studio 侧通过 `ls_annotation_sync.py` / `sync.py` 双向同步,写入 `t_dm_dataset_files.tags`,用 `tags_updated_at` 做冲突消解。
|
||||
Label Studio 侧通过 `ls_annotation_sync.py` / `sync.py` 双向同步,写入 `t_dm_dataset_files.tags`,用 `tags_updated_at` 做冲突消解(纯时间戳比较,无字段级合并)。
|
||||
|
||||
CVAT 侧由用户在界面上点击"同步到数据库"触发拉取,详见 [CVAT 标注 SOP](使用说明#六deepdatacvat-标注作业流程sop)。
|
||||
用户在界面上点击"同步到数据库"触发拉取,详见 [标注作业 SOP](使用说明#六标注作业-soplabel-studio-对接)。
|
||||
|
||||
### 自动标注
|
||||
`AUTO_ANNOTATION_ENABLED` 开关 + `ANNOTATION_MODEL_ENDPOINT` 配置模型端点,可先用模型跑一遍生成预标注(Pre-annotations),人工只需修正 —— **提效显著**(见 SOP 避坑建议)。
|
||||
`AUTO_ANNOTATION_ENABLED` 开关 + `ANNOTATION_MODEL_ENDPOINT` 配置模型端点,可先用模型跑一遍生成预标注(Pre-annotations),人工只需修正。
|
||||
|
||||
> ⚠️ 当前创建标注任务弹窗的「自动标注」Tab **已被整段注释屏蔽**(`CreateAnnotationTaskDialog.tsx:333-380, 542-638`),此路径暂时不可用。
|
||||
|
||||
---
|
||||
|
||||
|
||||
+204
-51
@@ -88,12 +88,15 @@ settings:
|
||||
|
||||
`数据标注` → 创建标注任务:
|
||||
|
||||
1. 选择数据集
|
||||
2. **平台选择**:Label Studio 或 CVAT
|
||||
3. 选择标注模板(如目标检测)
|
||||
4. 确定
|
||||
1. 填写**任务名称**(必填,≥3 字符 —— 此限制来自 Label Studio)
|
||||
2. **选择标注模板**(必填,如目标检测)
|
||||
3. 通过数据集文件组件**逐个勾选文件**
|
||||
4. 描述(选填)
|
||||
5. 确定
|
||||
|
||||
创建后在任务列表可见,Label Studio 侧显示"前往 CVAT/LS",且外部平台后台已生成对应任务。
|
||||
> ⚠️ **没有"平台选择"** —— 标注平台在代码中硬编码为 Label Studio,创建弹窗无平台下拉。详见 [6.1](#61-代码实况平台硬编码为-label-studio)。
|
||||
|
||||
创建后在任务列表可见,操作菜单含"标注"、"同步到数据库"、"导出标注结果"。
|
||||
|
||||
### 5.2 Label Studio 同步特点
|
||||
|
||||
@@ -103,93 +106,236 @@ Label Studio 走**内置双向同步服务**:
|
||||
- `interface/task.py` 支持部分标签合并(只改提交的标签,其余保持)
|
||||
|
||||
自动标注:开启 `AUTO_ANNOTATION_ENABLED` + 配置 `ANNOTATION_MODEL_ENDPOINT` 后,可先由模型生成预标注。
|
||||
> ⚠️ 注意:创建标注任务弹窗中的「自动标注」Tab 当前**已被整段注释屏蔽**(`CreateAnnotationTaskDialog.tsx:333-380, 542-638`),该路径暂时不可用。
|
||||
|
||||
### 5.3 CVAT 作业流程
|
||||
### 5.3 完整标注作业流程
|
||||
|
||||
见[下一节](#六deepdatacvat-标注作业流程sop)。
|
||||
见[下一节](#六标注作业-soplabel-studio-对接)。
|
||||
## 六、标注作业 SOP(Label Studio 对接)
|
||||
|
||||
> ⚠️ **重要更正**:本章原标题为「DeepData/CVAT 标注作业流程SOP」,源自飞书文档。**经代码核实,当前 DeepData 并未集成 CVAT**,唯一支持的标注平台是 **Label Studio**。
|
||||
>
|
||||
> - 原始参考材料(逐字照抄)见 [`/Users/figmarlite/deepdata-sources/01-feishu-sop/`](https://gitea.apescale.com/figmar/deepdata/wiki)
|
||||
> - 逐条核实结论见 `03-code-verification/sop-vs-code-核实报告.md`
|
||||
>
|
||||
> 本章先给出**代码实况**(可执行),再附**原始 SOP 原文**(设计意图,含未实现部分)。
|
||||
|
||||
### 6.1 代码实况:平台硬编码为 Label Studio
|
||||
|
||||
全库 2752 个跟踪文件搜索 `cvat`(含变体 `cvat2d`/`cvat.org`/`tagging.cvat`/`opentarget`)**零命中**。硬编码三处:
|
||||
|
||||
| # | 位置 | 证据 |
|
||||
|---|---|---|
|
||||
| 1 | 客户端目录只有 `client/labelstudio/` | 无平台抽象层/工厂类 |
|
||||
| 2 | 直接实例化 LS 客户端 | `interface/project.py:728-731` `LabelStudioClient(...)` |
|
||||
| 3 | 表字段注释写死 | `scripts/db/data-annotation-init.sql:69` `labeling_project_id IS 'Label Studio项目ID'`,类型 `VARCHAR(8)`(LS 数字型 project ID 宽度,装不下 UUID 形式的 CVAT task ID) |
|
||||
|
||||
前端亦无 `platform` 概念:创建标注任务弹窗的真实表单只有 4 个字段 —— 任务名称、标注模板、数据集文件、描述(`CreateAnnotationTaskDialog.tsx:311-317`)。
|
||||
|
||||
### 6.2 四阶段可执行性判定
|
||||
|
||||
| SOP 阶段 | 平台 | 可执行 | 说明 |
|
||||
|---|---|---|---|
|
||||
| 一、任务发起 | DeepData | ⚠️ 部分 | 创建弹窗存在,但**无平台下拉**;模板/数据集/文件选择可用 |
|
||||
| 二、团队组建与任务分发 | CVAT | ❌ 不可执行 | 无 CVAT;DeepData 也无 Organization / Job 切分 / Assignee 概念 |
|
||||
| 三、标注与审核执行 | CVAT | ❌ 不可执行 | 无 CVAT;**无 annotation→validation→completed 状态机**,无 Accept/Reject 审核流 |
|
||||
| 四、结果回收 | DeepData | ⚠️ 形式存在,实质为 LS | 按钮与接口真实存在、确实写 `tags` 字段,**但拉取源是 Label Studio** |
|
||||
|
||||
### 6.3 可执行流程(Label Studio)
|
||||
|
||||
#### 阶段一:任务发起(DeepData)
|
||||
|
||||
**操作人**:数据管理员
|
||||
|
||||
1. 准备外部条件:先部署 Label Studio(compose profile `label-studio`),配置 `.env` 中的 `LABEL_STUDIO_BASE_URL`、`LABEL_STUDIO_USERNAME`、`LABEL_STUDIO_USER_TOKEN`、`LABEL_STUDIO_PASSWORD`。
|
||||
|
||||
2. 创建标注模板(若尚无模板):
|
||||
- `数据标注` → 模板管理 → 新建。
|
||||
- 选择 `data_type`(image / text / audio / video)与 `labeling_type`。
|
||||
- 在配置区用 Label Studio 的 XML `<Choices>` 语法定义标签,如目标检测:
|
||||
```xml
|
||||
<Choices>
|
||||
<Choice value="Person"/>
|
||||
<Choice value="Car"/>
|
||||
</Choices>
|
||||
```
|
||||
- 标签类型受 `runtime/deepdata-python/app/module/annotation/config/label_studio_tags.yaml` 白名单约束(Audio / Bitmask / PDF / ParagraphLabels / Vector 等)。
|
||||
|
||||
3. 创建标注任务:
|
||||
- `数据标注` → 创建标注任务。
|
||||
- 填写**任务名称**(必填,≥3 字符 —— 此限制来自 Label Studio)、**选择标注模板**(必填)。
|
||||
- 通过 `DatasetFileTransfer` 组件**逐个勾选文件**(不是选整个数据集)。
|
||||
- 描述(选填)。
|
||||
- 确定。
|
||||
|
||||
4. 确认状态:任务列表出现新任务,操作菜单含"标注"、"同步到数据库"、"导出标注结果"。
|
||||
|
||||
> 注意:创建弹窗原本有「自动标注」Tab,**当前已被整段注释屏蔽**(`CreateAnnotationTaskDialog.tsx:333-380, 542-638`),因此"先自动标注生成预标注再送审"这条路目前走不通。
|
||||
|
||||
#### 阶段二:团队与分工(Label Studio 侧)
|
||||
|
||||
Label Studio 没有 DeepData 侧的"团队/Job切分/指派"概念。分工在 Label Studio 内自行组织:标注员用独立账号登录,打开分配给自己的 task。
|
||||
|
||||
#### 阶段三:标注与审核(Label Studio 侧)
|
||||
|
||||
标注员在 Label Studio 内标注并提交。若需审核流程,由 Label Studio 自身的组织与审核规则承担(DeepData 不介入)。
|
||||
|
||||
#### 阶段四:结果回收(DeepData)
|
||||
|
||||
**操作人**:数据管理员
|
||||
|
||||
1. **确认完工**:在 Label Studio 中确认任务标注完成。
|
||||
|
||||
2. **同步回 DeepData**:
|
||||
- `数据标注` → 找到对应任务 → 操作菜单 → **"同步到数据库"**。
|
||||
- 确认对话框会明确提示"将「任务名」在 **Label Studio** 中的标注结果同步到数据库吗?"。
|
||||
- 后端接口:`POST /api/annotation/project/{mapping_id}/sync-db`(`interface/project.py:707-753`)。
|
||||
|
||||
3. **验证数据**:
|
||||
- 进入 `数据管理` → 找到原始数据集。
|
||||
- 查看文件列表的标签/标注列,应显示具体类别名(如 Person、Car)。
|
||||
- 点击文件预览,右侧信息栏显示结构化标注详情。
|
||||
|
||||
4. **导出**(注意差异):
|
||||
- **自动标注任务**:操作菜单"导出标注结果"是真正的打包下载(`GET /api/annotation/auto/{taskId}/download`,`interface/auto.py:870`)。
|
||||
- **手动标注任务**:同名按钮实际执行 `sync-label-studio-back`,把 Label Studio 结果**导成文件写回数据集**,并非打包下载。界面文案与实际行为不一致,属已知缺陷。
|
||||
|
||||
### 6.4 数据落库机制(核实细节)
|
||||
|
||||
标注结果写入 `t_dm_dataset_files` 的 `tags`(JSONB)与 `tags_updated_at`(冲突消解用),完整标注结果写入 `annotation`。
|
||||
|
||||
标签结构归一化为 `{id, type, from_name, to_name, values}`,`values` 以 type 为键(如 `rectanglelabels`),前端通过 `tag.values[tag.type]` 解析(`ls_annotation_sync.py:164-229`)。
|
||||
|
||||
**两条写入路径**:
|
||||
|
||||
| 路径 | 位置 | 方式 |
|
||||
|---|---|---|
|
||||
| 单向回写 | `ls_annotation_sync.py:141-144` | 直接赋值,整体覆盖 |
|
||||
| 双向同步 | `sync.py:763-809` | 走 ORM update,带时间戳冲突判断 |
|
||||
|
||||
**双向同步冲突消解**(`sync.py:606-654`,纯时间戳比较,无字段级合并):
|
||||
|
||||
| 方向 | 方法 | 行为 |
|
||||
|---|---|---|
|
||||
| LS → DM | `_should_overwrite_dm`(:606-627) | `overwrite=False` → 不覆盖;DM 无时间戳 → **允许**覆盖;否则比时间戳 |
|
||||
| DM → LS | `_should_overwrite_ls`(:629-654) | `overwrite_ls=False` → 不覆盖;DM 无时间戳 → **不**覆盖(不对称);否则比时间戳 |
|
||||
|
||||
> ⚠️ **对称性差异**:两者对"缺失时间戳"处理相反 —— DM 无戳时 LS 可覆盖 DM(:623-624),但 DM 无戳时 DM 不覆盖 LS(:646-647)。是否为有意设计待确认。
|
||||
|
||||
### 6.5 若未来要接入 CVAT
|
||||
|
||||
SOP 第四阶段"写入 `t_dm_dataset_files.tags`"这个设计**对 CVAT 不成立**,接CVAT 时需重新设计:
|
||||
|
||||
| 维度 | Label Studio(当前假设) | CVAT |
|
||||
|---|---|---|
|
||||
| 任务层级 | task → annotations | task → **job → frame** |
|
||||
| 标注载体 | task.annotations(JSON) | **frame 级 annotation JSON** |
|
||||
| 导出方式 | API 直接取 JSON | `/api/tasks/{id}/annotations`(文件) |
|
||||
| predictions | 有(模型预标注) | **无此概念** |
|
||||
| 文件关联 | `task.data.file_id` | 需经 job/frame 索引反查 |
|
||||
|
||||
现有实现强依赖 LS 的两个特有字段:`task.data.file_id`(`ls_annotation_sync.py:68`)、`task.predictions`(`ls_annotation_sync.py:91`);冲突消解方法参数也直接命名为 `ls_updated_at`(`sync.py:606`、`:629`)。
|
||||
|
||||
**接入清单**(从零开发,非打开开关):
|
||||
1. 新增 `client/cvat/` 平台客户端(REST API:创建 Task/Job、查询 frame 标注、导出 annotations)
|
||||
2. 引入平台抽象层(当前 `client/` 下只有 `labelstudio/`,无工厂类)
|
||||
3. `t_dm_labeling_projects` 加 `platform` 字段,`labeling_project_id` 类型需放宽(CVAT task ID 是 UUID,`VARCHAR(8)` 装不下)
|
||||
4. 重新设计 `frame_id ↔ file_id` 映射(经 job/frame 索引反查)
|
||||
5. 替换冲突消解的时间戳来源(CVAT 无 per-task `updated_at` 语义)
|
||||
6. 前端创建弹窗加平台下拉,i18n 补 CVAT 文案
|
||||
7. `mapping.py`(483 行)的 DM↔LS 映射逻辑需抽象化
|
||||
|
||||
---
|
||||
|
||||
## 六、DeepData/CVAT 标注作业流程SOP
|
||||
### 6.6 原始 SOP 参考材料(逐字照抄)
|
||||
|
||||
> 本节完整收录《DeepData/CVAT的标注作业流程SOP》,核心原则:**DeepData 负责"管数据(发起与回收)",CVAT 负责"管人与流程(分配、标注、审核)"**。
|
||||
>
|
||||
> 以下为针对**图片**标注任务的完整实操流程(示例:1000 张图)。
|
||||
以下为飞书文档《DeepData/CVAT的标注作业流程SOP》原文,**完整保留以记录设计意图**。⚠️ 其中 CVAT 相关步骤在当前代码中不可执行(见 6.1 / 6.2)。
|
||||
|
||||
### 阶段 1:任务发起(DeepData)
|
||||
> **来源**:https://my.feishu.cn/wiki/FxOJwtOUXi9gm2kFMzQc20epn4b
|
||||
> 文档 ID `LP8rdgNmsoKdYMxmo6Uc0G2Pnqf` · 所属空间 supercrawler的云文档 · 最近修改 2026-10-02
|
||||
> 本地存档:`/Users/figmarlite/deepdata-sources/01-feishu-sop/feishu-cvat-sop-原文照抄.md`
|
||||
> 抓取方式:提取页面 SSR 内嵌 Slate JSON(161 blocks,`has_more: false`,全文完整)
|
||||
|
||||
**核心原则**:DeepData 负责**"管数据(发起与回收)",CVAT 负责"管人与流程(分配、标注、审核)"**。
|
||||
|
||||
> 以下为针对图片标注任务的完整实操流程:
|
||||
|
||||
#### 第一阶段:任务发起 (DeepData)
|
||||
|
||||
**操作人**:数据管理员
|
||||
|
||||
1. **创建标注任务:**
|
||||
- 登录 DeepData → 进入"数据标注" → 点击"创建标注任务"。
|
||||
- 选择包含 1000 张图的数据集。
|
||||
- 关键设置:平台选择 **CVAT**,选择合适的标注模板(如"目标检测")。
|
||||
- 关键设置:平台选择 CVAT,选择合适的标注模板(如"目标检测")。
|
||||
- 点击确定。
|
||||
|
||||
2. **确认状态:**
|
||||
- 在任务列表中看到新任务,显示"前往 CVAT"。
|
||||
- 此时 CVAT 后台已生成了一个包含 1000 张图的任务(Task)。
|
||||
|
||||
### 阶段 2:团队组建与任务分发(CVAT)
|
||||
#### 第二阶段:团队组建与任务分发 (CVAT)
|
||||
|
||||
**操作人**:项目经理(Supervisor/Admin)
|
||||
**操作人**:项目经理 (Supervisor/Admin)
|
||||
|
||||
#### 1. 组建团队(Organization)
|
||||
**1. 组建团队 (Organization)**
|
||||
|
||||
如果是第一次使用,需先建组;已建组可跳过。
|
||||
|
||||
- 登录 CVAT,点击右上角头像 → Settings → Organizations。
|
||||
- 点击 Create Organization(如命名为 `DeepData_Label_Team`)。
|
||||
- 点击 Create Organization(如命名为 DeepData_Label_Team)。
|
||||
- 点击 Invite,输入标注员和审核员的邮箱,邀请他们加入。
|
||||
- **分配角色**:
|
||||
- 标注人员设置为 **Worker**(只能标注)。
|
||||
- 审核人员设置为 **Reviewer** 或 **Supervisor**(能审核)。
|
||||
|
||||
#### 2. 任务切分(Segmentation)—— 关键步骤
|
||||
**2. 任务切分 (Segmentation)** —— 关键步骤
|
||||
|
||||
1000 张图太大,必须拆分成小块(Jobs)才能分给多人同时做。
|
||||
1000 张图太大,必须拆分成小块 (Jobs) 才能分给多人同时做。
|
||||
|
||||
- 在 CVAT 左侧菜单点击 **Tasks**,找到 DeepData 创建的任务(通常以 DeepData 任务名命名,如 `cvat8-检测`)。
|
||||
- 进入任务详情页,找到 **Jobs** 标签页。
|
||||
- 点击右上角 **Edit** 或 **Settings**。
|
||||
- 设置 **Job Size**(切分粒度):
|
||||
- 在 CVAT 左侧菜单点击 Tasks,找到 DeepData 创建的任务(通常以 DeepData 任务名命名,如 `cvat8-检测`)。
|
||||
- 进入任务详情页,找到 Jobs 标签页。
|
||||
- 点击右上角 Edit 或 Settings。
|
||||
- 设置 Job Size(切分粒度):
|
||||
- 建议设置为 **20-50 张图/Job**。
|
||||
- 例如:设为 50,系统会自动将 1000 张图切分为 **20 个 Job**。
|
||||
- 保存设置(系统可能需要一点时间处理切片)。
|
||||
|
||||
#### 3. 分配工作(Assignment)
|
||||
**3. 分配工作 (Assignment)**
|
||||
|
||||
- 在 Jobs 列表中,你会看到 20 个 Job。
|
||||
- **指派标注员(Assignee)**:
|
||||
- **指派标注员 (Assignee)**:
|
||||
- 点击 Job 1 → Assignee 下拉框 → 选择标注员 A。
|
||||
- 依次将 20 个 Job 分配给组内的 Worker。
|
||||
- **指派审核员(Reviewer)**:
|
||||
- **指派审核员 (Reviewer)**:
|
||||
- 点击 Job 1 → Reviewer 下拉框 → 选择审核员 B。
|
||||
- 建议一人审核多个 Job。
|
||||
|
||||
### 阶段 3:标注与审核执行(CVAT)
|
||||
#### 第三阶段:标注与审核执行 (CVAT)
|
||||
|
||||
**操作人**:标注员 & 审核员
|
||||
|
||||
#### 1. 标注员工作(Worker)
|
||||
**1. 标注员工作 (Worker)**
|
||||
|
||||
- 登录 CVAT,点击左侧 **Jobs → Assigned to me**。
|
||||
- 登录 CVAT,点击左侧 Jobs → **Assigned to me**。
|
||||
- 打开分配的 Job,进入标注界面。
|
||||
- 操作:
|
||||
- 根据模板要求画框/选标签。
|
||||
- 完成后点击工具栏的 **Save** 和 **Submit** 按钮。
|
||||
- **状态流转**:Job 状态从 `annotation` 变为 `validation`(待审核)。
|
||||
- **状态流转**:Job 状态从 `annotation` 变为 `validation`(待审核)。
|
||||
|
||||
#### 2. 审核员工作(Reviewer)
|
||||
**2. 审核员工作 (Reviewer)**
|
||||
|
||||
- 登录 CVAT,点击左侧 **Jobs → Validation**(待我审核)。
|
||||
- 登录 CVAT,点击左侧 Jobs → **Validation**(待我审核)。
|
||||
- 打开状态为 `validation` 的 Job。
|
||||
- 检查标注质量:
|
||||
- ✅ **通过**:点击 **Accept** → Job 状态变为 `completed`。
|
||||
- ❌ **驳回**:点击 **Reject** 并在评论区写明原因(如"漏标"、"框不准")→ Job 状态**回退为 `annotation`**,标注员收到通知需重新修改。
|
||||
- 检查:查看标注质量。
|
||||
- ✅ **通过**:点击 Accept。
|
||||
- 结果:Job 状态变为 `completed`。
|
||||
- ❌ **驳回**:点击 Reject 并在评论区写明原因(如"漏标"、"框不准")。
|
||||
- 结果:Job 状态**回退为 `annotation`**,标注员收到通知需重新修改。
|
||||
- **循环**:标注员修改后再次提交,直到所有 Job 状态均为 `completed`。
|
||||
|
||||
### 阶段 4:结果回收(DeepData)
|
||||
#### 第四阶段:结果回收 (DeepData)
|
||||
|
||||
**操作人**:数据管理员
|
||||
|
||||
@@ -206,35 +352,42 @@ Label Studio 走**内置双向同步服务**:
|
||||
- 查看文件列表的"标签/标注"列,应显示具体的类别名称(如 Person, Car)。
|
||||
- 点击文件预览,右侧信息栏应显示结构化的标注详情。
|
||||
|
||||
4. **归档/导出(可选):**
|
||||
4. **归档/导出 (可选):**
|
||||
- 点击任务右侧的"导出标注结果",将最终成果打包下载或存入数据集归档。
|
||||
|
||||
### 流程总结图解
|
||||
#### 流程总结图解
|
||||
|
||||
| 步骤 | 平台 | 动作 | 状态变化 |
|
||||
|---|---|---|---|
|
||||
| 1 | DeepData | 创建任务,选定数据集 | 数据进入 CVAT |
|
||||
| 2 | CVAT | 切分 Job(1000→20 个) | Task 拆分为 Job 列表 |
|
||||
| 3 | CVAT | 分配人员(Assignee/Reviewer) | Job 关联到具体用户 |
|
||||
| 4 | CVAT | 工人标注 → 提交 | `annotation` → `validation` |
|
||||
| 5 | CVAT | 审核员验收 → 通过 | `validation` → `completed` |
|
||||
| 2 | CVAT | 切分 Job (1000→20 个) | Task 拆分为 Job 列表 |
|
||||
| 3 | CVAT | 分配人员 (Assignee/Reviewer) | Job 关联到具体用户 |
|
||||
| 4 | CVAT | 工人标注 → 提交 | annotation → validation |
|
||||
| 5 | CVAT | 审核员验收 → 通过 | validation → completed |
|
||||
| 6 | DeepData | 点击"同步到数据库" | JSON 数据写入 DeepData |
|
||||
|
||||
### 针对 1000 张图的建议
|
||||
#### 针对 1000 张图的建议
|
||||
|
||||
- ⚠️ **务必切分**:千万不要让一个人标 1000 张图,必须切成 20-50 张一组。
|
||||
- 💡 **预标注(进阶)**:如果想提效,可以在 DeepData 侧先用模型跑一遍"自动标注",同步到 CVAT 作为初始数据(Pre-annotations),工人只需要修正错误,**速度会快 3 倍以上**。
|
||||
|
||||
### 角色速查
|
||||
#### SOP 原文与代码实况对照
|
||||
|
||||
| 角色 | 平台 | 能做什么 |
|
||||
|---|---|---|
|
||||
| 数据管理员 | DeepData | 创建任务、同步结果、导出归档 |
|
||||
| Supervisor/Admin | CVAT | 建组、邀请、切分 Job、分配人员 |
|
||||
| Worker | CVAT | 标注、提交 |
|
||||
| Reviewer/Supervisor | CVAT | 审核、Accept/Reject |
|
||||
| SOP 步骤 | 代码实况 |
|
||||
|---|---|
|
||||
| 平台选择 CVAT | ❌ 无平台下拉,硬编码 Label Studio |
|
||||
| 任务列表显示"前往 CVAT" | ⚠️ 文案是"标注",行为跳 Label Studio |
|
||||
| CVAT 后台已生成 Task | ❌ 只在 Label Studio 建项目 |
|
||||
| Job Size 切分 1000→20 | ❌ 无 Job 概念(LS 是每文件一个 task) |
|
||||
| Assignee / Reviewer 分配 | ❌ 未找到实现 |
|
||||
| annotation→validation→completed | ❌ 无状态机,无 Accept/Reject |
|
||||
| "同步到数据库"按钮 | ⚠️ 存在,但对话框明确写 Label Studio |
|
||||
| DeepData 连接 CVAT | ❌ 实际连 `label_studio_base_url` |
|
||||
| 导出标注结果打包下载 | ⚠️ 仅自动标注任务有 download 端点 |
|
||||
| 选择包含 1000 张图的数据集 | ⚠️ 实际需逐个勾选文件 |
|
||||
| 自动标注作 Pre-annotations | ❌ 自动标注 Tab 已被注释屏蔽 |
|
||||
|
||||
### Job 状态机
|
||||
**Job 状态机**(设计意图,当前未实现):
|
||||
|
||||
```
|
||||
annotation ──Submit──▶ validation ──Accept──▶ completed
|
||||
|
||||
+11
-8
@@ -12,7 +12,7 @@
|
||||
|---|---|---|
|
||||
| 数据归集 | 写 DataX 调度脚本 + 手工执行 | 失败了只能靠日志;无重试、无状态记录 |
|
||||
| 数据清洗 | PySpark脚本串成一条链 | 参数一改要改代码;无法可视化调参 |
|
||||
| 数据标注 |自建 Label Studio + CVAT | 两套系统数据对不上;标注结果回不去 |
|
||||
| 数据标注 | 自建 Label Studio | 两套系统数据对不上;标注结果回不去 |
|
||||
| 算子管理 | 脚本堆成 utils.py | 谁写的、什么版本、怎么复用,没人说得清 |
|
||||
| 质量评估 | 人工抽查 | 不系统,无法量化 |
|
||||
| 知识构建 | 另写一套向量化脚本 | 与上游数据脱节,语料更新无法感知 |
|
||||
@@ -35,9 +35,11 @@ DeepData 的价值就是**把这条链路上的人力搬运全部收进一个平
|
||||
| 数据工程师 | 编排清洗流水线、调算子参数 | 数据清洗、算子市场 |
|
||||
| 算法工程师 | 合成指令数据、质量评估 | 数据合成、数据评估 |
|
||||
| 知识库工程师 | 构建 RAG 知识库、管向量索引 | 知识生成 |
|
||||
| 标注团队 | 在 CVAT 里标图、审核、验收 | 见[标注作业 SOP](使用说明#六deepdatacvat-标注作业流程sop) |
|
||||
| 标注团队 | 在 Label Studio 里标图 | 见[标注作业 SOP](使用说明#六标注作业-soplabel-studio-对接) |
|
||||
|
||||
**注意**:DeepData 与 CVAT/Label Studio 的职责是**分离**的 —— DeepData 管数据(发起与回收),CVAT/Label Studio 管人与流程(分配、标注、审核)。理解这个边界是理解整个系统的前提。
|
||||
**注意**:DeepData 与外部标注平台的职责是**分离**的 —— DeepData 管数据(发起与回收),Label Studio 管标注执行。理解这个边界是理解整个系统的前提。
|
||||
|
||||
> ⚠️ **当前代码只集成了 Label Studio**(硬编码,见[使用说明 6.1](使用说明#61-代码实况平台硬编码为-label-studio))。虽然设计上预留了对接 CVAT/Label Studio 等外部平台的可能(见 [需求映射](#六需求到功能的映射)),但 CVAT 集成尚未实现 —— 全库搜索 `cvat` 零命中。若有CVAT 对接需求,需从零开发,详见[接入清单](使用说明#65-若未来要接入-cvat)。
|
||||
|
||||
---
|
||||
|
||||
@@ -62,10 +64,10 @@ DeepData 的价值就是**把这条链路上的人力搬运全部收进一个平
|
||||
### 场景 3:图像目标检测标注
|
||||
|
||||
```
|
||||
数据集(1000 张图) → 创建标注任务(平台选 CVAT) → CVAT 侧切 Job 分工
|
||||
→ 标注审核 → 同步回 DeepData → 标签落入 t_dm_dataset_files.tags
|
||||
数据集(1000 张图) → 创建标注任务(平台固定为 Label Studio) → 标注员在 LS 内标注
|
||||
→ 审核(LS 侧) → 同步回 DeepData → 标签落入 t_dm_dataset_files.tags
|
||||
```
|
||||
详见[标注作业 SOP](使用说明#六deepdatacvat-标注作业流程sop)
|
||||
详见[标注作业 SOP](使用说明#六标注作业-soplabel-studio-对接)
|
||||
|
||||
### 场景 4:多源数据归集
|
||||
|
||||
@@ -99,7 +101,8 @@ NFS/S3/HDFS/数据库/API → DataX 统一 reader → 归集模板 → 数据集
|
||||
|
||||
| 方案 | 定位差异 |
|
||||
|---|---|
|
||||
| CVAT / Label Studio | **只做标注**,不做数据底座。DeepData 负责与它们对接 |
|
||||
| Label Studio | **只做标注**,不做数据底座。DeepData 已完成对接(唯一已集成的标注平台) |
|
||||
| CVAT | 同上,**但DeepData 尚未集成**(全库搜索零命中)。设计上有对接预案,实现需从零开发 |
|
||||
| DataX | **只做数据传输**,无编排无元数据。DeepData 内置集成 |
|
||||
| Data-Juicer | 侧重**数据清洗算法本身**。DeepData 通过容器集成(profile `data-juicer`) |
|
||||
| MinerU | **只做 PDF 解析**。DeepData 通过远端 API 调用 |
|
||||
@@ -116,7 +119,7 @@ DeepData 的定位是**把这些工具串起来的中枢**,而非替代它们
|
||||
|---|---|---|
|
||||
| 数据要有地方放 | 数据集 + 对象存储 | `t_dm_datasets` + MinIO/S3 |
|
||||
| 清洗要能调参重跑 | 可视化编排 + 算子参数化 | `runtime/ops` 算子 + settings 定义 |
|
||||
| 标注要能协作分工 | 对接 CVAT/Label Studio | 标注模块 + 双向同步服务 |
|
||||
| 标注要能协作分工 | 对接外部标注平台 | 标注模块 + 双向同步服务(当前仅 Label Studio) |
|
||||
| 算子要能复用共享 | 算子市场 | `t_operator` + 上传打包机制 |
|
||||
| 质量要能量化评估 | 数据评估模块 | `t_de_eval_task` / `_file` / `_item` |
|
||||
| 要能追溯数据怎么来的 | 血缘管理 | `t_lineage_node` / `t_lineage_edge` |
|
||||
|
||||
Reference in New Issue
Block a user