model_train_dm/系统功能调整改造说明.md

761 lines
20 KiB
Markdown
Raw Normal View History

2026-07-27 17:51:49 +08:00
# 系统功能调整改造说明
## 1. 背景说明
根据最新数据库设计,以下业务表结构已经调整:
- `ai_dataset`
- `ai_dataset_sample`
- `ai_temp_file`
- `ai_annotate_task`
- `ai_annotate_task_sample`
其中:
- `ai_temp_file` 为新增表
- `ai_dataset`、`ai_annotate_task`、`ai_annotate_task_sample` 发生了表名和字段调整
- `ai_dataset_sample` 发生了字段调整
当前后端代码仍然主要基于旧模型、旧表名和本地文件系统目录进行数据集、样本、标注任务和训练样本处理,尚未与新的 `table.sql` 以及 MinIO 主存储模式完全对齐。因此需要先完成系统功能和代码结构层面的改造设计,再实施模型、接口和业务流程改造。
本说明文档用于梳理:
- 新旧表结构差异
- 现有代码现状
- 目标业务逻辑
- 需要调整的模块、接口和流程
- 推荐的实施顺序
---
## 2. 调整目标
本次改造的核心目标如下:
1.`backend/config/settings/table.sql` 为准,统一后端模型与数据库表结构
2. 引入 `ai_temp_file` 作为临时文件中转表,承接 ZIP、视频、图片、音频等原始文件上传
3. 将上传文件统一存入 MinIO对象存储成为主文件存储后端
4. `ai_dataset` 只负责数据集主记录管理
5. `ai_dataset_sample` 负责数据集样本记录,支持直接上传和从 `ai_temp_file` 导入
6. 根据数据集类型自动执行 ZIP 解压、视频抽帧等导入规则
7. 保持后续标注、训练准备、模型训练流程可继续使用数据集样本
---
## 3. 现状分析
### 3.1 当前数据库模型与 `table.sql` 不一致
当前后端模型定义位于:
- `backend/apps/core/models.py`
当前序列化器定义位于:
- `backend/apps/common/serializers.py`
当前数据集和样本相关视图位于:
- `backend/apps/datasets/views/dataset.py`
- `backend/apps/datasets/views/dataset_sample.py`
- `backend/apps/datasets/views/annotate_task.py`
- `backend/apps/datasets/views/annotate_task_sample.py`
当前 MinIO 通用接口位于:
- `backend/apps/common/minio_client.py`
- `backend/apps/common/views/minio_storage.py`
### 3.2 当前系统仍以本地文件系统为主
目前数据集主流程依赖本地文件目录 `FILESPACE_ROOT_PATH`
- 创建数据集时创建本地目录
- 上传数据时写入本地目录
- 样本读取时从本地文件读取并转 base64
- 删除样本时直接删除本地文件
- 标注合并时在本地生成 XML/JSON 标注文件
- 训练前样本准备时从本地目录复制样本和标注文件
虽然系统已经集成 MinIO 通用文件接口,但 MinIO 目前仍是旁路能力,尚未成为数据集与训练业务的默认存储主链路。
### 3.3 当前旧模型与新表结构的主要差异
#### 1. `ai_dataset`
`table.sql` 中的目标表为 `ai_dataset`,字段包括:
- `id`
- `dataset_code`
- `dataset_name`
- `description`
- `dataset_type`
- `features`
- `original_file_path`
- `original_file_name`
- `dataset_path`
- `dataset_count`
- `dataset_labels`
- `status`
- `creator`
- `create_time`
- `custom1`
- `custom2`
- `custom3`
当前代码中实际模型为:
- 模型名:`AiDataset`
- 表名:`ai_algorithm_dataset`
主要问题:
- 表名不一致
- 当前模型多出 `algorithm_id`、`algorithm_name`
- 当前业务很多地方基于 `algorithm_id` 生成 `dataset_code` 和目录路径
- 新表 `ai_dataset` 中没有 `algorithm_id` 字段,说明当前“数据集绑定算法”的逻辑需要重新定义
#### 2. `ai_dataset_sample`
`table.sql` 中目标表仍为 `ai_dataset_sample`,但字段结构已变化:
- `saved_filesize` 长度缩短为 `varchar(10)`
- 标注字段拆分为 `rectangle``polygon`
当前代码中模型仍为:
- 模型名:`AiDatasetSample`
- 表名:`ai_dataset_sample`
主要问题:
- 当前模型使用单一字段 `annotation_content`
- 现有标注、审核、合并逻辑均围绕 `annotation_content` 展开
- 新表结构拆成 `rectangle`、`polygon` 后,需要重新设计样本标注存储格式和兼容逻辑
#### 3. `ai_temp_file`
`table.sql` 中新增:
- 表名:`ai_temp_file`
字段包括:
- `id`
- `original_path`
- `original_name`
- `original_type`
- `bucket_name`
- `object_name`
- `object_size`
- `content_type`
- `status`
- `create_time`
- `custom1`
- `custom2`
- `custom3`
当前代码现状:
- 无对应 Django 模型
- 无对应序列化器
- 无对应业务接口
- 无与数据集导入流程的集成
也就是说,`ai_temp_file` 目前仅存在于 SQL 设计中,代码层完全缺失。
#### 4. `ai_annotate_task`
`table.sql` 中目标表为 `ai_annotate_task`,字段包括:
- `id`
- `algorithm_id`
- `task_name`
- `annotate_type`
- `description`
- `dataset_id`
- `task_count`
- `task_range`
- `task_type`
- `region_type`
- `labels`
- `work_type`
- `task_team`
- `task_leader`
- `status`
- `creator`
- `create_time`
- `custom1`
- `custom2`
- `custom3`
当前代码中实际模型为:
- 模型名:`AiDatasetTask`
- 表名:`ai_dataset_task`
主要问题:
- 表名不一致
- 当前模型承载的是标注任务业务,语义上与新表一致
- 当前模型仍映射旧表 `ai_dataset_task`
- 新表改为 `ai_annotate_task`
- `dataset_id` 仍然保留,说明原先“单数据集标注任务”的业务处理逻辑不变
这意味着标注任务主表的核心业务逻辑可以保持不变,主要改造点是表名映射与字段对齐。
- 创建任务时继续保存单一 `dataset_id`
- 分配样本时继续按所属数据集筛选样本
- 统计任务样本数时继续按单数据集汇总
#### 5. `ai_annotate_task_sample`
`table.sql` 中目标表为 `ai_annotate_task_sample`,字段与当前样本任务表接近,主要变化是表名调整。
当前代码中实际模型为:
- 模型名:`AiDatasetTaskSample`
- 表名:`ai_dataset_task_sample`
主要问题:
- 表名不一致
-`ai_annotate_task` 关联的上游表名也已变化
- 现有接口、序列化器、业务逻辑均使用旧模型名和旧表名
---
## 4. 新业务逻辑梳理
### 4.1 `ai_temp_file` 临时文件管理
目标定位:
- 作为前端上传 ZIP、视频、图片、音频等原始文件的统一入口
- 所有临时文件先上传到 MinIO 的 `tempfile`
- 上传成功后,在 `ai_temp_file` 表中记录文件元数据
- 数据集导入时,优先从 `ai_temp_file` 选择文件来源
建议的文件类型分类:
- `01` 图片
- `02` 视频
- `03` 音频
- `04` ZIP 压缩包
- `05` 文本
- `99` 其他
建议状态值:
- `01` 已上传
- `02` 已导入数据集
- `03` 已失效
- `09` 已删除
### 4.2 `ai_dataset` 数据集主表
目标定位:
- 只记录数据集定义信息
- 包括名称、类型、标签、样本数、状态等主数据
- 不直接承担临时文件存储职责
页面能力:
- 新增数据集
- 修改数据集
- 删除数据集
- 查询数据集列表
- 查看数据集详情
关键变化:
- 当前代码中“创建数据集即创建本地目录”的逻辑需要改造
- 改为 MinIO 主存储,`dataset_path` 适合作为 MinIO 逻辑前缀,而不是本地磁盘目录
### 4.3 `ai_dataset_sample` 数据集样本表
目标定位:
- 记录真正进入数据集的样本文件
- 文件实际存储于 MinIO 的 `dataset`
- 每个样本对应一个 MinIO 对象
样本来源有两类:
1. 页面直接上传图片、视频、音频
2.`ai_temp_file` 中选择文件导入
导入规则:
- 如果数据集要求是图片类型,而临时文件是 ZIP则自动解压 ZIP 中符合类型的文件后逐个导入
- 如果数据集要求是图片类型,而临时文件是视频,则根据抽帧规则提取图片后导入
- 如果数据集要求是视频类型,则视频原文件可以直接进入 `ai_dataset_sample`
- 如果数据集要求是音频类型,则只导入音频类文件
### 4.4 `ai_annotate_task` / `ai_annotate_task_sample`
根据现有代码,当前这两张表实际上承载的是标注任务与标注样本任务。
当前逻辑包括:
- 创建标注任务
- 分配样本给执行人
- 自动标注
- 人工标注
- 提交审核
- 审核通过/驳回
- 合并标注结果回主样本表
新的表结构已经明确恢复为原先的标注任务设计,因此任务与数据集的关系保持为单数据集模式:
- `ai_annotate_task.dataset_id`:记录本次标注任务所属的数据集
- `ai_annotate_task_sample.sample_id`:记录当前任务样本对应的主样本记录
这样可以继续保持以下业务能力:
- 创建任务时按数据集分配样本
- 合并标注结果时定位主数据集样本
- 统计任务所属数据集样本数量
确认采用以下方案调整:
1. `ai_annotate_task.dataset_id` 保存本次标注任务所属数据集
2. `ai_annotate_task_sample.sample_id` 保存当前任务样本对应的主样本
3. 通过 `ai_annotate_task.dataset_id -> ai_dataset.id` 可以明确任务属于哪个数据集
4. 通过 `ai_annotate_task_sample.sample_id -> ai_dataset_sample.id` 可以明确任务样本对应哪条主样本记录
5. 原先“单数据集标注任务”的业务处理逻辑保持不变,主要进行表名和模型映射调整
---
## 5. 目标功能改造方案
### 5.1 临时文件模块改造
新增模块名称建议:
- 临时文件管理
建议新增模型:
- `AiTempFile`
建议新增接口:
- 临时文件上传
- 临时文件列表查询
- 临时文件详情读取
- 临时文件修改
- 临时文件删除
- 临时文件下载
- 临时文件预览
建议接口示例:
- `POST /server/tempfile/upload/`
- `GET /server/tempfile/list/`
- `GET /server/tempfile/read/`
- `PUT /server/tempfile/update/`
- `DELETE /server/tempfile/delete/`
- `GET /server/tempfile/download/`
- `GET /server/tempfile/preview/`
处理流程建议:
1. 前端上传文件
2. 后端识别文件类型
3. 上传到 MinIO `tempfile`
4. 记录 `ai_temp_file`
5. 返回文件 ID、文件名、桶名、对象名、预览地址
### 5.2 数据集模块改造
目标接口保留并扩展:
- 数据集新增
- 数据集修改
- 数据集删除
- 数据集列表查询
- 数据集详情查询
建议废弃或重构当前接口中的以下逻辑:
-`createDataset` 中按算法创建本地目录
-`uploadDatasetFile` 中直接把文件落到本地目录
-`generateDatasetImages` 中依赖本地视频目录做抽帧
建议新增业务接口:
- 从临时文件导入到数据集
- 直接上传文件到数据集
建议接口示例:
- `POST /server/dataset/importFromTempFile/`
- `POST /server/dataset/uploadSamples/`
### 5.3 数据集样本模块改造
建议新增或调整能力:
- 样本列表查询
- 样本详情查询
- 样本预览
- 样本删除
- 样本批量导入
- 样本批量抽帧导入
- 样本批量解压导入
#### 样本导入统一规则
建议抽象为统一导入服务:
- `TempFileImportService`
- `DatasetSampleImportService`
建议流程:
1. 根据 `dataset_id` 读取数据集定义
2. 根据 `temp_file_id` 读取临时文件元数据
3. 按数据集类型与临时文件类型执行对应导入策略
4. 将结果文件上传到 MinIO `dataset`
5. 逐条写入 `ai_dataset_sample`
6. 更新 `ai_dataset.dataset_count`
7.`ai_temp_file.status` 更新为已导入
#### 类型转换规则建议
##### 规则 A图片数据集 + ZIP 文件
- 解压 ZIP
- 仅提取图片类型文件
- 上传到 `dataset`
- 批量写入 `ai_dataset_sample`
##### 规则 B图片数据集 + 视频文件
- 根据抽帧规则提取图片
- 上传图片到 `dataset`
- 批量写入 `ai_dataset_sample`
##### 规则 C视频数据集 + 视频文件
- 视频原文件直接上传到 `dataset`
- 写入 `ai_dataset_sample`
##### 规则 D音频数据集 + ZIP 文件
- 解压 ZIP
- 筛选音频文件
- 上传到 `dataset`
- 批量写入 `ai_dataset_sample`
##### 规则 E图片数据集 + 直接上传图片
- 文件直接上传到 `dataset`
- 写入 `ai_dataset_sample`
### 5.4 标注任务模块改造
当前标注任务能力本身可以保留,但需进行表结构和字段适配。
建议改造点:
-`AiDatasetTask` 调整为映射 `ai_annotate_task`
-`AiDatasetTaskSample` 调整为映射 `ai_annotate_task_sample`
- 所有任务相关接口、序列化器、统计逻辑同步修改
- 保持当前单 `dataset_id` 的标注任务处理逻辑
- 按新表结构对齐字段顺序和表名,不额外引入新的任务关联复杂度
特别说明:
- 创建任务时继续选择单一 `dataset_id`
- 分配样本时,继续从该数据集下筛选样本
- 合并标注结果时,继续通过 `sample_id` 回写到主样本
- 任务详情、统计、筛选页面继续按单数据集任务展示
### 5.5 训练样本准备模块改造
这是本次需求中容易被忽略但必须同步改造的部分。
当前训练准备逻辑默认从本地目录读取图片、标注文件和 mask 文件。如果 `ai_dataset_sample` 的真实文件改存 MinIO则以下功能都会受到影响
- `prepare_algorithm_train_dataset`
- 检测任务生成 YOLO 标签
- 分割任务生成 mask、txt、COCO JSON
- 训练前复制样本到 `train/val` 目录
人工核实确认新增一层训练样本读取服务:
- 如果样本存本地,则直接读取本地文件
- 如果样本存 MinIO则先下载到训练工作目录或使用本地缓存目录
建议实现:
- `DatasetSampleStorageService`
- `TrainingDatasetMaterializeService`
---
## 6. 推荐的数据字段调整建议
### 6.1 `ai_temp_file.original_type`
建议统一存枚举值,而不是自由文本,便于后续导入规则判断。
### 6.2 `ai_dataset.dataset_path`
建议定义为 MinIO 逻辑目录前缀,例如:
- `datasets/{dataset_id}/`
而不再直接绑定本地绝对目录。
### 6.3 `ai_dataset_sample.saved_path`
当前字段语义是服务器磁盘路径,改造后建议定义为:
- MinIO 对象逻辑前缀
- 或对象完整目录前缀
例如:
- `datasets/{dataset_id}/images`
### 6.4 `ai_dataset_sample.saved_filename`
建议保留,作为对象文件名。
### 6.5 `ai_dataset_sample.rectangle` / `polygon`
由于 `table.sql` 已将标注内容拆分为两个字段,建议后续按标注类型分别存储:
- 目标检测标注写入 `rectangle`
- 多边形标注写入 `polygon`
如果仍需兼容当前前端和自动标注逻辑,可以在服务层临时做统一转换,避免前端一次性改动过大。
---
## 7. 受影响模块清单
### 7.1 数据模型层
需要调整或新增:
- `backend/apps/core/models.py`
- 新增 `AiTempFile`
- 调整 `AiDataset` 映射
- 调整 `AiDatasetSample` 字段
- 调整 `AiDatasetTask` 映射
- 调整 `AiDatasetTaskSample` 映射
-`AiDatasetTask` 的表映射从旧表调整到 `ai_annotate_task`
-`AiDatasetTaskSample` 的表映射从旧表调整到 `ai_annotate_task_sample`
### 7.2 序列化器层
需要调整:
- `backend/apps/common/serializers.py`
建议不要继续全部使用 `fields = "__all__"`,应增加:
- 字段级校验
- 类型校验
- 只读字段控制
- 导入规则参数校验
### 7.3 视图层
重点受影响文件:
- `backend/apps/datasets/views/dataset.py`
- `backend/apps/datasets/views/dataset_sample.py`
- `backend/apps/datasets/views/annotate_task.py`
- `backend/apps/datasets/views/annotate_task_sample.py`
- `backend/apps/training/views/algorithm_trainrecords.py`
### 7.4 MinIO 能力层
现有通用能力可复用:
- 单文件上传
- 批量上传
- ZIP 解压入库
- 视频抽帧入库
- 下载
- 预览
- 预签名地址
但应注意:
- 现有 MinIO 接口是通用文件接口
- 业务层仍需新增“文件上传后写业务表”的封装接口
---
## 8. 推荐接口改造清单
### 8.1 临时文件接口
- `POST /server/tempfile/upload/`
- `GET /server/tempfile/list/`
- `GET /server/tempfile/read/`
- `PUT /server/tempfile/update/`
- `DELETE /server/tempfile/delete/`
- `GET /server/tempfile/download/`
- `GET /server/tempfile/preview/`
### 8.2 数据集接口
- `POST /server/dataset/create/`
- `PUT /server/dataset/update/`
- `DELETE /server/dataset/delete/`
- `GET /server/dataset/list/`
- `GET /server/dataset/read/`
- `POST /server/dataset/uploadSamples/`
- `POST /server/dataset/importFromTempFile/`
### 8.3 数据集样本接口
- `GET /server/dataset/sample/list/`
- `GET /server/dataset/sample/read/`
- `DELETE /server/dataset/sample/delete/`
- `GET /server/dataset/sample/preview/`
- `GET /server/dataset/sample/download/`
### 8.4 任务接口
- `POST /server/annotateTask/create/`
- `GET /server/annotateTask/list/`
- `GET /server/annotateTask/read/`
- `PUT /server/annotateTask/update/`
- `DELETE /server/annotateTask/delete/`
- `POST /server/annotateTask/assignSamples/`
- `POST /server/annotateTask/autoAnnotate/`
- `POST /server/annotateTask/submitAudit/`
- `POST /server/annotateTask/audit/`
- `POST /server/annotateTask/mergeToDataset/`
任务接口改造时需要特别支持:
- 创建任务时提交单一 `dataset_id`
- 查询任务详情时返回所属数据集信息
- 任务样本列表继续按任务和样本状态过滤,无需额外支持跨数据集来源拆分
---
## 9. 推荐实施顺序
### 第一阶段:表结构对齐
目标:
-`table.sql` 调整模型和迁移脚本
- 补齐 `AiTempFile`
- 完成序列化器基础适配
### 第二阶段:临时文件模块落地
目标:
- 完成 `ai_temp_file` CRUD、下载、预览
- 文件统一上传到 MinIO `tempfile`
### 第三阶段:数据集导入流程改造
目标:
- 支持直接上传到数据集
- 支持从 `ai_temp_file` 导入到 `ai_dataset_sample`
- 支持 ZIP 解压导入
- 支持视频抽帧导入
### 第四阶段:标注任务适配
目标:
- 适配 `ai_annotate_task` / `ai_annotate_task_sample`
- 调整样本分配、审核、合并逻辑
- 兼容 `rectangle` / `polygon`
### 第五阶段:训练准备适配
目标:
- 训练前样本准备流程改为支持 MinIO 数据源
- 保证现有训练功能不因文件存储切换而失效
---
## 10. 风险与注意事项
### 10.1 最大风险:表结构变了,但业务主流程仍基于旧字段
尤其是以下两个点影响最大:
- `ai_dataset` 不再包含 `algorithm_id`
- 标注任务表从旧表名切换为 `ai_annotate_task`
如果不先明确新的业务关联关系,直接改模型会导致:
- 数据集创建逻辑失效
- 标注任务创建与样本分配逻辑失效
- 标注合并逻辑失效
### 10.2 标注任务表名切换带来的兼容风险
标注任务相关模型、接口和统计逻辑当前都绑定旧表名,切换到新表后需要同步适配:
- 创建任务时的数据写入表
- 任务样本分配与读取
- 审核状态统计
- 标注结果合并回主样本
- 前端页面的任务详情与列表查询
### 10.3 文件存储切换后,训练模块必须同步改造
如果只改上传链路,不改训练样本准备链路,会导致:
- 数据集页面可正常上传
- 但训练启动时找不到样本文件
### 10.4 标注字段拆分后,前端与自动标注逻辑也要同步
当前系统大量逻辑直接读写 `annotation_content`,而新表结构改为:
- `rectangle`
- `polygon`
需要提前定义兼容策略,避免标注页面与自动标注接口全部失效。
---
## 11. 最终结论
本次需求不是简单新增几个接口,而是一次涉及以下四个层面的系统级改造:
- 数据库表结构重构
- 文件存储模式切换为 MinIO 主存储
- 数据集导入链路重构
- 标注与训练链路适配
- 标注任务表结构与命名对齐
建议按“表结构对齐 -> 临时文件模块 -> 数据集导入 -> 标注任务适配 -> 训练准备适配”的顺序分阶段实施。
本次修正确认后,标注任务链路的关系已经清晰:
1. `ai_annotate_task.dataset_id` 记录本次标注任务所属数据集
2. `ai_annotate_task_sample.sample_id` 记录对应的主样本记录
3. 标注任务仍然按单数据集业务逻辑处理
这样可以保持原先标注任务、样本分配、审核和合并回库逻辑不变。
当前最优先要做的事情有三项:
1. 明确 `ai_dataset` 是否还需要与算法关联
2. 将标注任务模型和接口从旧表映射调整到 `ai_annotate_task``ai_annotate_task_sample`
3.`ai_temp_file` 模块先落地,作为后续所有导入能力的统一入口
只有在这三个基础点明确后,后续 ZIP 解压导入、视频抽帧导入、样本入库、标注任务、训练任务才能稳定衔接。