构建统一的计算机视觉基准测试流水线——无需为每个任务重写代码
Source: Dev.to
问题概述
| 任务 | 数据格式 | 输出 | 评估指标 |
|---|---|---|---|
| 分类 | 文件夹结构 | 标签索引 | 准确率, F1 |
| 检测 | COCO / YOLO JSON / TXT | 边界框 | mAP |
| 分割 | PNG 掩码 | 像素级掩码 | IoU |
初始状态存在:
- 非统一的流水线
- 针对模型的脚本
- 针对基准的代码路径
- 缺乏一致的评估流程
为了构建一个真正的基准平台——而不仅仅是一堆脚本,我们需要一个统一的执行模型。
1. 声明式方法:一个 YAML 定义完整基准
首个架构决策是用声明式配置模型取代硬编码逻辑。每个基准由单个 YAML 文件定义,内容包括:
- 任务类型
- 数据集格式和路径
- 划分(train/val/test)
- 评估指标
- 运行时参数(设备、批大小等)
示例 YAML
task: detection
dataset:
kind: coco
root: datasets/fruit
splits:
val: val
eval:
metrics: ["map50", "map"]
device: auto
为什么重要
- YAML 成为整个系统的唯一真实来源。
- 添加新基准只需创建新的 YAML 文件——无需改动代码、无需新增脚本、也不产生重复逻辑。
- 该设计直接实现了可扩展性。
2. 仅靠 YAML 仍不够 —— 引入 Pydantic AppConfig
YAML 灵活但易碎;拼写错误或缺失字段会导致评估中断。为保证正确性,我们使用 Pydantic 模型构建了强类型的 AppConfig 层。
AppConfig 的特性
- 深度校验 —— 类型、允许值、必填字段、结构一致性。
- 规范化 —— 路径解析、默认值、设备处理、指标校验。
- 确定性解释 —— 将 YAML → 稳定的 Python 对象。
- 清晰契约 —— DatasetAdapters、Runners、Metrics 以及 UI 都依赖同一结构化配置。
示例 Pydantic 模型
from pathlib import Path
from typing import Dict, List
from pydantic import BaseModel
class DatasetConfig(BaseModel):
kind: str
root: Path
splits: Dict[str, str]
class EvalConfig(BaseModel):
metrics: List[str]
device: str = "auto"
batch_size: int = 16
class AppConfig(BaseModel):
task: str
dataset: DatasetConfig
eval: EvalConfig
一个正确的 AppConfig 能保证流水线行为可预测;错误的 YAML 会在任何 runner 开始执行前被立即捕获。
3. 统一不一致的格式:DatasetAdapters
完成校验后,下一个挑战是处理不兼容的数据集格式。我们引入了模块化的 DatasetAdapter 层,将任意数据集转换为统一的迭代接口:
for image, target in adapter:
# model inference
...
可用的适配器
ClassificationFolderAdapterCocoDetectionAdapterYoloDetectionAdapterMaskSegmentationAdapter
每个适配器:
- 读取原始数据集。
- 将标注转换为规范化结构。
- 在不同任务间提供一致的输出。
这消除了大量条件分支和特定格式的解析逻辑。
4. 任务 Runner:在基准之间一致地执行模型
数据集统一后,我们构建了三个模块化的 runner:
ClassifierRunnerDetectorRunnerSegmenterRunner
所有 runner 共享相同的 API:
result = runner.run(dataset, model, config)
每个 runner 负责:
- 前向传播
- 输出规范化
- 预测日志记录
- 指标计算
- 产出生成
- 实时 UI 上报
该设计使任何模型都能在任何基准上运行,只要配置匹配即可。
5. 从脚本到系统:客户端‑服务器架构
为支持多用户和并行评估,项目演进为完整的客户端‑服务器系统。
服务器职责
- 作业调度与队列管理
- 在工作节点之间负载均衡
- 产物存储(如 MinIO)
- 模型/版本追踪
- 故障隔离
客户端(PyQt)职责
- 上传模型
- 选择基准并配置运行
- 查看实时日志
- 对比不同运行的指标
- 下载预测产物
该架构把流水线转变为可用、可扩展的研究工具。
6. 关键工程经验教训
- 配置应驱动执行,而非相反。
- 强校验(Pydantic)能节省大量调试时间。
- 适配器规范化复杂性,防止格式特定逻辑爆炸。
- 模块化 runner 使任务逻辑可替换且易于扩展。
- 增量评估对真实数据集至关重要。
- 客户端‑服务器分离将流水线提升为生产级系统。
结论
通过结合:
- 声明式 YAML 配置
- 强类型
AppConfig层 - 通过适配器进行数据集规范化
- 模块化 runner
- 增量计算
- 客户端‑服务器架构
我们构建了一个统一的基准评估流水线,能够在任何计算机视觉模型上运行任意基准——无需为每个任务编写新代码。这种方法提供了稳定性、可扩展性和可复现性——是面向真实世界评估系统的关键特质。