构建统一的计算机视觉基准测试流水线——无需为每个任务重写代码

发布: (2025年12月8日 GMT+8 04:25)
6 min read
原文: Dev.to

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
    ...

可用的适配器

  • ClassificationFolderAdapter
  • CocoDetectionAdapter
  • YoloDetectionAdapter
  • MaskSegmentationAdapter

每个适配器:

  • 读取原始数据集。
  • 将标注转换为规范化结构。
  • 在不同任务间提供一致的输出。

这消除了大量条件分支和特定格式的解析逻辑。

4. 任务 Runner:在基准之间一致地执行模型

数据集统一后,我们构建了三个模块化的 runner:

  • ClassifierRunner
  • DetectorRunner
  • SegmenterRunner

所有 runner 共享相同的 API:

result = runner.run(dataset, model, config)

每个 runner 负责:

  • 前向传播
  • 输出规范化
  • 预测日志记录
  • 指标计算
  • 产出生成
  • 实时 UI 上报

该设计使任何模型都能在任何基准上运行,只要配置匹配即可。

5. 从脚本到系统:客户端‑服务器架构

为支持多用户和并行评估,项目演进为完整的客户端‑服务器系统。

服务器职责

  • 作业调度与队列管理
  • 在工作节点之间负载均衡
  • 产物存储(如 MinIO)
  • 模型/版本追踪
  • 故障隔离

客户端(PyQt)职责

  • 上传模型
  • 选择基准并配置运行
  • 查看实时日志
  • 对比不同运行的指标
  • 下载预测产物

该架构把流水线转变为可用、可扩展的研究工具。

6. 关键工程经验教训

  • 配置应驱动执行,而非相反。
  • 强校验(Pydantic)能节省大量调试时间。
  • 适配器规范化复杂性,防止格式特定逻辑爆炸。
  • 模块化 runner 使任务逻辑可替换且易于扩展。
  • 增量评估对真实数据集至关重要。
  • 客户端‑服务器分离将流水线提升为生产级系统。

结论

通过结合:

  • 声明式 YAML 配置
  • 强类型 AppConfig
  • 通过适配器进行数据集规范化
  • 模块化 runner
  • 增量计算
  • 客户端‑服务器架构

我们构建了一个统一的基准评估流水线,能够在任何计算机视觉模型上运行任意基准——无需为每个任务编写新代码。这种方法提供了稳定性、可扩展性和可复现性——是面向真实世界评估系统的关键特质。

Back to Blog

相关文章

阅读更多 »