model_train_dm/系统功能调整改造说明.md
2026-07-27 17:51:49 +08:00

20 KiB
Raw Permalink Blame History

系统功能调整改造说明

1. 背景说明

根据最新数据库设计,以下业务表结构已经调整:

  • ai_dataset
  • ai_dataset_sample
  • ai_temp_file
  • ai_annotate_task
  • ai_annotate_task_sample

其中:

  • ai_temp_file 为新增表
  • ai_datasetai_annotate_taskai_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_idalgorithm_name
  • 当前业务很多地方基于 algorithm_id 生成 dataset_code 和目录路径
  • 新表 ai_dataset 中没有 algorithm_id 字段,说明当前“数据集绑定算法”的逻辑需要重新定义

2. ai_dataset_sample

table.sql 中目标表仍为 ai_dataset_sample,但字段结构已变化:

  • saved_filesize 长度缩短为 varchar(10)
  • 标注字段拆分为 rectanglepolygon

当前代码中模型仍为:

  • 模型名:AiDatasetSample
  • 表名:ai_dataset_sample

主要问题:

  • 当前模型使用单一字段 annotation_content
  • 现有标注、审核、合并逻辑均围绕 annotation_content 展开
  • 新表结构拆成 rectanglepolygon 后,需要重新设计样本标注存储格式和兼容逻辑

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_taskai_annotate_task_sample
  3. ai_temp_file 模块先落地,作为后续所有导入能力的统一入口

只有在这三个基础点明确后,后续 ZIP 解压导入、视频抽帧导入、样本入库、标注任务、训练任务才能稳定衔接。