diff --git a/Home.md b/Home.md index 661f750..a847878 100644 --- a/Home.md +++ b/Home.md @@ -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 对接 + 原始参考材料) | --- diff --git a/产品功能.md b/产品功能.md index ab8abff..f6f9fcc 100644 --- a/产品功能.md +++ b/产品功能.md @@ -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`),此路径暂时不可用。 --- diff --git a/使用说明.md b/使用说明.md index 7b68b05..a784d76 100644 --- a/使用说明.md +++ b/使用说明.md @@ -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 `` 语法定义标签,如目标检测: + ```xml + + + + + ``` + - 标签类型受 `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 diff --git a/需求与定位.md b/需求与定位.md index 16fb9ee..2b647ff 100644 --- a/需求与定位.md +++ b/需求与定位.md @@ -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` |