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

训练命令终于跑起来时,终端里的损失不断刷新,GPU 也开始工作。那一刻很容易产生一种错觉:最难的部分已经过去了。
直到我打开预测结果,才发现不少远处的交通标志仍然消失在画面里。指标确实在变化,但它没有自动回答最关心的问题。模型究竟学会了什么,又漏掉了什么?
这次 TT100K 实践让我从“会启动一次 YOLO 训练”,开始走向“能设计、观察并解释一个实验”。
为什么交通标志比想象中难
交通标志有明确类别,也有清晰的应用场景,看起来很适合作为目标检测任务。但真实图像里的标志常常只占很小一块像素,还会受到拍摄距离、光照、遮挡、角度和复杂背景影响。
数据本身也不均衡。有些类别样本很多,有些类别出现次数很少。如果只看整体指标,大类别的表现可能掩盖小类别的问题。
这意味着实验不能只做“把图片放进模型”这一件事。类别分布、标注质量、图像尺寸和场景差异都需要被看见。
环境跑通,是第一场实验
我使用 PyTorch、Ultralytics YOLO 与本地 RTX 4060 Laptop GPU 进行训练。真正开始比较模型之前,先要确认环境没有悄悄制造错误。
我遇到过 CUDA 与 PyTorch 版本不匹配、数据路径识别失败、显存不足和输出目录混乱。后来我把准备工作固定成一套检查顺序:
- 验证图像、标注与类别映射是否对应
- 用少量数据快速跑通读取和训练流程
- 确认 PyTorch 能识别正确的 GPU 与 CUDA
- 记录模型、图像尺寸、批次和训练轮数
- 为每次实验使用独立且可辨认的输出目录
小规模试跑能提前暴露大部分配置问题,也避免在长时间训练后才发现数据根本没有被正确读取。
指标只告诉我“发生了什么”
Precision、Recall、mAP50 和 mAP50-95 能帮助比较实验,却不能单独解释原因。
例如,整体 mAP 上升时,某些小类别仍可能频繁漏检。Recall 下降可能意味着模型变得更保守,也可能与置信度阈值有关。混淆矩阵能指出哪些类别容易混在一起,但仍要回到原图,才能看到是目标太小、标注有问题,还是背景纹理造成干扰。
因此,我会把数字与可视化结果放在一起:
- 看训练与验证损失是否出现明显分离
- 看每个类别,而不是只看总平均值
- 检查混淆矩阵和 PR 曲线中的异常
- 挑出漏检、误检和低置信度样本逐张观察
- 对比不同实验是否在相同验证集和阈值下完成
指标像仪表盘,预测图才像前挡风玻璃。两者缺一不可。
不急着给模型堆模块
看到小目标表现不好时,很容易立刻搜索注意力机制、特征融合或新的检测头。但如果基线、数据与评估还不稳定,增加模块只会让问题更难解释。
我现在更愿意先建立可靠基线,再一次修改一个因素,并记录它想解决的问题。修改后不仅比较最终分数,还要查看它是否真的改善了目标场景,是否带来速度、显存或其他类别上的代价。
下一步,我会继续围绕小目标检测、轻量化模型和特征融合做对比实验,也会练习论文复现与消融实验。目标不是让网络结构看起来更复杂,而是能清楚回答:为什么改,改了哪里,结果是否稳定。