# 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 首页真实页面 ![首页功能图](images/02-home-annotated.png) 图中主要区域: 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)](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)](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)](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)](images/workflow-empty-annotated.png) 图中功能: 1. `工作流选择`:切换已有工作流或新建工作流; 2. `工作流名称`:查看或修改当前工作流名称; 3. `编辑画布`:放置节点并用连接线组成处理流程; 4. `节点列表`:提供输入、处理、审核和导出节点; 5. `Template`:从模板开始建立工作流; 6. `Save`:保存当前工作流。 ### 5.3 从模板开始 点击右上角 `Template`,选择和接收数据匹配的模板。 [![选择工作流模板](images/workflow-template-annotated.png)](images/workflow-template-annotated.png) 1. `RGB-D_Workflow`:使用 RGB 和深度数据的处理链; 2. `Stereo-RGB_Workflow`:使用左、右两路 RGB 数据的处理链; 3. `Cancel`:不使用模板,关闭选择窗口。 新建或已有工作流都可以套用模板。选择模板会替换当前画布中的处理链,但不会改变当前工作流的名称。 模板只提供处理步骤。输入设备节点会根据项目实际接收的数据生成。画布中已经有未保存修改时,先保存再更换模板。 ### 5.4 检查完整流程 下面是已经连接好的工作流示例。 [![完整工作流](images/workflow-editor-annotated.png)](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。 [![AI 标注设置](images/workflow-ai-settings-annotated.png)](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)](images/annotation-list-annotated.png) 1. `Annotation`:进入标注页面; 2. 点击项目名称展开项目; 3. 点击 Episode 编号,加载视频和已有标注。 中间显示 `Select an episode to review` 时,表示还没有选择 Episode,不是系统故障。 ### 6.2 查看和编辑标注 [![标注编辑页面](images/annotation-editor-annotated.png)](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)](images/reviewing-list-annotated.png) 1. `Reviewing`:查看等待人工审核的数据; 2. `展开项目`:查看项目下的 Episode; 3. `选择 Episode`:打开数据,并查看帧率、帧数、相机和处理状态; 4. `Approve`:检查正确后,通过当前 Episode; 5. `Reprocess`:处理结果不正确时,重新运行项目绑定的工作流。 ### 7.2 检查视频和处理结果 [![视频审核页面](images/reviewing-player-annotated.png)](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)](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)](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// ├── 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 依赖 .venv*、.pytest_cache 和 .backups 是本机环境、测试缓存或备份,不属于主要业务代码。 ### 13.3 前端代码 前端由两部分组成: 1. 普通页面使用 HTML 模板和原生 JavaScript; 2. 工作流编辑器使用 React 和 TypeScript。 #### 页面模板 | 文件 | 作用 | | --- | --- | | web/templates/base.html | 公共页面框架、左侧菜单和通用资源 | | web/templates/overview.html | 首页 | | web/templates/tasks.html | 项目管理页面 | | web/templates/index.html | 标注和视频审核页面 | | web/templates/trash.html | 垃圾桶页面 | | web/templates/login.html | 登录页面 | | web/templates/users.html | 用户管理页面,目前仍在开发 | | web/templates/workflow_studio.html | 工作流编辑器入口 | #### 页面 JavaScript | 文件 | 作用 | | --- | --- | | web/static/js/dashboard.js | 首页统计、最近数据和刷新 | | web/static/js/tasks.js | 项目创建、编辑、删除和批次展开 | | web/static/js/app.js | Episode 列表、审核、删除和导出操作 | | web/static/js/player.js | 视频加载、统一播放时钟和帧同步 | | web/static/js/annotations.js | 标注片段、时间条和逐帧标注 | | web/static/js/slice-preview.js | 右上角标注片段预览 | | web/static/js/hand-overlay.js | 在 RGB 原图上绘制 2D 手部关键点 | | web/static/js/depth-renderer.js | 将原始 12-bit 深度码渲染为网页伪彩色 | | web/static/js/heatmap.js | 手套传感器数据同步显示 | | web/static/js/media-cache.js | 使用 IndexedDB 缓存关键点和传感器数据 | | web/static/js/i18n.js | 中英文界面文字 | | web/static/js/login.js | 登录表单 | | web/static/js/users.js | 用户管理交互,目前仍在开发 | 工作流编辑器源码位于 web/workflow-studio/src/。编译后的文件位于 web/static/workflow-studio/,修改工作流页面时应修改源码并重新构建,不要直接修改编译结果。 ### 13.4 后端入口和页面接口 app/main.py 是后端入口,主要负责: - 启动 FastAPI; - 初始化文件目录和用户数据库; - 预热项目与 Episode 元数据缓存; - 启动上传处理队列; - 注册页面、项目、视频、标注、工作流和导出接口; - 提供静态文件缓存和大媒体文件传输规则。 | 文件 | 作用 | | --- | --- | | app/routes/pages.py | 返回首页、项目、审核、工作流和垃圾桶页面 | | app/routes/dashboard.py | 首页统计、最近 Episode 和趋势 | | app/routes/session.py | 接收压缩包、解压、整理目录和导入元数据 | | app/routes/ingestion.py | Episode 列表、详情、审核、重跑、删除和恢复 | | app/routes/video.py | RGB 视频、深度码、深度预览、2D、3D 和传感器接口 | | app/routes/annotations.py | 创建、修改、删除和逐帧读取标注 | | app/routes/export.py | 单个导出、批量导出、任务状态和下载 | | app/routes/auth.py | 登录、退出和当前用户 | | app/routes/devices.py | 采集设备心跳和输入能力 | ### 13.5 项目、工作流和 Worker API | 文件 | 作用 | | --- | --- | | app/api/projects.py | 项目创建、编辑、删除、输入源和工作流绑定 | | app/api/workflows.py | 工作流创建、保存、运行、使用情况和重试 | | app/api/worker.py | Worker 领取任务、下载输入、心跳、完成和失败上报 | | app/api/exceptions.py | 汇总和清理处理异常 | | app/api/users.py | 用户创建、角色、状态和删除,目前仍在开发 | 后端与 Worker 的任务过程: 后端创建运行记录 ↓ Worker 领取任务 ↓ Worker 下载 Episode 输入 ↓ 执行工作流节点 ↓ Worker 上传结果并报告完成 ↓ Episode 进入审核或通过状态 Worker 会定期发送心跳。如果 Worker 中断,任务不会立刻丢失,后端可以在超时后重新安排。 ### 13.6 工作流后处理模块 app/processing/modules/ 中一个 Python 文件通常对应一个工作流节点。模块通过注册表自动出现在工作流编辑器中,并由 Worker 执行。 | 模块文件 | 作用 | | --- | --- | | mono_camera.py | 单路 RGB 输入 | | rgbd_camera.py | RGB 和深度输入 | | stereo_camera.py | 左、右双目 RGB 输入 | | stereo_rgbd_camera.py | 左、右 RGB 和深度输入 | | glove_sensor.py | 手套传感器输入 | | mediapipe_hand.py | MediaPipe 手部关键点和手势识别 | | rgb_hand_3d.py | 裸手 RGB 二维关键点和预览空间效果 | | black_hand_rgb_3d.py | 黑手套 RGB 二维关键点和预览空间效果 | | depth_hand_3d.py | RGB-D 手部模块使用的真实 3D 计算辅助代码,不是独立节点 | | black_glove_hand.py | 黑手套关键点处理 | | ai_annotation.py | 声明并触发 AI 自动标注 | | annotation.py | 人工标注工作流节点 | | human_review.py | 人工审核门 | | ai_quality_review.py | 视频和标注自动质量检查 | | lerobot_export.py | LeRobot 导出节点 | | hdf5_export.py | HDF5 导出节点 | 增加工作流模块时,应同时检查: 1. 模块输入和输出类型; 2. Worker 是否能够执行; 3. 工作流编辑器是否正确显示; 4. 处理结果是否能在审核页面读取; 5. 导出模块是否包含新增结果。 ### 13.7 数据、缓存和导出 | 文件 | 作用 | | --- | --- | | app/localstore.py | 扫描和缓存项目、Episode、工作流及运行状态 | | app/storage.py | 文件上传、校验、保存和远程同步 | | app/remote_storage.py | 远程存储访问 | | app/media_groups.py | 组织 RGB、深度和传感器媒体组 | | app/media_cache.py | 服务端媒体缓存 | | app/browser_preview.py | 生成浏览器兼容的视频预览 | | app/artifact_resolver.py | 查找工作流处理结果 | | app/export_engine.py | 统一导出流程 | | app/lerobot_export.py | 生成 LeRobot 3.0 数据集 | | app/lerobot_v21.py | 生成和兼容 LeRobot 2.1 数据 | | app/hdf5_export.py | 生成 HDF5 数据集 | 源数据、后处理结果和导出副本需要分清: data/sessions/ # 项目源数据和合并后的后处理字段 data/tmp/ # 临时处理文件 浏览器 IndexedDB # 前端预览缓存,可以重新生成 导出压缩包 # 根据工作流设置生成的交付文件 不要把浏览器伪彩色深度图当作源数据保存。源深度仍然是原始深度码。 ### 13.8 修改功能时去哪里 | 需要修改的功能 | 前端位置 | 后端或处理位置 | | --- | --- | --- | | 首页统计 | dashboard.js | routes/dashboard.py | | 项目页面 | tasks.js | api/projects.py | | 上传和解压 | 项目页面 | routes/session.py | | 工作流编辑器 | workflow-studio/src/ | api/workflows.py | | 工作流自动运行 | 项目状态显示 | workflow_dispatch.py | | RGB 视频播放 | player.js | routes/video.py | | 播放帧同步 | player.js | routes/video.py | | 2D 手部关键点 | hand-overlay.js | 手部处理模块 | | 3D 手部空间 | player.js | processing/modules/*3d*.py | | 深度伪彩色 | depth-renderer.js | routes/video.py | | 手套传感器 | heatmap.js | glove_sensor.py | | 标注时间条 | annotations.js | routes/annotations.py | | AI 标注 | annotations.js | ai_annotation.py | | 视频审核 | app.js | routes/ingestion.py | | 单个和批量导出 | app.js | routes/export.py | | LeRobot 格式 | 导出按钮 | lerobot_export.py、lerobot_v21.py | | HDF5 格式 | 导出按钮 | hdf5_export.py | | 垃圾桶 | trash.html | routes/ingestion.py | | 用户管理 | users.js | api/users.py | ### 13.9 排查问题的顺序 遇到问题时,建议按照下面顺序检查: 1. 先确认问题出现在哪个页面; 2. 找到该页面对应的 JavaScript; 3. 在浏览器开发者工具中检查接口是否失败; 4. 根据接口地址找到对应的 Python 路由; 5. 如果是工作流任务,再检查 Worker 和处理模块; 6. 如果是显示不同步,再检查当前 Episode 的帧数、帧率和缓存; 7. 修改后运行测试,再打开真实数据验证。 ## 结尾 先上传,再处理;处理完成后检查;检查正确后再导出。