跳转到主要内容

从 YOLO 到 TT100K:指标上涨了,小标志却还在消失

发布于:  时间 
计算机视觉
镜头中的交通标志小目标检测分析插画

训练命令终于跑起来时,终端里的损失不断刷新,GPU 也开始工作。那一刻很容易产生一种错觉:最难的部分已经过去了。

直到我打开预测结果,才发现不少远处的交通标志仍然消失在画面里。指标确实在变化,但它没有自动回答最关心的问题。模型究竟学会了什么,又漏掉了什么?

这次 TT100K 实践让我从“会启动一次 YOLO 训练”,开始走向“能设计、观察并解释一个实验”。

为什么交通标志比想象中难

交通标志有明确类别,也有清晰的应用场景,看起来很适合作为目标检测任务。但真实图像里的标志常常只占很小一块像素,还会受到拍摄距离、光照、遮挡、角度和复杂背景影响。

数据本身也不均衡。有些类别样本很多,有些类别出现次数很少。如果只看整体指标,大类别的表现可能掩盖小类别的问题。

这意味着实验不能只做“把图片放进模型”这一件事。类别分布、标注质量、图像尺寸和场景差异都需要被看见。

环境跑通,是第一场实验

我使用 PyTorch、Ultralytics YOLO 与本地 RTX 4060 Laptop GPU 进行训练。真正开始比较模型之前,先要确认环境没有悄悄制造错误。

我遇到过 CUDA 与 PyTorch 版本不匹配、数据路径识别失败、显存不足和输出目录混乱。后来我把准备工作固定成一套检查顺序:

  1. 验证图像、标注与类别映射是否对应
  2. 用少量数据快速跑通读取和训练流程
  3. 确认 PyTorch 能识别正确的 GPU 与 CUDA
  4. 记录模型、图像尺寸、批次和训练轮数
  5. 为每次实验使用独立且可辨认的输出目录

小规模试跑能提前暴露大部分配置问题,也避免在长时间训练后才发现数据根本没有被正确读取。

指标只告诉我“发生了什么”

Precision、Recall、mAP50 和 mAP50-95 能帮助比较实验,却不能单独解释原因。

例如,整体 mAP 上升时,某些小类别仍可能频繁漏检。Recall 下降可能意味着模型变得更保守,也可能与置信度阈值有关。混淆矩阵能指出哪些类别容易混在一起,但仍要回到原图,才能看到是目标太小、标注有问题,还是背景纹理造成干扰。

因此,我会把数字与可视化结果放在一起:

  • 看训练与验证损失是否出现明显分离
  • 看每个类别,而不是只看总平均值
  • 检查混淆矩阵和 PR 曲线中的异常
  • 挑出漏检、误检和低置信度样本逐张观察
  • 对比不同实验是否在相同验证集和阈值下完成

指标像仪表盘,预测图才像前挡风玻璃。两者缺一不可。

不急着给模型堆模块

看到小目标表现不好时,很容易立刻搜索注意力机制、特征融合或新的检测头。但如果基线、数据与评估还不稳定,增加模块只会让问题更难解释。

我现在更愿意先建立可靠基线,再一次修改一个因素,并记录它想解决的问题。修改后不仅比较最终分数,还要查看它是否真的改善了目标场景,是否带来速度、显存或其他类别上的代价。

下一步,我会继续围绕小目标检测、轻量化模型和特征融合做对比实验,也会练习论文复现与消融实验。目标不是让网络结构看起来更复杂,而是能清楚回答:为什么改,改了哪里,结果是否稳定。