# 铁路无人机智能巡检平台模型可视化管理与测试工作台设计

## 1. 文档信息

| 项目 | 内容 |
| --- | --- |
| 文档名称 | 模型可视化管理与测试工作台设计 |
| 适用系统 | 铁路无人机智能巡检平台 |
| 所属业务域 | 样本与模型 |
| 设计范围 | 模型台账、版本与制品、参数方案、样本测试、结果评估、发布审计 |
| 前端入口 | `/algorithm-assets/models` |
| 主要用户 | 算法工程师、数据管理员、测试人员、发布审批人、系统管理员 |
| 设计状态 | 实施基线 |

## 2. 建设目标

模型管理不能只显示版本编号和离线指标，需要形成贯穿“模型登记、参数管理、样本验证、结果评估、版本发布、运行追溯”的可视化工作台。建设目标如下：

1. 统一管理视觉检测、图像分割、红外测温、点云分析、变化检测等模型组和模型版本。
2. 使用参数定义驱动前端配置表单，兼容不同模型类型的公共参数与专用参数。
3. 支持从样本库选择数据，也支持上传本地数据进行单样本或批量测试。
4. 对图片、视频、红外、点云和栅格数据提供与数据类型匹配的结果查看能力。
5. 支持模型版本、参数方案和样本集合之间的横向比较，并生成可复核的评估结论。
6. 测试过程与生产推理资源隔离，避免批量测试影响在线巡检任务。
7. 记录模型制品、参数快照、输入校验和、运行环境、处理日志及结果，保证全链路可追溯。
8. 将模型测试结论作为模型发布、回滚和样本回流的依据。

## 3. 设计原则

### 3.1 模型组与版本分离

模型组代表稳定的业务能力，例如“轨道异物检测”或“桥梁裂缝分割”；模型版本代表该能力的具体实现。参数方案、测试任务、发布记录均绑定模型组和明确版本，禁止仅用模型名称关联运行结果。

### 3.2 配置不可变与分层覆盖

已用于测试或发布的参数方案不可原位修改。修改配置时创建新修订，并保留差异和来源。参数按以下优先级合并：

```text
平台安全边界
  > 测试任务临时参数
  > 场景参数方案
  > 模型版本默认参数
  > 模型组默认参数
```

平台安全边界始终生效，例如最大批量、最大视频时长、允许的置信度范围和推理超时上限。

### 3.3 测试与生产隔离

模型测试使用独立任务队列、并发配额和计算资源池。生产版本、生产参数和在线服务流量不能被测试操作直接改变。测试通过后必须经过发布审批才能进入生产环境。

### 3.4 输入来源统一抽象

样本库选择和本地上传只是输入来源不同，进入测试任务后统一转换为测试输入记录。后续校验、预处理、推理、后处理、指标计算和结果保存采用同一流程。

### 3.5 上传数据默认临时保存

本地上传文件默认进入隔离的临时对象存储空间，到期自动清理，不自动进入正式样本库。只有具备数据管理权限的用户明确提交归档并完成质量确认后，文件才可转为候选样本。

### 3.6 结果必须可复现

每次测试固化以下信息：

- 模型组、版本、制品地址与 SHA-256 哈希。
- 完整参数快照和参数定义版本。
- 输入文件或样本版本、内容校验和及元数据。
- 预处理、后处理和指标计算组件版本。
- 容器镜像、运行时、设备型号及驱动信息。
- 开始时间、结束时间、耗时、日志和错误码。

## 4. 功能边界

### 4.1 纳入范围

- 模型组台账和运行状态查看。
- 模型版本、模型制品及兼容信息管理。
- 参数定义、参数方案、校验、复制、对比和启用。
- 样本库检索、筛选、选择和测试集暂存。
- 本地文件上传、元数据补充、输入校验和临时保存。
- 单样本快速测试、批量回归、版本对比和参数对比。
- 多模态结果可视化、指标统计、失败分析和报告导出。
- 测试记录、发布申请、审批、灰度、回滚和审计。
- 测试结果转候选样本、误报漏报标记和标注任务创建。

### 4.2 不纳入范围

- 训练任务编排、超参数搜索和分布式训练平台。
- 原始数据标注工具的像素级编辑能力。
- 无人机航线规划和飞控任务下发。
- 告警研判、工单处置等业务闭环操作。

以上能力通过现有训练平台、标注队列、巡检任务、告警中心和工单中心关联进入。

## 5. 用户角色与权限

| 角色 | 查看模型 | 编辑参数草稿 | 运行测试 | 上传数据 | 归档样本 | 申请发布 | 审批发布 | 回滚 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 算法工程师 | 是 | 是 | 是 | 是 | 申请 | 是 | 否 | 否 |
| 数据管理员 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 |
| 测试人员 | 是 | 否 | 是 | 是 | 申请 | 否 | 否 | 否 |
| 发布审批人 | 是 | 只读 | 是 | 否 | 否 | 否 | 是 | 是 |
| 系统管理员 | 是 | 边界配置 | 运维验证 | 是 | 是 | 否 | 应急 | 应急 |
| 业务查看人员 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |

权限控制同时作用于页面入口、按钮、接口、模型组和数据范围。涉敏线路、桥隧和电力设备样本按组织、线路和区段进行行级授权。

## 6. 总体架构

```mermaid
flowchart LR
    U["模型管理用户"] --> FE["Vue 3 模型工作台"]
    FE --> GW["Spring Boot 业务 API"]
    GW --> DB["PostgreSQL / PostGIS"]
    GW --> R["Redis 状态与配额"]
    GW --> S3["MinIO / S3 对象存储"]
    GW --> K["Kafka 测试事件"]
    K --> O["测试任务编排器"]
    O --> V["FastAPI 视觉推理服务"]
    O --> P["FastAPI 点云与栅格分析服务"]
    O --> M["指标计算服务"]
    V --> S3
    P --> S3
    M --> DB
    M --> S3
    GW --> SSE["SSE 状态事件"]
    SSE --> FE
```

### 6.1 分层职责

| 层级 | 职责 |
| --- | --- |
| 前端工作台 | 模型导航、动态参数表单、输入选择、进度查看、结果可视化、差异比较 |
| 业务 API | 权限、模型元数据、参数修订、上传会话、任务控制、审计和查询聚合 |
| 测试编排器 | 输入展开、资源估算、队列调度、步骤状态、重试、取消和结果汇总 |
| 推理服务 | 预处理、模型加载、推理、后处理、可视化产物生成 |
| 指标服务 | 真值匹配、指标计算、基线比较、验收规则判定 |
| 数据层 | 结构化元数据、状态缓存、事件消息、模型与样本对象存储 |

### 6.2 事件主题

| 主题 | 生产方 | 消费方 | 用途 |
| --- | --- | --- | --- |
| `model.test.requested` | 业务 API | 测试编排器 | 创建测试任务 |
| `model.test.input.ready` | 测试编排器 | 推理服务 | 单个输入就绪 |
| `model.test.result.ready` | 推理服务 | 指标服务 | 推理结果完成 |
| `model.test.item.failed` | 推理服务 | 编排器 | 输入处理失败 |
| `model.test.completed` | 指标服务 | 业务 API | 测试汇总完成 |
| `model.release.requested` | 业务 API | 发布服务 | 发起版本发布 |
| `model.release.changed` | 发布服务 | 模型服务、审计服务 | 灰度比例或版本变更 |

事件必须包含 `eventId`、`traceId`、`testTaskId`、`occurredAt` 和 `schemaVersion`，消费者按 `eventId` 实现幂等处理。

## 7. 信息架构与路由

“样本与模型”一级页面保留已有样本管理能力，并在“模型管理”二级入口内建立六个稳定页面。

| 页面 | 路由 | 主要内容 |
| --- | --- | --- |
| 模型总览 | `/algorithm-assets/models` | 模型组清单、生产版本、健康状态、待办和近期测试 |
| 模型详情 | `/algorithm-assets/models/:modelGroupId/overview` | 能力说明、适用场景、输入输出、运行统计 |
| 版本与制品 | `/algorithm-assets/models/:modelGroupId/versions` | 版本、制品、指标、兼容性、生命周期 |
| 参数方案 | `/algorithm-assets/models/:modelGroupId/parameters` | 参数定义、方案修订、差异、校验和启用范围 |
| 测试工作台 | `/algorithm-assets/models/:modelGroupId/test` | 样本选择、上传、任务配置、运行过程和单次结果 |
| 评估记录 | `/algorithm-assets/models/:modelGroupId/evaluations` | 批量测试、版本对比、指标趋势、失败样本 |
| 发布记录 | `/algorithm-assets/models/:modelGroupId/releases` | 发布申请、审批、灰度、回滚和审计 |

页面 URL 应保存模型组、二级页面、当前测试任务、选中结果项等稳定状态；高频筛选条件保存在会话状态中，刷新后恢复。

## 8. 模型总览设计

### 8.1 页面结构

1. 顶部筛选栏：模型类型、业务场景、生命周期、服务健康状态、责任团队和关键词。
2. 指标区：模型组数量、生产版本数量、异常服务数量、待评估任务、待审批发布。
3. 模型清单：采用紧凑表格，支持固定列、排序、分页和列配置。
4. 右侧详情抽屉：不离开列表查看模型摘要、最近测试、运行趋势和快捷入口。

### 8.2 模型清单字段

| 字段 | 展示规则 |
| --- | --- |
| 模型组 | 名称、编码、模型类型 |
| 业务场景 | 轨道、桥梁、隧道、电力、防洪等，可多值显示 |
| 生产版本 | 版本号和发布时间，无生产版本时显示“未发布” |
| 服务状态 | 正常、降级、异常、未部署 |
| 主要指标 | 按模型类型选择 2 至 3 个核心指标 |
| 近 24 小时调用 | 调用量、成功率、P95 耗时 |
| 最近评估 | 测试时间、结论、相对基线变化 |
| 责任人 | 算法负责人和运维责任人 |
| 操作 | 查看、进入测试、查看版本；更多操作放入菜单 |

状态不能只依赖颜色，必须同时显示图标和文字。模型指标口径由模型组配置，避免将检测、分割、测温和点云模型使用同一指标排序。

## 9. 模型详情设计

模型详情顶部保留固定上下文栏，包含模型组名称、类型、生产版本、服务状态、责任团队和最近更新时间。切换二级页面时上下文不丢失。

### 9.1 能力概览

- 模型能力说明、适用设备、适用线路和场景。
- 支持的数据模态、文件格式、分辨率、坐标系和元数据要求。
- 输出类别、类别编码、严重度映射及置信度说明。
- 当前生产版本、候选版本和历史版本关系。
- 近 7 天与近 30 天调用量、成功率、耗时和告警命中趋势。
- 最近一次批量评估结果及未解决问题。

### 9.2 输入输出契约

输入契约以结构化形式维护，包括资源 URL、数据模态、场景、ROI、坐标信息、任务参数和扩展元数据。输出契约至少包含：

- 模型组、模型版本、制品哈希和参数方案修订号。
- 检测框、分割掩码、热点、点云测量或变化区域。
- 类别、置信度、阈值、空间位置和证据资源。
- 预处理耗时、推理耗时、后处理耗时和总耗时。
- 运行状态、错误码、警告及运行环境。

## 10. 版本与制品管理

### 10.1 版本生命周期

```mermaid
stateDiagram-v2
    [*] --> Draft: 登记版本
    Draft --> Validating: 制品校验
    Validating --> Candidate: 校验通过
    Validating --> Invalid: 校验失败
    Candidate --> Testing: 进入评估
    Testing --> Approved: 达到发布门槛
    Testing --> Candidate: 继续修订参数
    Approved --> Gray: 开始灰度
    Gray --> Production: 灰度通过
    Gray --> Candidate: 灰度撤回
    Production --> Retired: 被新版本替代
    Production --> RolledBack: 紧急回滚
    Invalid --> Draft: 修复制品
```

### 10.2 版本字段

| 分组 | 字段 |
| --- | --- |
| 基础信息 | 版本号、版本名称、来源分支、提交号、责任人、创建时间 |
| 制品信息 | ONNX/TensorRT/PyTorch 类型、对象地址、哈希、大小、签名 |
| 运行要求 | Python、CUDA、TensorRT、ONNX Runtime、显存、设备架构 |
| 数据契约 | 输入模态、形状、批量限制、类别字典、输出结构版本 |
| 训练摘要 | 数据集版本、样本量、切分方式、训练参数摘要 |
| 离线指标 | 精确率、召回率、F1、mAP、mIoU 或模型专用指标 |
| 生命周期 | 草稿、候选、已批准、灰度、生产、退役、无效 |

### 10.3 制品校验

登记版本后自动执行：

1. 对象存在性、大小和 SHA-256 校验。
2. 文件签名与安全扫描。
3. 模型输入输出名称、形状和数据类型解析。
4. 类别字典与模型组输出契约一致性检查。
5. 运行时兼容性和最小显存估算。
6. 使用系统校验集进行冒烟测试。
7. 记录校验报告，失败项必须可定位到字段或文件。

## 11. 参数配置设计

### 11.1 参数定义驱动

每个模型版本关联一份参数定义，后端使用 JSON Schema 描述数据类型、范围、枚举、默认值、必填项和条件依赖，使用 UI Schema 描述控件、分组、顺序、单位和帮助信息。前端根据定义生成表单，避免为每个模型复制独立页面。

控件使用规则：

- 布尔值使用开关。
- 枚举使用选择器或分段控件。
- 连续范围使用滑块并保留精确数值输入框。
- 整数使用步进器。
- 颜色和类别映射使用色块选择器。
- ROI 使用图像或地图交互绘制，同时保留坐标编辑。
- 高级模式提供结构化 JSON 编辑器，但保存前仍执行同一参数校验。

### 11.2 参数方案分层

| 层级 | 用途 | 变更方式 |
| --- | --- | --- |
| 模型组默认 | 同一能力的通用缺省值 | 管理员维护，低频变更 |
| 版本默认 | 适配特定模型制品 | 随模型版本登记 |
| 场景方案 | 按线路、设备、天气或缺陷类型优化 | 创建可复用修订 |
| 测试临时值 | 当前测试任务内调整 | 不影响已保存方案 |
| 生产生效值 | 生产部署实际使用的不可变快照 | 发布流程生成 |

参数方案支持新建、复制、另存修订、差异比较、设为场景默认、停用和回滚。删除只允许作用于未被任何任务引用的草稿。

### 11.3 公共参数

| 参数 | 类型 | 约束与用途 |
| --- | --- | --- |
| `confidenceThreshold` | 小数 | 置信度阈值，范围由模型定义限制 |
| `nmsIouThreshold` | 小数 | 检测框抑制阈值，仅检测模型显示 |
| `maxDetections` | 整数 | 单输入最大结果数 |
| `inputSize` | 枚举或尺寸 | 模型输入宽高，必须满足制品约束 |
| `batchSize` | 整数 | 测试批量，受显存和平台配额限制 |
| `precision` | 枚举 | FP32、FP16 或 INT8，按制品能力显示 |
| `devicePool` | 枚举 | 测试资源池，不允许直接指定物理设备 |
| `timeoutMs` | 整数 | 单输入超时，不得超过平台上限 |
| `classWhitelist` | 多选 | 仅输出指定类别 |
| `roi` | 空间对象 | 仅在指定区域执行推理或保留结果 |
| `saveIntermediate` | 布尔 | 保存预处理和后处理产物，受存储配额限制 |

### 11.4 模型专用参数

| 模型类型 | 参数组 | 主要参数 |
| --- | --- | --- |
| 目标检测 | 切片、融合、过滤 | 切片尺寸、重叠率、边缘过滤、类别阈值、NMS 类型 |
| 图像分割 | 掩码、连通域、轮廓 | 掩码阈值、最小面积、孔洞填充、轮廓简化、像素到实际尺寸比例 |
| 视频分析 | 抽帧、跟踪、聚合 | 抽帧频率、关键帧间隔、跟踪器、轨迹时长、重复目标合并窗口 |
| 红外测温 | 辐射参数、温差规则 | 发射率、环境温度、反射温度、距离、湿度、热点阈值、相对温差阈值 |
| 点云分析 | 滤波、配准、分割 | 体素尺寸、邻域点数、标准差倍数、ICP 距离、迭代次数、误差阈值 |
| 栅格变化检测 | 对齐、差分、区域过滤 | 目标分辨率、配准精度、变化阈值、最小区域、形态学核、基线版本 |

### 11.5 参数联动与校验

- 切片关闭时隐藏切片尺寸和重叠率。
- INT8 仅在制品包含量化校准信息时可选。
- 红外绝对温度判断需要辐射测温元数据；缺少元数据时只能使用相对温差模式。
- 点云 ICP 最大距离必须大于体素尺寸。
- 批量与版本对比任务的组合数量超过配额时阻止启动，并给出拆分建议。
- 服务端重新执行全部校验，不能信任前端校验结果。

### 11.6 参数差异视图

差异视图按“新增、修改、删除、继承”分类展示，显示原值、新值、单位、影响范围和修改原因。涉及置信度、测温补偿、点云误差阈值等高风险参数时，需要填写变更依据并由第二人复核。

## 12. 测试工作台设计

### 12.1 测试类型

| 类型 | 输入规模 | 对比维度 | 适用目的 |
| --- | --- | --- | --- |
| 单样本快速测试 | 1 个输入 | 单版本、单参数方案 | 调整参数和检查具体结果 |
| 批量回归 | 一个样本集合 | 单版本、单参数方案 | 验证整体指标与失败率 |
| 版本对比 | 一个样本集合 | 2 至 4 个版本 | 判断候选版本相对基线的变化 |
| 参数对比 | 一个样本集合 | 同版本的 2 至 6 个参数方案 | 选择场景参数 |
| 兼容性检查 | 系统校验集 | 多运行时或精度模式 | 检查制品和部署环境 |

版本与参数组合形成测试矩阵。前端实时计算“输入数 × 版本数 × 参数方案数”，显示预计推理次数、时间和资源消耗，超过平台阈值时禁止提交。

### 12.2 页面布局

工作台使用稳定的工具型布局：

```text
模型上下文栏：模型组 | 版本 | 测试类型 | 参数方案 | 保存草稿 | 启动测试
┌────────────────┬──────────────────────────────┬──────────────────┐
│ 输入区          │ 主查看区                     │ 参数与结果区       │
│ 样本库 / 上传   │ 原始数据、真值、预测结果     │ 参数、结果、指标   │
│ 筛选与输入清单  │ 视图切换和叠加控制           │ 警告、单项操作     │
├────────────────┴──────────────────────────────┴──────────────────┤
│ 可折叠任务区：步骤进度、队列、日志、失败输入、资源用量             │
└───────────────────────────────────────────────────────────────────┘
```

- 左侧输入区桌面宽度建议为 280 至 340 像素，可折叠。
- 右侧参数与结果区宽度建议为 360 至 420 像素，可按当前阶段切换内容。
- 中间主查看区自适应，并为图像、视频、点云和栅格设置稳定最小尺寸。
- 页面窄于 1200 像素时，左右区改为抽屉，主查看区保持完整。
- 底部任务区默认显示步骤摘要，运行失败时自动展开到错误步骤。

### 12.3 操作阶段

页面顶部使用步骤导航显示当前进度：

1. 选择模型与版本。
2. 选择参数方案。
3. 添加测试输入。
4. 校验输入与资源预算。
5. 运行并查看过程。
6. 查看结果与评估结论。

用户可在任务启动前返回任意阶段修改。任务启动后，模型版本、参数和输入形成不可变快照；需要调整时复制为新任务。

## 13. 从样本库选择测试数据

### 13.1 检索条件

| 分类 | 筛选字段 |
| --- | --- |
| 兼容性 | 数据模态、文件格式、分辨率、模型组、输入契约版本 |
| 业务位置 | 线路、行别、区段、里程、桥梁、隧道、杆塔或设备编码 |
| 场景 | 白天、夜间、晴雨雪、遮挡程度、拍摄高度、视角 |
| 数据来源 | 无人机、机库、历史导入、人工上传、告警回流、工单回流 |
| 标注状态 | 未标注、已标注、已复核、存在争议 |
| 数据集属性 | 数据集版本、训练集、验证集、测试集、保留集 |
| 质量属性 | 清晰度、完整性、元数据质量、坐标质量、质量等级 |
| 难例属性 | 误报、漏报、低置信度、边界样本、重复目标、长尾类别 |
| 时间 | 采集时间、入库时间、最近使用时间 |

默认只显示与当前模型输入契约兼容的样本。用户可打开“显示不兼容项”，但不兼容原因必须明确展示，并且不能加入运行清单。

### 13.2 样本选择交互

- 支持表格和缩略图两种视图，点云与栅格显示专用缩略信息。
- 支持单选、跨页多选、按当前筛选结果创建动态集合和保存静态集合。
- 已选输入进入固定的测试输入清单，显示数量、总大小、真值覆盖率和类别分布。
- 对批量任务进行重复样本检测，内容校验和相同的文件只保留一份。
- 选择数据集版本时保存该版本的不可变成员快照，不随后续数据集调整变化。

### 13.3 真值要求

单样本快速测试允许无真值输入，只展示预测结果。批量回归、版本对比和参数对比可以运行无真值数据，但只能计算结果数量、置信度分布、稳定性、耗时和资源指标，不能生成精确率、召回率等监督指标。页面在启动前明确标识可计算和不可计算的指标。

## 14. 本地上传测试数据

### 14.1 支持格式

| 数据模态 | 文件格式 | 配套数据 |
| --- | --- | --- |
| 可见光图像 | JPG、JPEG、PNG、TIFF | EXIF、相机内外参、RTK/PPK 坐标 |
| 视频 | MP4、MOV、MKV | SRT、时间戳、航迹或姿态文件 |
| 红外 | 辐射 JPG、TIFF、厂商原始格式转换包 | 发射率、距离、环境温度、相机型号 |
| 点云 | PCD、PLY、LAS、LAZ | 坐标系、单位、轨迹、标定参数 |
| 栅格与高程 | TIF、GeoTIFF、DEM | CRS、基线栅格、世界文件 |
| 元数据与真值 | JSON、YAML、CSV、COCO JSON、GeoJSON | 与主文件通过文件名或清单关联 |

实际开放格式由模型输入契约和服务端解析器能力决定，前端按当前模型动态显示。

### 14.2 上传流程

```mermaid
sequenceDiagram
    participant U as 用户
    participant FE as 前端工作台
    participant API as 业务 API
    participant S3 as 临时对象存储
    participant O as 测试编排器

    U->>FE: 选择或拖入文件
    FE->>API: 创建上传会话并提交文件清单
    API-->>FE: 返回分片地址、限制和会话 ID
    FE->>S3: 分片上传
    FE->>API: 提交分片与客户端校验和
    API->>S3: 合并并校验对象
    API-->>FE: 返回格式解析和兼容性结果
    U->>FE: 补充元数据并加入输入清单
    FE->>API: 创建测试任务
    API->>O: 发布测试请求
```

### 14.3 上传能力

- 支持拖放、文件选择和文件夹批量选择。
- 大文件使用分片上传、断点续传、并行分片和失败重试。
- 计算客户端快速指纹，服务端完成 SHA-256 校验。
- 上传前检查扩展名、数量、单文件大小和会话总量。
- 上传后检查真实媒体类型、结构完整性、安全风险和输入契约兼容性。
- 多文件输入提供自动配对结果，无法配对时允许手工指定主文件、元数据、真值和基线文件。
- 元数据缺失时显示影响范围，例如“可运行，但无法计算绝对温度”或“无法进行空间定位”。
- 上传会话可保存为草稿，到期前继续补充文件。

### 14.4 临时数据治理

| 项目 | 规则 |
| --- | --- |
| 存储位置 | MinIO/S3 独立临时桶或隔离前缀 |
| 默认保留时间 | 7 天，可由管理员按环境调整 |
| 下载权限 | 上传人、同任务授权人员和管理员 |
| 外链方式 | 短时签名 URL，不返回永久对象地址 |
| 日志保护 | 不记录签名 URL、访问密钥和完整敏感文件名 |
| 到期处理 | 对象与派生产物异步清理，保留清理审计 |
| 转正式样本 | 明确提交、补齐元数据、质量检查、权限审批后归档 |

## 15. 测试任务编排

### 15.1 任务状态

```mermaid
stateDiagram-v2
    [*] --> Draft
    Draft --> Validating: 启动测试
    Validating --> Rejected: 校验失败
    Validating --> Queued: 校验通过
    Queued --> Running: 获得资源
    Queued --> Cancelled: 取消
    Running --> Completed: 全部成功
    Running --> PartiallyCompleted: 部分输入失败
    Running --> Failed: 任务级失败
    Running --> Cancelling: 请求取消
    Cancelling --> Cancelled
    Rejected --> Draft: 修正配置
    Completed --> [*]
    PartiallyCompleted --> [*]
    Failed --> [*]
    Cancelled --> [*]
```

### 15.2 运行步骤

| 序号 | 步骤 | 页面显示内容 |
| --- | --- | --- |
| 1 | 快照固化 | 模型哈希、参数修订、输入数量、任务追踪号 |
| 2 | 输入校验 | 格式、完整性、元数据、坐标系、真值状态 |
| 3 | 资源估算 | 推理次数、显存估算、磁盘需求、预计等待时间 |
| 4 | 排队调度 | 队列位置、优先级、资源池、并发额度 |
| 5 | 数据预处理 | 解码、抽帧、切片、滤波、配准、标准化等子步骤 |
| 6 | 模型推理 | 当前输入、批次进度、设备、运行时和推理耗时 |
| 7 | 结果后处理 | NMS、掩码处理、热点聚合、点云测量、变化区域合并 |
| 8 | 指标计算 | 真值匹配、逐类指标、性能指标和基线差异 |
| 9 | 结果归档 | 结果对象、缩略图、日志、报告和保留期限 |

任务详情通过 SSE 接收状态事件。SSE 断开后使用最后事件序号续传；若续传失败，前端回退到状态查询接口。取消采用协作式取消，已完成结果保留并标记任务为已取消。

### 15.3 调度策略

- 单样本快速测试使用交互队列，保证短任务优先响应。
- 批量回归和对比任务使用批处理队列，限制每个用户与模型组的并发。
- 生产推理资源池与测试资源池物理或逻辑隔离，生产始终具有更高保障等级。
- 编排器按数据类型、运行时、精度模式和显存需求选择工作节点。
- 单个输入可按错误类型重试，确定性格式错误不重试，临时资源错误按退避策略重试。
- 任务级超时、输入级超时和无进度超时分别控制。

## 16. 结果可视化设计

### 16.1 通用视图控制

- 原始数据、标注真值、预测结果和差异结果切换。
- 原图与结果并排、拖动分割和叠加三种比较方式。
- 结果图层开关、透明度、类别筛选、置信度即时过滤。
- 缩放、平移、适应窗口、原始尺寸、全屏和截图导出。
- 点击结果对象后展示类别、置信度、坐标、尺寸、规则命中和关联告警。
- 上一输入、下一输入、仅看失败项、仅看误报和仅看漏报快捷切换。

即时调整置信度仅用于前端结果过滤，不改变已保存的推理结果和测试参数。需要重新执行后处理或推理时必须创建新任务。

### 16.2 可见光检测与分割

- 检测框按类别配色，标签显示类别、置信度和对象编号。
- 分割结果支持掩码、轮廓和面积显示，透明度可调。
- 真值与预测同屏时，正确匹配、误报和漏报使用不同视觉编码。
- 支持查看单对象 IoU、匹配关系、像素面积及换算后的实际尺寸。
- 密集目标场景提供隐藏标签、仅悬停显示和列表联动定位。

### 16.3 视频分析

- 视频播放器叠加检测框、掩码、目标 ID 和轨迹。
- 时间轴标记目标出现、阈值越界、跟踪丢失和处理失败片段。
- 支持按事件跳转、逐帧查看、播放速度调整和关键帧导出。
- 显示解码、抽帧、推理和跟踪耗时，不将抽帧后帧率误报为原始帧率。

### 16.4 红外分析

- 原始红外图、温度热力图和可见光图联动查看。
- 显示温标、最高温、最低温、平均温、热点和测温区域。
- 参数区同步显示发射率、环境温度、距离等补偿值。
- 缺少辐射数据时明确标注“非绝对温度结果”，禁止显示伪精度温度值。

### 16.5 点云分析

- 使用 Three.js 实现点云三维查看，支持旋转、平移、缩放、点大小和颜色模式切换。
- 颜色模式包括 RGB、高程、强度、分类、到基线距离和异常等级。
- 支持基线与当前点云叠加、裁剪盒、剖面、距离测量和异常区域定位。
- 大点云使用分块、层级细节、按需加载和 GPU 点数上限，避免浏览器一次加载完整文件。
- 展示滤波前后点数、配准误差、形变量和空间坐标系。

### 16.6 栅格与变化检测

- 使用 MapLibre GL 显示 GeoTIFF 派生瓦片、线路中心线、里程和变化区域。
- 提供基线、当前、差分和阈值结果图层。
- 支持卷帘比较、透明度、变化面积统计和空间对象联动。
- 坐标系不一致时显示重投影信息和精度警告。

### 16.7 指标与性能

| 维度 | 可视化内容 |
| --- | --- |
| 检测 | Precision、Recall、F1、mAP、PR 曲线、混淆矩阵、逐类指标 |
| 分割 | mIoU、Dice、像素准确率、边界误差、逐类面积误差 |
| 红外 | 温度误差、热点检出率、误报率、相对温差偏差 |
| 点云 | 配准误差、距离误差、形变量误差、异常区域检出率 |
| 变化检测 | 区域 Precision、Recall、IoU、面积偏差、空间定位误差 |
| 性能 | 预处理、推理、后处理、总耗时，吞吐量，显存和 CPU 内存 |

ECharts 用于指标趋势、分布、PR 曲线和混淆矩阵。图表必须提供数据表切换和导出，不能仅用颜色表达结论。

## 17. 对比评估设计

### 17.1 对比维度

- 同一样本、同一参数方案对比不同模型版本。
- 同一模型版本、同一样本对比不同参数方案。
- 候选版本对比当前生产基线。
- 当前批量结果对比历史固定评估集结果。
- 按线路、场景、类别、天气、设备和难例标签分组比较。

### 17.2 评估规则

模型组配置可版本化的验收规则，规则支持：

- 核心指标最低值。
- 相对生产基线最大允许回退值。
- 关键类别最低召回率。
- 单输入 P95 耗时和失败率上限。
- 显存、内存和制品大小上限。
- 必须为零的阻断级错误数量。

结论分为“通过、附条件通过、不通过、数据不足”。系统自动给出规则判定，最终评估意见由授权人员确认。人工结论与系统判定不一致时必须填写原因。

### 17.3 失败样本分析

失败样本区按照误报、漏报、类别错误、定位偏差、分割边界错误、测温偏差、配准失败、格式失败和超时聚合。用户可批量执行：

- 加入候选样本。
- 发起标注或复核任务。
- 标记数据质量问题。
- 分配问题责任人。
- 创建新的回归测试集合。
- 关联模型缺陷记录。

## 18. 发布与回滚

### 18.1 发布门槛

发布申请必须绑定候选版本、制品哈希、生产参数快照和固定评估任务。以下条件缺一不可：

1. 制品校验通过。
2. 必需评估集已完整运行。
3. 阻断规则全部通过。
4. 安全扫描和运行时兼容检查通过。
5. 参数变更已完成复核。
6. 回滚目标和回滚条件已明确。

### 18.2 灰度策略

支持按流量比例、线路、区段、设备类型或任务标签进行灰度。灰度记录包含当前比例、观测窗口、生产指标、异常事件和操作人。灰度比例调整是新的审计事件，不能覆盖历史值。

### 18.3 回滚

回滚恢复到已验证的模型版本和生产参数快照，两者必须成对切换。回滚操作要求二次确认、原因、影响范围和审批信息。系统保留回滚前后的路由配置与运行指标，用于后续复盘。

## 19. 数据模型设计

### 19.1 现有实体扩展

现有 `model_versions` 继续保存模型组、版本、状态、场景和指标，增加制品、契约和运行要求的关联。现有 `sample_feedback_records` 继续承接结果到候选样本、标注和模型优化的追踪关系。

### 19.2 新增核心表

#### 19.2.1 `model_groups`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 主键 |
| `code` | VARCHAR | 稳定模型组编码，唯一 |
| `name` | VARCHAR | 模型组名称 |
| `model_type` | VARCHAR | detection、segmentation、thermal、pointcloud、change |
| `input_modalities` | JSONB | 支持的数据模态 |
| `output_contract_version` | VARCHAR | 输出契约版本 |
| `owner_team` | VARCHAR | 责任团队 |
| `enabled` | BOOLEAN | 是否启用 |

#### 19.2.2 `model_artifacts`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 主键 |
| `model_version_id` | UUID | 模型版本 |
| `artifact_type` | VARCHAR | ONNX、TensorRT、PyTorch |
| `object_key` | VARCHAR | 对象存储键 |
| `sha256` | CHAR(64) | 内容哈希 |
| `size_bytes` | BIGINT | 文件大小 |
| `runtime_constraints` | JSONB | 运行时与设备要求 |
| `validation_status` | VARCHAR | 校验状态 |
| `validation_report` | JSONB | 校验报告 |

#### 19.2.3 `model_parameter_schemas`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 主键 |
| `model_group_id` | UUID | 模型组 |
| `model_version_id` | UUID | 可为空，为空表示模型组级定义 |
| `schema_version` | VARCHAR | 定义版本 |
| `json_schema` | JSONB | 参数结构与校验规则 |
| `ui_schema` | JSONB | 控件与布局规则 |
| `active` | BOOLEAN | 是否为当前定义 |

#### 19.2.4 `model_parameter_profiles`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 参数方案主键 |
| `model_group_id` | UUID | 模型组 |
| `model_version_id` | UUID | 适用版本 |
| `name` | VARCHAR | 方案名称 |
| `revision` | INTEGER | 修订号 |
| `scope_type` | VARCHAR | 默认、场景、测试、生产快照 |
| `scope_value` | JSONB | 线路、场景或设备范围 |
| `parameters` | JSONB | 参数内容 |
| `based_on_id` | UUID | 来源方案 |
| `status` | VARCHAR | 草稿、有效、停用、锁定 |
| `change_reason` | TEXT | 修改原因 |

#### 19.2.5 `model_test_tasks`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 测试任务主键 |
| `task_no` | VARCHAR | 可读任务编号，唯一 |
| `test_type` | VARCHAR | quick、regression、version_compare、parameter_compare |
| `model_group_id` | UUID | 模型组 |
| `status` | VARCHAR | 任务状态 |
| `input_snapshot` | JSONB | 输入成员快照 |
| `matrix_snapshot` | JSONB | 版本与参数组合快照 |
| `acceptance_rule_version` | VARCHAR | 验收规则版本 |
| `progress` | NUMERIC | 总体进度 |
| `trace_id` | VARCHAR | 链路追踪号 |
| `created_by` | UUID | 创建人 |
| `created_at` | TIMESTAMP | 创建时间 |
| `started_at` | TIMESTAMP | 开始时间 |
| `finished_at` | TIMESTAMP | 完成时间 |

#### 19.2.6 `model_test_inputs`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 主键 |
| `test_task_id` | UUID | 测试任务 |
| `source_type` | VARCHAR | library 或 upload |
| `sample_id` | UUID | 样本库来源，可为空 |
| `upload_object_key` | VARCHAR | 临时上传来源，可为空 |
| `sha256` | CHAR(64) | 输入内容哈希 |
| `modality` | VARCHAR | 数据模态 |
| `metadata_snapshot` | JSONB | 元数据快照 |
| `ground_truth_snapshot` | JSONB | 真值快照 |
| `validation_status` | VARCHAR | 输入校验状态 |
| `validation_messages` | JSONB | 警告和错误 |

#### 19.2.7 `model_test_result_items`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | UUID | 主键 |
| `test_task_id` | UUID | 测试任务 |
| `test_input_id` | UUID | 测试输入 |
| `model_version_id` | UUID | 模型版本 |
| `parameter_profile_id` | UUID | 参数方案，可为空 |
| `parameter_snapshot` | JSONB | 实际运行参数 |
| `status` | VARCHAR | 成功、失败、跳过 |
| `prediction` | JSONB | 结构化预测结果 |
| `metrics` | JSONB | 单项指标 |
| `artifacts` | JSONB | 掩码、缩略图、点云分块等对象 |
| `runtime_snapshot` | JSONB | 容器、设备和运行时信息 |
| `timings` | JSONB | 分阶段耗时 |
| `error_code` | VARCHAR | 失败代码 |
| `error_detail` | JSONB | 脱敏后的错误详情 |

#### 19.2.8 `model_test_summaries`

保存组合级汇总指标、逐类指标、验收判定、基线差异、人工结论和报告对象地址。汇总记录必须关联测试任务、模型版本、参数快照和指标计算器版本。

#### 19.2.9 `test_upload_sessions`

保存上传会话、创建人、状态、文件数量、总大小、分片信息、临时对象前缀、过期时间和清理状态。上传会话不保存永久签名 URL。

#### 19.2.10 `model_release_records`

保存候选版本、生产参数快照、评估任务、审批信息、灰度策略、生效时间、回滚目标和状态变化历史。

### 19.3 索引与约束

- `model_groups.code` 唯一。
- `model_versions(model_group, version)` 唯一。
- 参数方案使用 `(model_group_id, name, revision)` 唯一约束。
- 测试任务按 `created_at`、`status`、`model_group_id` 建立组合索引。
- 测试输入按 `sha256` 建立索引，用于任务内去重。
- 结果项按 `test_task_id`、`test_input_id` 和 `model_version_id` 建立组合索引。
- JSONB 中高频筛选字段提取为实体列或建立 GIN 索引，避免列表查询全表扫描。
- 被测试任务、生产快照或发布记录引用的实体禁止物理删除。

## 20. 接口设计

统一前缀为 `/api/v1`，返回结构包含 `requestId`、`code`、`message` 和 `data`。创建、启动、取消、发布等写操作支持 `Idempotency-Key`。

### 20.1 模型与版本

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| GET | `/models` | 分页查询模型组及生产状态 |
| GET | `/models/{modelGroupId}` | 查询模型详情 |
| GET | `/models/{modelGroupId}/versions` | 查询模型版本 |
| POST | `/models/{modelGroupId}/versions` | 登记模型版本 |
| GET | `/model-versions/{versionId}/artifacts` | 查询制品和校验结果 |
| POST | `/model-versions/{versionId}/validate` | 触发制品校验 |
| GET | `/model-versions/{versionId}/health` | 查询部署与运行健康 |

### 20.2 参数方案

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| GET | `/model-versions/{versionId}/parameter-schema` | 获取参数定义和 UI 定义 |
| GET | `/models/{modelGroupId}/parameter-profiles` | 查询参数方案 |
| POST | `/models/{modelGroupId}/parameter-profiles` | 创建参数方案 |
| POST | `/parameter-profiles/{profileId}/revisions` | 基于现有方案创建修订 |
| POST | `/parameter-profiles/validate` | 校验完整参数和资源约束 |
| GET | `/parameter-profiles/compare` | 比较两个或多个修订 |
| POST | `/parameter-profiles/{profileId}/activate` | 设为指定场景默认方案 |
| POST | `/parameter-profiles/{profileId}/deactivate` | 停用参数方案 |

参数校验接口同时返回字段级错误、跨字段错误、资源警告和规范化后的参数，不返回只有自然语言的模糊结论。

### 20.3 样本检索与上传

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| GET | `/samples` | 按兼容性和业务属性检索样本 |
| POST | `/sample-sets/preview` | 计算当前选择的数量、大小和分布 |
| POST | `/test-uploads` | 创建上传会话 |
| POST | `/test-uploads/{sessionId}/files` | 登记文件及分片计划 |
| POST | `/test-uploads/{sessionId}/complete` | 完成合并、校验和格式解析 |
| GET | `/test-uploads/{sessionId}` | 查询会话、文件和校验状态 |
| DELETE | `/test-uploads/{sessionId}` | 删除未被任务引用的临时上传 |
| POST | `/test-uploads/{sessionId}/archive-request` | 申请转为正式候选样本 |

大文件分片优先使用对象存储预签名上传地址，业务 API 只管理会话和完成确认，避免大文件流经 Spring Boot 进程。

### 20.4 测试任务

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| POST | `/model-tests` | 创建任务草稿并生成快照 |
| POST | `/model-tests/{taskId}/validate` | 执行输入、参数和资源校验 |
| POST | `/model-tests/{taskId}/start` | 启动测试 |
| POST | `/model-tests/{taskId}/cancel` | 请求取消 |
| POST | `/model-tests/{taskId}/clone` | 复制为可编辑的新任务 |
| GET | `/model-tests` | 查询测试记录 |
| GET | `/model-tests/{taskId}` | 查询任务详情和总体进度 |
| GET | `/model-tests/{taskId}/events` | SSE 获取运行事件 |
| GET | `/model-tests/{taskId}/inputs` | 查询输入及处理状态 |
| GET | `/model-tests/{taskId}/results` | 分页查询结果项 |
| GET | `/model-tests/{taskId}/summary` | 查询汇总指标和结论 |
| GET | `/model-tests/{taskId}/report` | 获取评估报告下载地址 |
| POST | `/model-test-results/{resultId}/feedback` | 标记误报、漏报或数据问题 |
| POST | `/model-tests/compare` | 跨任务或组合进行指标比较 |

### 20.5 发布接口

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| POST | `/model-releases` | 创建发布申请 |
| POST | `/model-releases/{releaseId}/approve` | 审批发布 |
| POST | `/model-releases/{releaseId}/reject` | 驳回发布 |
| POST | `/model-releases/{releaseId}/gray` | 设置或调整灰度 |
| POST | `/model-releases/{releaseId}/promote` | 转为正式生产版本 |
| POST | `/model-releases/{releaseId}/rollback` | 回滚到目标快照 |
| GET | `/model-releases` | 查询发布与回滚记录 |

## 21. 测试任务请求结构

```json
{
  "name": "轨道异物检测候选版本回归",
  "testType": "version_compare",
  "modelGroupId": "vision-detector",
  "matrix": [
    {
      "modelVersionId": "version-production",
      "parameterProfileId": "profile-baseline"
    },
    {
      "modelVersionId": "version-candidate",
      "parameterProfileId": "profile-rainy-line"
    }
  ],
  "inputs": {
    "librarySampleIds": ["sample-001", "sample-002"],
    "uploadSessionIds": ["upload-session-001"]
  },
  "options": {
    "saveIntermediate": true,
    "priority": "normal",
    "resultRetentionDays": 30
  }
}
```

服务端创建任务时必须将 `matrix`、样本成员、上传对象版本和最终参数解析为快照。后续参数方案或样本标签变化不影响已经创建的任务。

## 22. 错误处理与恢复

### 22.1 错误分类

| 类别 | 处理方式 |
| --- | --- |
| 参数错误 | 定位字段和规则，任务停留在草稿 |
| 输入不兼容 | 标记具体文件，可移除后继续 |
| 元数据缺失 | 区分阻断错误与可运行警告 |
| 上传中断 | 续传未完成分片，不重复上传成功分片 |
| 队列拥堵 | 显示预计等待时间，允许取消 |
| 资源不足 | 调整批量、精度或资源池后复制任务 |
| 单输入推理失败 | 按策略重试，最终形成部分完成任务 |
| 服务不可用 | 暂停调度并保留队列，恢复后继续 |
| SSE 中断 | 使用事件序号重连，失败时查询任务状态 |
| 结果产物缺失 | 结果项标记不完整，禁止评估通过 |

### 22.2 错误反馈要求

- 页面显示可执行的处理建议，不直接展示服务堆栈。
- 错误详情保留 `requestId`、`traceId`、步骤、输入编号和错误码。
- 同一错误批量发生时聚合显示，并支持下载失败清单。
- 用户重试不得生成重复结果；服务端按任务、输入和矩阵组合保持幂等。

## 23. 安全与审计

1. 模型制品、临时上传、测试结果和报告使用不同对象前缀与访问策略。
2. 浏览器只获得短时签名 URL，签名范围限制到单个对象和操作类型。
3. 上传文件进行真实类型识别、安全扫描、压缩包递归深度限制和解压后大小限制。
4. 文件名、元数据和日志中的敏感位置、人员和设备信息按权限脱敏。
5. 参数变更、测试启动、测试取消、样本归档、发布、灰度和回滚写入审计日志。
6. 审计日志记录操作前后快照、操作人、时间、来源 IP、客户端和原因，禁止业务用户修改。
7. 模型服务凭据、对象存储密钥和设备池信息不下发前端。
8. 对外导出的结果包按数据密级水印、加密或限制有效期。

## 24. 性能与容量设计

### 24.1 前端

- 模型、样本和结果清单使用服务端分页与虚拟滚动。
- 缩略图按需加载，离屏后释放视频和三维资源。
- 点云采用分块和层级细节，设置最大可见点数。
- 图表只加载当前对比组合，完整明细通过分页或导出获取。
- SSE 事件按任务聚合，进度事件限频，日志按需加载。

### 24.2 后端与推理

- 测试创建接口只固化快照和发布任务，不同步等待推理完成。
- Redis 保存短期任务进度、配额和事件游标，数据库保存最终状态。
- 推理服务按模型版本缓存已加载制品，并按显存水位淘汰。
- 小图像按安全上限合批；视频、点云和栅格按输入独立调度。
- 指标计算与推理解耦，可在结果产生后并行计算。
- 结果列表只返回结构化摘要，掩码、点云和栅格产物通过对象存储读取。

### 24.3 建议容量基线

| 项目 | 基线 |
| --- | --- |
| 单次交互测试输入 | 1 至 20 个 |
| 单次批量测试输入 | 默认不超过 2,000 个，可配置 |
| 对比组合数量 | 默认不超过 8 个 |
| 单上传会话总量 | 默认不超过 20 GB，可配置 |
| SSE 进度刷新 | 1 秒级聚合，日志事件按需 |
| 测试结果保留 | 默认 30 天，发布依据长期保留 |
| 临时上传保留 | 默认 7 天 |

实际上限按硬件资源、数据密级和项目规模在环境配置中维护，不写死在前端。

## 25. 可观测性

### 25.1 指标

- 测试任务排队时间、运行时间、成功率、取消率和部分完成率。
- 各模型版本加载耗时、推理吞吐、P50/P95/P99 耗时和失败率。
- GPU 利用率、显存使用、CPU、内存和磁盘临时空间。
- Kafka 消费延迟、积压数量和重试队列数量。
- 上传速度、分片失败率、校验失败率和临时对象清理失败率。
- 按错误码统计的模型、输入和基础设施失败趋势。

### 25.2 链路追踪

前端请求、业务 API、Kafka 事件、编排器、推理服务、指标服务和对象存储操作共享 `traceId`。测试详情提供只读追踪摘要，系统运维页面提供完整链路查询入口。

## 26. 测试策略

### 26.1 单元测试

- JSON Schema 与跨字段参数校验。
- 参数分层合并、差异和不可变修订。
- 测试矩阵展开与组合上限。
- 样本兼容性、重复输入和真值可用性判断。
- 指标计算、验收规则和基线差异判定。
- 状态机合法迁移、取消和重试策略。

### 26.2 接口测试

- 模型、版本、参数、上传、测试和发布接口的权限与数据范围。
- 幂等键重复提交、并发启动和重复取消。
- 分片缺失、校验和不一致、会话过期和对象不存在。
- SSE 首次连接、断线续传、事件缺口和任务结束。
- 分页、筛选、排序和大结果集响应时间。

### 26.3 集成测试

- PostgreSQL、Redis、Kafka、MinIO、编排器和 FastAPI 服务全链路。
- 图像、视频、红外、点云和 GeoTIFF 的实际解析与结果产物。
- 推理节点异常、Kafka 暂停、对象存储短时失败和恢复。
- 生产与测试资源隔离、并发配额和优先级调度。
- 发布审批、灰度、生产切换和模型参数成对回滚。

### 26.4 前端测试

- 动态参数控件、条件显示、精确输入和字段错误定位。
- 样本库跨页选择、上传续传、输入清单去重和草稿恢复。
- 各模态查看器的缩放、叠加、筛选、联动和资源释放。
- 任务运行状态、SSE 重连、失败输入和取消反馈。
- 桌面常用分辨率和窄屏布局下无文字截断、控件重叠和页面跳动。
- 键盘操作、焦点顺序、颜色对比度和图表数据表替代视图。

### 26.5 算法回归测试

- 固定校验集结果可重复，浮点差异在定义容差内。
- ONNX、TensorRT 和 PyTorch 结果一致性。
- FP32、FP16 和 INT8 精度差异符合门槛。
- 类别字典、坐标换算、图像缩放和掩码还原正确。
- 红外补偿、点云坐标系与栅格重投影使用已知数据验证。

### 26.6 性能与安全测试

- 批量任务、并发用户和大文件上传压力测试。
- 长视频、大点云和大栅格的内存与超时测试。
- 文件类型伪造、恶意压缩包、越权对象访问和签名 URL 过期。
- 参数注入、日志敏感信息、重复请求和审计完整性。

## 27. 验收标准

### 27.1 功能验收

1. 用户可从模型总览进入任意模型组并查看版本、制品和健康状态。
2. 参数表单由服务端定义生成，能完成校验、复制、差异比较和修订保存。
3. 用户可从样本库筛选并选择输入，清单正确显示兼容性、真值和分布。
4. 用户可上传各支持模态文件，完成分片续传、校验、配对和元数据补充。
5. 四类测试任务均可创建、校验、运行、取消、复制和追踪。
6. 图片、视频、红外、点云和栅格结果均有专用查看能力。
7. 结果可按版本、参数、场景和类别比较，并执行验收规则。
8. 失败结果可回流候选样本或标注队列，保留完整追踪关系。
9. 发布和回滚绑定模型与参数快照，并有审批和审计记录。

### 27.2 非功能验收

- 测试任务不阻塞生产推理，资源隔离策略可验证。
- 页面刷新后可恢复测试任务和筛选上下文。
- 断开 SSE 后可续传或恢复到一致状态。
- 被引用版本、参数、样本和结果不可误删。
- 同一任务可通过模型哈希、输入哈希和参数快照复现。
- 权限、对象访问和数据范围在前后端均生效。
- 常用桌面分辨率下布局稳定，无重叠、溢出和不可操作控件。

## 28. 实施阶段

### 28.1 第一阶段：模型台账与参数方案

- 建立模型组、版本、制品和参数定义数据结构。
- 完成模型总览、模型详情、版本列表和制品校验状态。
- 实现动态参数表单、参数修订、校验和差异比较。
- 打通现有模型版本数据，并保留兼容迁移逻辑。

### 28.2 第二阶段：测试输入与任务编排

- 完成样本库兼容检索、输入清单和静态集合。
- 完成临时上传、分片续传、格式解析、配对和清理。
- 建立测试任务、输入、结果项和状态事件。
- 对接视觉推理、点云与栅格分析服务，建立独立测试队列。

### 28.3 第三阶段：结果查看与对比评估

- 完成图片、分割、视频、红外、点云和栅格查看器。
- 完成指标计算、图表、失败样本分析和报告导出。
- 实现版本对比、参数对比、固定回归集和验收规则。
- 打通结果到候选样本、标注队列和问题记录的回流。

### 28.4 第四阶段：发布治理与运行优化

- 完成发布申请、审批、灰度、生产切换和回滚。
- 完善权限、审计、敏感数据保护和对象生命周期。
- 完成任务配额、GPU 调度、模型缓存和大文件性能优化。
- 建立生产指标观测、自动告警和周期性回归机制。

## 29. 关键决策

1. 模型测试是“样本与模型”业务域内的独立工作台，不与生产全链路运行页面混合。
2. 样本库选择与本地上传共享同一输入清单和测试流程，不建立两套结果体系。
3. 本地上传数据默认临时保存，不能在用户无感知的情况下进入正式样本库。
4. 参数表单由 JSON Schema 与 UI Schema 驱动，模型专用配置不硬编码到页面。
5. 已运行和已发布参数不可变，所有调整通过新修订完成。
6. 测试结果绑定模型制品哈希、参数快照、输入校验和与运行环境，保证可复现。
7. 测试采用异步事件编排和独立资源池，生产服务优先级不受影响。
8. 版本发布必须同时发布模型制品与生产参数快照，回滚也必须成对执行。
9. 结果查看按数据模态使用专用能力，不能以通用 JSON 结果代替业务可视化。
10. 自动验收规则提供一致判定，人工确认保留责任人、意见和完整审计。

