Spaces:
Running
Running
|
Download processor/docs/README.md from Stouching-Robotics/DataFlowing: direct link, hf CLI and curl.
- Browser
- Download file 35.4 kB
-
https://huggingface.co/spaces/Stouching-Robotics/DataFlowing/resolve/main/processor/docs/README.md
- Command line
-
hf download hf://spaces/Stouching-Robotics/DataFlowing/processor/docs/README.md
-
curl -L -o README.md https://huggingface.co/spaces/Stouching-Robotics/DataFlowing/resolve/main/processor/docs/README.md
35.4 kB
| # processor 项目文档介绍 | |
| processor 是数据接收、处理、审核和导出系统。 | |
| 本文档把项目的功能、页面、图片和操作方法整理在一起。阅读时按照页面顺序向下查看,不需要在多个文档之间来回跳转。 | |
| ## 目录 | |
| 1. [项目整体流程](#1-项目整体流程) | |
| 2. [安装和启动](#2-安装和启动) | |
| 3. [首页](#3-首页) | |
| 4. [项目和接收数据](#4-项目和接收数据) | |
| 5. [工作流](#5-工作流) | |
| 6. [标注数据](#6-标注数据) | |
| 7. [视频查看和审核](#7-视频查看和审核) | |
| 8. [已通过和导出](#8-已通过和导出) | |
| 9. [失败处理](#9-失败处理) | |
| 10. [垃圾桶](#10-垃圾桶) | |
| 11. [常见问题](#11-常见问题) | |
| 12. [数据和程序说明](#12-数据和程序说明) | |
| 13. [代码结构与功能说明](#13-代码结构与功能说明) | |
| ## 1. 项目整体流程 | |
| 系统的完整流程是: | |
| ```text | |
| 安装启动 | |
| ↓ | |
| 打开首页 | |
| ↓ | |
| 创建或选择项目 | |
| ↓ | |
| 接收数据 | |
| ↓ | |
| 选择并运行工作流 | |
| ↓ | |
| 查看视频和处理结果 | |
| ↓ | |
| 标注、检查和审核 | |
| ↓ | |
| 导出数据 | |
| ``` | |
| 系统当前的主要页面: | |
| - Home:查看整体数据状态; | |
| - Projects:查看项目和 Episode; | |
| - Workflow:配置和运行工作流; | |
| - Annotation:处理标注; | |
| - Video Review:查看视频和审核数据; | |
| - Trash:查看已删除的数据。 | |
| Users 用户系统目前仍在开发中,暂不纳入当前操作流程。 | |
| ## 2. 安装和启动 | |
| ### 2.1 下载并打开项目 | |
| 下载项目后,打开: | |
| ```text | |
| processor/ | |
| ``` | |
| ### 2.2 启动程序 | |
| Linux: | |
| ```bash | |
| cd processor | |
| python deploy.py | |
| ``` | |
| 只检查电脑环境,不启动服务: | |
| ```bash | |
| python deploy.py --check-only | |
| ``` | |
| 使用外部 AI API 时: | |
| ```bash | |
| python deploy.py --skip-vllm | |
| ``` | |
| Windows 用户可以运行项目中的 Windows 部署脚本。 | |
| ### 2.3 打开网页 | |
| 等待服务启动后,在浏览器打开管理员提供的地址。 | |
| 看到登录页面,说明网页已经启动。打开: | |
| ```text | |
| /health | |
| ``` | |
| 可以检查服务是否正常。 | |
| > 图片位置:待补充“启动成功和登录页面”截图。 | |
| ### 2.4 出现问题 | |
| - 页面打不开:检查后端是否启动; | |
| - 数据不处理:检查 Worker 是否启动; | |
| - 工作流搭建好后,上传对应的数据会自动跑工作流,如果没有自动处理检查一下工作流,或者手动出现跑一下 | |
| ## 3. 首页 | |
| ### 3.1 首页有什么作用? | |
| 首页用来查看所有数据的总体状态。 | |
| ### 3.2 首页真实页面 | |
|  | |
| 图中主要区域: | |
| 1. 左侧页面菜单; | |
| 2. 顶部数据统计; | |
| 3. 项目列表; | |
| 4. 最近的数据; | |
| 5. 刷新按钮。 | |
| ### 3.3 数据状态 | |
| | 状态 | 说明 | | |
| | --------- | ---------------- | | |
| | Reviewing | 正在检查 | | |
| | Approved | 已经通过 | | |
| | Failed | 处理失败 | | |
| | Trash | 已删除,可以恢复 | | |
| ### 3.4 怎么操作? | |
| 1. 登录后进入首页; | |
| 2. 查看顶部数据统计; | |
| 3. 点击项目名称查看项目; | |
| 4. 数据没有更新时,点击右上角 Refresh。 | |
| ### 3.5 看到什么算正常? | |
| 数据从 Reviewing 变成 Approved,表示数据检查完成并通过。 | |
| 如果一直显示 Processing,等待后刷新页面;仍然不变时检查 Worker。 | |
| ## 4. 项目和接收数据 | |
| ### 4.1 项目是什么? | |
| 项目用于保存一组相关的数据。一个项目下面可以有多个 Episode。 | |
| processor 负责接收采集端发送的数据,并把数据放入对应项目中。采集设备本身不在 processor 中完成采集。 | |
| ### 4.2 查看已有项目 | |
| 打开左侧 `Projects`,可以查看已有项目和接收到的数据。 | |
| [](images/projects-list-annotated.png) | |
| 图中功能: | |
| 1. `搜索项目`:输入项目名称,快速找到项目; | |
| 2. `新建项目`:建立一个新的数据接收项目; | |
| 3. `项目信息`:查看项目名称、状态、工作流、实际输入、Episode 数量和接收统计; | |
| 4. `Edit Project`:修改项目名称、工作流和项目状态; | |
| 5. `Delete`:删除当前项目,删除后可在垃圾桶中查看; | |
| 6. `展开接收批次`:点击项目行或右侧箭头,查看已接收的批次和 Episode。 | |
| `active` 表示项目正在使用,可以继续接收数据;`paused` 表示项目暂停使用。 | |
| ### 4.3 新建项目 | |
| 点击右上角 `New Project`,填写项目基本信息。 | |
| [](images/project-new-annotated.png) | |
| 各项内容: | |
| - `Project Name`:项目名称; | |
| - `Workflow`:给项目绑定一个当前工作流,可以新建工作流,新建的工作流初始为空,也可以选择已有的工作流; | |
| - `Status`:`active` 表示启用,`paused` 表示暂停; | |
| - `Target Episodes`:计划接收的数据数量,`0` 表示不限制; | |
| - `Description`:项目说明,可以不填写; | |
| - `Save`:保存项目。 | |
| 项目名称不能为空。保存新项目后,系统会询问是否进入工作流页面继续设置。 | |
| ### 4.4 选择工作流 | |
| 在新建项目页面的 `Workflow` 中选择对应工作流。 | |
| [](images/project-workflow-select-annotated.png) | |
| 工作流列表功能: | |
| 1. 点击 `Workflow` 输入框打开工作流列表; | |
| 2. 点击 `+ New Workflow` 新建空白工作流; | |
| 3. 带 `Template` 标记的是模板工作流; | |
| 4. 点击已有工作流名称,将它绑定到当前项目; | |
| 5. 点击右侧按钮,进入工作流页面编辑该工作流。 | |
| 一个项目使用一个当前工作流。重新选择其他工作流时会另存为新的绑定当前的工作流。 | |
| 选择原则: | |
| - RGB 数据选择 RGB 相关工作流; | |
| - RGB 加 Depth 选择 RGB-D 相关工作流; | |
| - 有手套传感器时选择包含 Glove Sensor 的工作流; | |
| - 不确定时不要随便选择,先确认项目输入数据类型。 | |
| ### 4.5 接收数据流程 | |
| ```text | |
| 采集端生成数据 | |
| ↓ | |
| 采集端发送数据 | |
| ↓ | |
| processor 接收数据 | |
| ↓ | |
| 解压和检查 | |
| ↓ | |
| 匹配项目和工作流 | |
| ↓ | |
| 项目中出现新的 Episode | |
| ``` | |
| ### 4.6 接收数据时怎么操作? | |
| 1. 新建项目并选择正确的工作流; | |
| 2. 保持项目状态为 `active`; | |
| 3. 由采集端向 processor 发送数据; | |
| 4. 等待 processor 接收、解压和检查; | |
| 5. 展开项目,确认新的批次和 Episode 已经出现。 | |
| 项目已经绑定工作流时,系统会处理新接收的数据。没有绑定工作流时,数据只会被接收和保存,不会执行后处理;之后绑定工作流并保存,系统会补充处理已有批次。 | |
| ### 4.7 重要提醒 | |
| - 接收过程中不要关闭采集端的发送程序; | |
| - 解压和检查完成前不要重复发送同一个数据; | |
| - 每个 Episode 应该有对应的视频或传感器数据; | |
| - 接收失败时先查看失败提示,再重新发送或重新处理; | |
| - 项目和工作流不匹配时,不要强行运行。 | |
| ## 5. 工作流 | |
| ### 5.1 工作流是什么? | |
| 工作流决定系统如何处理接收到的数据。 | |
| ```text | |
| 输入数据 → 处理数据 → 检查结果 → 导出数据 | |
| ``` | |
| ### 5.2 工作流页面 | |
| 点击左侧 `Workflow` 进入工作流页面。 | |
| [](images/workflow-empty-annotated.png) | |
| 图中功能: | |
| 1. `工作流选择`:切换已有工作流或新建工作流; | |
| 2. `工作流名称`:查看或修改当前工作流名称; | |
| 3. `编辑画布`:放置节点并用连接线组成处理流程; | |
| 4. `节点列表`:提供输入、处理、审核和导出节点; | |
| 5. `Template`:从模板开始建立工作流; | |
| 6. `Save`:保存当前工作流。 | |
| ### 5.3 从模板开始 | |
| 点击右上角 `Template`,选择和接收数据匹配的模板。 | |
| [](images/workflow-template-annotated.png) | |
| 1. `RGB-D_Workflow`:使用 RGB 和深度数据的处理链; | |
| 2. `Stereo-RGB_Workflow`:使用左、右两路 RGB 数据的处理链; | |
| 3. `Cancel`:不使用模板,关闭选择窗口。 | |
| 新建或已有工作流都可以套用模板。选择模板会替换当前画布中的处理链,但不会改变当前工作流的名称。 | |
| 模板只提供处理步骤。输入设备节点会根据项目实际接收的数据生成。画布中已经有未保存修改时,先保存再更换模板。 | |
| ### 5.4 检查完整流程 | |
| 下面是已经连接好的工作流示例。 | |
| [](images/workflow-editor-annotated.png) | |
| 1. `Stereo RGB Camera`:项目接收到的左、右 RGB 视频; | |
| 2. `Glove Sensor`:项目接收到的手套传感器数据; | |
| 3. `AI Annotation`:根据 RGB 视频生成任务文字和标注片段; | |
| 4. `Human Review`:把视频、传感器和标注结果交给人工审核; | |
| 5. `LeRobot Export`:按工作流设置准备导出数据; | |
| 6. `Save`:确认连接正确后保存工作流。 | |
| 图中的视频、手套数据和 AI 标注会一起进入人工审核: | |
| ```text | |
| Stereo RGB Camera ─┬→ AI Annotation ─┐ | |
| └─────────────┤ | |
| Glove Sensor ───────────────────┤ | |
| ↓ | |
| Human Review | |
| ↓ | |
| LeRobot Export | |
| ``` | |
| ### 5.5 AI 标注设置 | |
| 打开 `AI Annotation` 节点的设置窗口,选择标注语言和 API。 | |
| [](images/workflow-ai-settings-annotated.png) | |
| 1. `Label Language`:选择中文或英文标注; | |
| 2. `Saved API Profile`:选择已经保存的 API 方案; | |
| 3. `API Provider`:选择 API 厂商; | |
| 4. `API Model`:填写或选择使用的模型; | |
| 5. `API Key`:填写 API 密钥; | |
| 6. `API Base URL`:填写 API 地址,使用官方默认地址时可以留空; | |
| 7. `Test Connection`:保存前测试 API 是否可用; | |
| 8. `Save`:保存 AI 标注设置。 | |
| > API 密钥应显示为隐藏状态。不要分享显示完整密钥的截图。 | |
| ### 5.6 工作流模块说明 | |
| 右侧模块分为 `INPUT`、`PROCESS`、`REVIEW` 和 `EXPORT` 四组。把模块拖到画布中,再按照输入和输出连接。 | |
| #### INPUT:输入数据 | |
| | 模块 | 接收的数据 | 提供的数据 | 什么时候使用 | | |
| | ------------------- | ---------------------- | -------------------------------------- | ------------------------------------------------- | | |
| | Glove Sensor | 手套压力和关节数据 | Glove Sensor Data | 项目中有手套传感器时使用 | | |
| | RGB Camera | 单路彩色视频 | RGB Video | 单目普通相机、单目鱼眼相机或 RGB-D 相机的彩色画面 | | |
| | RGB-D Camera | 彩色视频和真实深度流 | RGB Video、Depth | 单个 RGB-D 相机,有深度数据 | | |
| | Stereo RGB Camera | 左、右两路彩色视频 | Left RGB Video、Right RGB Video | 只有双目 RGB 视频时使用,不会直接提供真实深度 | | |
| | Stereo RGB-D Camera | 左、右彩色视频和深度流 | Left RGB Video、Right RGB Video、Depth | 双目视频同时带有真实深度时使用 | | |
| #### PROCESS:处理数据 | |
| | 模块 | 需要什么 | 产生什么 | 作用 | | |
| | -------------------- | ----------------- | ---------- | ------------------------------------------ | | |
| | Human Annotation | RGB Video | Annotation | 由人工建立和修改任务片段 | | |
| | AI Annotation | RGB Video | Annotation | 使用本地模型或 API 自动生成中文、英文标注 | | |
| | RGB_TO_2D_BareHand | RGB Video | Hand 2D | 识别裸手的视频中二维关键点 | | |
| | RGB_TO_2D_BlackGlove | RGB Video | Hand 2D | 识别黑手套的视频中二维关键点 | | |
| | RGB-D_3D_BareHand | RGB Video + Depth | Hand 3D | 使用匹配的深度数据计算裸手真实三维关键点 | | |
| | RGB-D_3D_BlackGlove | RGB Video + Depth | Hand 3D | 使用匹配的深度数据计算黑手套真实三维关键点 | | |
| `RGB_TO_2D` 模块产生的是二维关键点。页面中的空间预览只是帮助查看,不作为真实米制 3D 数据导出。 | |
| #### REVIEW:检查数据 | |
| | 模块 | 作用 | 结果 | | |
| | ----------------- | ----------------------------------------------------------------- | -------------------------------------------------- | | |
| | Human Review | 由用户播放视频,检查关键点、深度、传感器和标注 | 审核通过后输出 Reviewed Data | | |
| | AI Quality Review | 自动检查视频能否解码、帧是否连续、是否黑屏或卡帧、AI 标注是否完整 | 检查通过后输出 Reviewed Data,异常数据进入人工处理 | | |
| #### EXPORT:导出数据 | |
| | 模块 | 作用 | 主要设置 | | |
| | -------------- | ---------------------- | -------------------------------------------------- | | |
| | LeRobot Export | 导出 LeRobot 数据集 | 选择 v2.1 或 v3.0;包含对应的 meta、data 和 videos | | |
| | HDF5 Export | 导出一个 HDF5 数据文件 | 使用 gzip 压缩保存 | | |
| 导出模块应连接在审核模块之后。这样只有检查通过的数据才会进入导出流程。 | |
| ### 5.7 常见处理方式 | |
| 普通 RGB: | |
| ```text | |
| RGB → Hand 2D → Human Review → Export | |
| ``` | |
| RGB 和深度: | |
| ```text | |
| RGB + Depth → Hand 3D → Human Review → Export | |
| ``` | |
| RGB 和手套传感器: | |
| ```text | |
| RGB + Glove Sensor → Human Review → Export | |
| ``` | |
| ### 5.8 重要规则 | |
| - 有 RGB 和 Depth,才能计算真实 3D; | |
| - 只有 RGB 时,可以得到 2D 关键点; | |
| - 只有 RGB 时显示的空间效果不等于真实 metric 3D; | |
| - 输入不匹配时,对应步骤会被跳过。 | |
| 看到 Input mismatch,说明工作流需要的数据和当前项目数据不匹配,需要换用正确的工作流。 | |
| ## 6. 标注数据 | |
| ### 6.1 选择需要标注的数据 | |
| 点击左侧 `Annotation`。先在右侧展开项目,再选择一个 Episode。 | |
| [](images/annotation-list-annotated.png) | |
| 1. `Annotation`:进入标注页面; | |
| 2. 点击项目名称展开项目; | |
| 3. 点击 Episode 编号,加载视频和已有标注。 | |
| 中间显示 `Select an episode to review` 时,表示还没有选择 Episode,不是系统故障。 | |
| ### 6.2 查看和编辑标注 | |
| [](images/annotation-editor-annotated.png) | |
| 1. `Preview Options`:控制关键点、轨迹、深度和 3D 预览; | |
| 2. `RGB 和 2D 关键点`:查看原始画面和图片上的手部关键点; | |
| 3. `3D 手部空间`:查看空间中的手部关键点; | |
| 4. `深度伪彩色预览`:查看深度数据的网页显示效果; | |
| 5. `AI Annotate`:按工作流设置运行 AI 标注; | |
| 6. `标注片段`:点击右侧某个片段,查看或修改它; | |
| 7. `Set Start / Set End`:用当前帧设置片段的开始帧和结束帧; | |
| 8. `Save Changes`:保存片段名称和帧范围的修改。 | |
| ### 6.3 人工修改标注 | |
| 1. 在右侧点击需要修改的标注片段; | |
| 2. 检查开始帧、结束帧和任务名称; | |
| 3. 修改后点击 `Save Changes`; | |
| 4. 检查下方时间条中的标注块。 | |
| ### 6.4 AI 标注 | |
| 1. 确认工作流中已经设置 `AI Annotation`; | |
| 2. 按工作流设置选择中文或英文; | |
| 3. 点击 `AI Annotate`; | |
| 4. 等待标注片段生成; | |
| 5. 人工检查并修改不正确的内容。 | |
| 6. 工作流中有这个功能会自动进行标注 | |
| 7. 可能会因为网络波动导致一个小片段,没有对应的标注信息 | |
| ## 7. 视频查看和审核 | |
| ### 7.1 选择待审核数据 | |
| 点击 `Video Review` 下的 `Reviewing`,在右侧选择一个待审核 Episode。 | |
| [](images/reviewing-list-annotated.png) | |
| 1. `Reviewing`:查看等待人工审核的数据; | |
| 2. `展开项目`:查看项目下的 Episode; | |
| 3. `选择 Episode`:打开数据,并查看帧率、帧数、相机和处理状态; | |
| 4. `Approve`:检查正确后,通过当前 Episode; | |
| 5. `Reprocess`:处理结果不正确时,重新运行项目绑定的工作流。 | |
| ### 7.2 检查视频和处理结果 | |
| [](images/reviewing-player-annotated.png) | |
| 1. `Preview Options`:显示或隐藏不同的预览内容; | |
| 2. `RGB 原图`:查看彩色视频;打开关键点显示后会叠加 2D 手部关键点; | |
| 3. `3D 手部空间`:检查空间中的手部关键点; | |
| 4. `深度伪彩色预览`:检查深度数据是否正常; | |
| 5. `只读标注片段`:检查任务名称和帧范围; | |
| 6. `播放和逐帧控制`:播放视频,或使用上一帧、下一帧检查细节; | |
| 7. `Approve`:确认当前 Episode 审核通过。 | |
| 审核时先等待关联数据加载完成,再点击播放。RGB、2D、3D、深度和传感器画面应使用相同帧号显示。 | |
| ### 7.3 深度画面说明 | |
| 深度画面中的蓝色、绿色、黄色等颜色只是网页中的预览效果。 | |
| 深度视频保存的是原始 12-bit 深度码,也不会把伪彩色图片写回原始数据。 | |
| ### 7.4 常见显示问题 | |
| - 黑屏:等待当前 Episode 加载完成,再刷新页面; | |
| - 没有 3D 手部:检查工作流是否包含 3D 处理,以及 Episode 是否有 Depth; | |
| - 关键点不动:重新处理对应 Episode; | |
| - 播放卡顿:等待关联数据完成缓存后再播放。 | |
| ## 8. 已通过和导出 | |
| ### 8.1 已通过数据 | |
| 点击 `Video Review` 下的 `Approved`,可以查看已经通过审核的数据。 | |
| [](images/approved-list-annotated.png) | |
| 1. `Approved`:进入已通过列表; | |
| 2. `多选模式`:点击页面顶部 `Select` 进入;进入后按钮变为 `Cancel`; | |
| 3. `Select All`:选择当前列表中的全部 Episode; | |
| 4. `Episode 复选框`:可以单选一条,也可以同时选择多条; | |
| 5. `Export`:导出这一条 Episode; | |
| 6. `Unreview`:取消审核通过状态,让数据回到待审核列表。 | |
| ### 8.2 导出流程 | |
| 导出一条 Episode: | |
| 1. 在该 Episode 的项目卡片中点击 `Export`; | |
| 2. 等待导出完成并下载压缩包。 | |
| 批量导出: | |
| 1. 点击页面顶部 `Select`; | |
| 2. 勾选一条或多条 Episode,也可以点击 `Select All`; | |
| 3. 选择后页面会显示 `Batch Download` 操作条; | |
| 4. 点击 `Batch Download`,等待导出完成。 | |
| 导出格式使用当前工作流导出节点中的设置,例如 LeRobot 2.1、LeRobot 3.0 或 HDF5,不需要进入独立导出页面。 | |
| ### 8.3 导出内容 | |
| ```text | |
| 项目名称/ | |
| ├── meta/ # 说明和统计信息 | |
| ├── data/ # 每帧数据、关键点和传感器数据 | |
| └── videos/ # 视频 | |
| ``` | |
| 后处理后的关键点、标注和手套传感器数据,会和对应的数据一起导出。 | |
| ## 9. 失败处理 | |
| ### 9.1 处理流程 | |
| ```text | |
| 看到 Failed | |
| ↓ | |
| 打开失败数据 | |
| ↓ | |
| 查看错误提示 | |
| ↓ | |
| 点击 Retry 或 Reprocess | |
| ↓ | |
| 等待重新处理 | |
| ``` | |
| > 图片位置:待补充“Failed 失败页面”截图。 | |
| ### 9.2 常见错误 | |
| | 错误 | 处理方法 | | |
| | ------------- | ---------------------------- | | |
| | 没有 RGB | 检查是否上传了彩色视频 | | |
| | 没有 Depth | 不能计算真实 3D | | |
| | 工作流不匹配 | 选择正确的工作流 | | |
| | AI 标注失败 | 检查 API 设置后重试 | | |
| | 视频打不开 | 由采集端重新发送或联系管理员 | | |
| | Worker 未运行 | 联系管理员重启服务 | | |
| 重试两次仍然失败时,请发送数据名称、错误截图、失败时间和操作步骤。 | |
| ## 10. 垃圾桶 | |
| ### 10.1 垃圾桶有什么作用? | |
| 删除的数据会先进入垃圾桶。 | |
| ### 10.2 怎么操作? | |
| [](images/trash-annotated.png) | |
| 1. 点击左侧 `Trash` 进入垃圾桶; | |
| 2. 查看数据的剩余保留时间; | |
| 3. 需要保留时点击 `Restore` 恢复; | |
| 4. 确定不再需要时点击 `Delete` 永久删除; | |
| 5. `Purge All` 会永久删除垃圾桶中的全部数据。 | |
| ### 10.3 重要提醒 | |
| - 垃圾桶中的数据可以恢复; | |
| - 永久删除后通常不能恢复; | |
| - 清空垃圾桶前要再次确认; | |
| - 找不到数据时,先检查项目名称和删除时间。 | |
| ## 11. 常见问题 | |
| ### 页面打不开 | |
| 检查服务是否启动。 | |
| ### 数据一直处理中 | |
| 刷新页面。如果长时间不变,可能是 Worker 没有运行。 | |
| ### 深度画面是黑色 | |
| 等待加载完成后刷新,并检查当前 Episode 是否真的有深度视频。 | |
| ### 只有 2D,没有 3D | |
| 真实 3D 需要 RGB 和 Depth 两种输入。只有 RGB 时不能计算真实空间位置。 | |
| ### 播放卡顿 | |
| 等待数据加载完成后再播放。检查细节时可以使用上一帧和下一帧。 | |
| ### AI 标注没有结果 | |
| 检查 API 设置、模型、网络和语言设置,然后重新运行 AI 标注。 | |
| ### 导出失败 | |
| 确认数据已经审核完成,再重新导出。 | |
| ## 12. 数据和程序说明 | |
| ### 12.1 项目目录 | |
| ```text | |
| processor/ | |
| ├── app/ # 后端、工作流、视频和导出 | |
| ├── worker/ # 后台处理任务 | |
| ├── web/ # 页面和前端代码 | |
| ├── scripts/ # 启动、检查和维护脚本 | |
| ├── tests/ # 自动测试 | |
| ├── deploy.py # 一键部署入口 | |
| └── .env # 本机配置,不要提交到 Git | |
| ``` | |
| ### 12.2 项目数据目录 | |
| ```text | |
| data/sessions/<project>/ | |
| ├── data/ | |
| ├── meta/ | |
| └── videos/ | |
| ``` | |
| 原始深度视频保存为深度码。浏览器显示的伪彩色不会写回原始数据。 | |
| ### 12.3 启动检查 | |
| ```bash | |
| python deploy.py --check-only | |
| python -m compileall app worker | |
| PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q | |
| ``` | |
| 不要把 .env、API Key、Token、真实数据和服务器凭据提交到 Git。 | |
| ## 13. 代码结构与功能说明 | |
| 本章用于说明页面背后的前端、后端、Worker 和数据处理代码。普通操作不需要修改这些文件;需要维护功能时,可以根据本章快速找到对应位置。 | |
| ### 13.1 系统代码链路 | |
| 浏览器页面 | |
| ↓ | |
| HTML 模板和 JavaScript | |
| ↓ | |
| FastAPI 后端接口 | |
| ↓ | |
| 项目、Episode、标注和工作流 | |
| ↓ | |
| Worker 领取处理任务 | |
| ↓ | |
| 工作流模块执行后处理 | |
| ↓ | |
| 保存关键点、3D、传感器和标注结果 | |
| ↓ | |
| 视频审核和数据导出 | |
| 业务数据主要保存在项目文件中。用户账号可以使用数据库;数据库暂时不可用时,程序保留兼容回退能力。 | |
| ### 13.2 代码目录树 | |
| processor/ | |
| ├── app/ # Python 后端 | |
| │ ├── main.py # FastAPI 启动入口 | |
| │ ├── config.py # 环境变量和系统配置 | |
| │ ├── paths.py # 统一目录路径 | |
| │ ├── localstore.py # 项目、工作流和 Episode 文件状态 | |
| │ ├── database.py # 用户账号数据库连接 | |
| │ ├── models.py # 数据库模型 | |
| │ ├── workflow_dispatch.py # 工作流匹配、自动派发和历史回填 | |
| │ ├── workflow_bindings.py # 工作流与实际设备输入绑定 | |
| │ ├── ai_annotation.py # AI 标注服务 | |
| │ ├── export_engine.py # 导出任务公共逻辑 | |
| │ ├── lerobot_export.py # LeRobot 3.0 数据生成 | |
| │ ├── lerobot_v21.py # LeRobot 2.1 兼容处理 | |
| │ ├── hdf5_export.py # HDF5 数据生成 | |
| │ ├── routes/ # 页面和业务接口 | |
| │ ├── api/ # 项目、工作流和 Worker 接口 | |
| │ └── processing/ # 工作流后处理框架 | |
| │ ├── registry.py # 自动注册处理模块 | |
| │ ├── catalog.py # 向工作流页面提供模块清单 | |
| │ ├── batch.py # 查找批次中的视频和 Parquet | |
| │ └── modules/ # 每个工作流节点的执行代码 | |
| ├── worker/ # 后台处理程序 | |
| │ ├── __main__.py # Worker 启动入口 | |
| │ ├── runner.py # 领取和执行工作流任务 | |
| │ └── client.py # 与后端 Worker API 通信 | |
| ├── web/ # 前端页面 | |
| │ ├── templates/ # HTML 页面模板 | |
| │ ├── static/js/ # 页面交互、播放和渲染 | |
| │ └── workflow-studio/ # React 工作流编辑器源码 | |
| ├── scripts/ # 部署、迁移和维护脚本 | |
| ├── tests/ # 自动测试 | |
| ├── models/ # 本地模型文件 | |
| ├── docs/ # 中文和英文项目文档 | |
| ├── deploy.py # 一键部署入口 | |
| └── requirements*.txt # Python 依赖 | |
| <code>.venv*</code>、<code>.pytest_cache</code> 和 <code>.backups</code> 是本机环境、测试缓存或备份,不属于主要业务代码。 | |
| ### 13.3 前端代码 | |
| 前端由两部分组成: | |
| 1. 普通页面使用 HTML 模板和原生 JavaScript; | |
| 2. 工作流编辑器使用 React 和 TypeScript。 | |
| #### 页面模板 | |
| | 文件 | 作用 | | |
| | --- | --- | | |
| | <code>web/templates/base.html</code> | 公共页面框架、左侧菜单和通用资源 | | |
| | <code>web/templates/overview.html</code> | 首页 | | |
| | <code>web/templates/tasks.html</code> | 项目管理页面 | | |
| | <code>web/templates/index.html</code> | 标注和视频审核页面 | | |
| | <code>web/templates/trash.html</code> | 垃圾桶页面 | | |
| | <code>web/templates/login.html</code> | 登录页面 | | |
| | <code>web/templates/users.html</code> | 用户管理页面,目前仍在开发 | | |
| | <code>web/templates/workflow_studio.html</code> | 工作流编辑器入口 | | |
| #### 页面 JavaScript | |
| | 文件 | 作用 | | |
| | --- | --- | | |
| | <code>web/static/js/dashboard.js</code> | 首页统计、最近数据和刷新 | | |
| | <code>web/static/js/tasks.js</code> | 项目创建、编辑、删除和批次展开 | | |
| | <code>web/static/js/app.js</code> | Episode 列表、审核、删除和导出操作 | | |
| | <code>web/static/js/player.js</code> | 视频加载、统一播放时钟和帧同步 | | |
| | <code>web/static/js/annotations.js</code> | 标注片段、时间条和逐帧标注 | | |
| | <code>web/static/js/slice-preview.js</code> | 右上角标注片段预览 | | |
| | <code>web/static/js/hand-overlay.js</code> | 在 RGB 原图上绘制 2D 手部关键点 | | |
| | <code>web/static/js/depth-renderer.js</code> | 将原始 12-bit 深度码渲染为网页伪彩色 | | |
| | <code>web/static/js/heatmap.js</code> | 手套传感器数据同步显示 | | |
| | <code>web/static/js/media-cache.js</code> | 使用 IndexedDB 缓存关键点和传感器数据 | | |
| | <code>web/static/js/i18n.js</code> | 中英文界面文字 | | |
| | <code>web/static/js/login.js</code> | 登录表单 | | |
| | <code>web/static/js/users.js</code> | 用户管理交互,目前仍在开发 | | |
| 工作流编辑器源码位于 <code>web/workflow-studio/src/</code>。编译后的文件位于 <code>web/static/workflow-studio/</code>,修改工作流页面时应修改源码并重新构建,不要直接修改编译结果。 | |
| ### 13.4 后端入口和页面接口 | |
| <code>app/main.py</code> 是后端入口,主要负责: | |
| - 启动 FastAPI; | |
| - 初始化文件目录和用户数据库; | |
| - 预热项目与 Episode 元数据缓存; | |
| - 启动上传处理队列; | |
| - 注册页面、项目、视频、标注、工作流和导出接口; | |
| - 提供静态文件缓存和大媒体文件传输规则。 | |
| | 文件 | 作用 | | |
| | --- | --- | | |
| | <code>app/routes/pages.py</code> | 返回首页、项目、审核、工作流和垃圾桶页面 | | |
| | <code>app/routes/dashboard.py</code> | 首页统计、最近 Episode 和趋势 | | |
| | <code>app/routes/session.py</code> | 接收压缩包、解压、整理目录和导入元数据 | | |
| | <code>app/routes/ingestion.py</code> | Episode 列表、详情、审核、重跑、删除和恢复 | | |
| | <code>app/routes/video.py</code> | RGB 视频、深度码、深度预览、2D、3D 和传感器接口 | | |
| | <code>app/routes/annotations.py</code> | 创建、修改、删除和逐帧读取标注 | | |
| | <code>app/routes/export.py</code> | 单个导出、批量导出、任务状态和下载 | | |
| | <code>app/routes/auth.py</code> | 登录、退出和当前用户 | | |
| | <code>app/routes/devices.py</code> | 采集设备心跳和输入能力 | | |
| ### 13.5 项目、工作流和 Worker API | |
| | 文件 | 作用 | | |
| | --- | --- | | |
| | <code>app/api/projects.py</code> | 项目创建、编辑、删除、输入源和工作流绑定 | | |
| | <code>app/api/workflows.py</code> | 工作流创建、保存、运行、使用情况和重试 | | |
| | <code>app/api/worker.py</code> | Worker 领取任务、下载输入、心跳、完成和失败上报 | | |
| | <code>app/api/exceptions.py</code> | 汇总和清理处理异常 | | |
| | <code>app/api/users.py</code> | 用户创建、角色、状态和删除,目前仍在开发 | | |
| 后端与 Worker 的任务过程: | |
| 后端创建运行记录 | |
| ↓ | |
| Worker 领取任务 | |
| ↓ | |
| Worker 下载 Episode 输入 | |
| ↓ | |
| 执行工作流节点 | |
| ↓ | |
| Worker 上传结果并报告完成 | |
| ↓ | |
| Episode 进入审核或通过状态 | |
| Worker 会定期发送心跳。如果 Worker 中断,任务不会立刻丢失,后端可以在超时后重新安排。 | |
| ### 13.6 工作流后处理模块 | |
| <code>app/processing/modules/</code> 中一个 Python 文件通常对应一个工作流节点。模块通过注册表自动出现在工作流编辑器中,并由 Worker 执行。 | |
| | 模块文件 | 作用 | | |
| | --- | --- | | |
| | <code>mono_camera.py</code> | 单路 RGB 输入 | | |
| | <code>rgbd_camera.py</code> | RGB 和深度输入 | | |
| | <code>stereo_camera.py</code> | 左、右双目 RGB 输入 | | |
| | <code>stereo_rgbd_camera.py</code> | 左、右 RGB 和深度输入 | | |
| | <code>glove_sensor.py</code> | 手套传感器输入 | | |
| | <code>mediapipe_hand.py</code> | MediaPipe 手部关键点和手势识别 | | |
| | <code>rgb_hand_3d.py</code> | 裸手 RGB 二维关键点和预览空间效果 | | |
| | <code>black_hand_rgb_3d.py</code> | 黑手套 RGB 二维关键点和预览空间效果 | | |
| | <code>depth_hand_3d.py</code> | RGB-D 手部模块使用的真实 3D 计算辅助代码,不是独立节点 | | |
| | <code>black_glove_hand.py</code> | 黑手套关键点处理 | | |
| | <code>ai_annotation.py</code> | 声明并触发 AI 自动标注 | | |
| | <code>annotation.py</code> | 人工标注工作流节点 | | |
| | <code>human_review.py</code> | 人工审核门 | | |
| | <code>ai_quality_review.py</code> | 视频和标注自动质量检查 | | |
| | <code>lerobot_export.py</code> | LeRobot 导出节点 | | |
| | <code>hdf5_export.py</code> | HDF5 导出节点 | | |
| 增加工作流模块时,应同时检查: | |
| 1. 模块输入和输出类型; | |
| 2. Worker 是否能够执行; | |
| 3. 工作流编辑器是否正确显示; | |
| 4. 处理结果是否能在审核页面读取; | |
| 5. 导出模块是否包含新增结果。 | |
| ### 13.7 数据、缓存和导出 | |
| | 文件 | 作用 | | |
| | --- | --- | | |
| | <code>app/localstore.py</code> | 扫描和缓存项目、Episode、工作流及运行状态 | | |
| | <code>app/storage.py</code> | 文件上传、校验、保存和远程同步 | | |
| | <code>app/remote_storage.py</code> | 远程存储访问 | | |
| | <code>app/media_groups.py</code> | 组织 RGB、深度和传感器媒体组 | | |
| | <code>app/media_cache.py</code> | 服务端媒体缓存 | | |
| | <code>app/browser_preview.py</code> | 生成浏览器兼容的视频预览 | | |
| | <code>app/artifact_resolver.py</code> | 查找工作流处理结果 | | |
| | <code>app/export_engine.py</code> | 统一导出流程 | | |
| | <code>app/lerobot_export.py</code> | 生成 LeRobot 3.0 数据集 | | |
| | <code>app/lerobot_v21.py</code> | 生成和兼容 LeRobot 2.1 数据 | | |
| | <code>app/hdf5_export.py</code> | 生成 HDF5 数据集 | | |
| 源数据、后处理结果和导出副本需要分清: | |
| data/sessions/ # 项目源数据和合并后的后处理字段 | |
| data/tmp/ # 临时处理文件 | |
| 浏览器 IndexedDB # 前端预览缓存,可以重新生成 | |
| 导出压缩包 # 根据工作流设置生成的交付文件 | |
| 不要把浏览器伪彩色深度图当作源数据保存。源深度仍然是原始深度码。 | |
| ### 13.8 修改功能时去哪里 | |
| | 需要修改的功能 | 前端位置 | 后端或处理位置 | | |
| | --- | --- | --- | | |
| | 首页统计 | <code>dashboard.js</code> | <code>routes/dashboard.py</code> | | |
| | 项目页面 | <code>tasks.js</code> | <code>api/projects.py</code> | | |
| | 上传和解压 | 项目页面 | <code>routes/session.py</code> | | |
| | 工作流编辑器 | <code>workflow-studio/src/</code> | <code>api/workflows.py</code> | | |
| | 工作流自动运行 | 项目状态显示 | <code>workflow_dispatch.py</code> | | |
| | RGB 视频播放 | <code>player.js</code> | <code>routes/video.py</code> | | |
| | 播放帧同步 | <code>player.js</code> | <code>routes/video.py</code> | | |
| | 2D 手部关键点 | <code>hand-overlay.js</code> | 手部处理模块 | | |
| | 3D 手部空间 | <code>player.js</code> | <code>processing/modules/*3d*.py</code> | | |
| | 深度伪彩色 | <code>depth-renderer.js</code> | <code>routes/video.py</code> | | |
| | 手套传感器 | <code>heatmap.js</code> | <code>glove_sensor.py</code> | | |
| | 标注时间条 | <code>annotations.js</code> | <code>routes/annotations.py</code> | | |
| | AI 标注 | <code>annotations.js</code> | <code>ai_annotation.py</code> | | |
| | 视频审核 | <code>app.js</code> | <code>routes/ingestion.py</code> | | |
| | 单个和批量导出 | <code>app.js</code> | <code>routes/export.py</code> | | |
| | LeRobot 格式 | 导出按钮 | <code>lerobot_export.py</code>、<code>lerobot_v21.py</code> | | |
| | HDF5 格式 | 导出按钮 | <code>hdf5_export.py</code> | | |
| | 垃圾桶 | <code>trash.html</code> | <code>routes/ingestion.py</code> | | |
| | 用户管理 | <code>users.js</code> | <code>api/users.py</code> | | |
| ### 13.9 排查问题的顺序 | |
| 遇到问题时,建议按照下面顺序检查: | |
| 1. 先确认问题出现在哪个页面; | |
| 2. 找到该页面对应的 JavaScript; | |
| 3. 在浏览器开发者工具中检查接口是否失败; | |
| 4. 根据接口地址找到对应的 Python 路由; | |
| 5. 如果是工作流任务,再检查 Worker 和处理模块; | |
| 6. 如果是显示不同步,再检查当前 Episode 的帧数、帧率和缓存; | |
| 7. 修改后运行测试,再打开真实数据验证。 | |
| ## 结尾 | |
| 先上传,再处理;处理完成后检查;检查正确后再导出。 | |