我们没有相见,却是此刻最好的相聚。
今天补上回调函数在完成一轮拟合epoch结束后,获取当前指标的方法。
上文我们说到,我们在 on_train_epoch_end 结束后可以通过计算 batch、epoch的数量关系来得到进度,但是无法获取到指标。因为指标的出现还在 on_train_epoch_end 之后。因此我们使用 on_fit_epoch_end 来获取训练、验证的指标。
示例如下
'''
一样的 先吧回调函数注册好
'''
def on_fit_epoch_end(trainer):
metrics = {}
tm = trainer.metrics
metrics['mAP50-95'] = float(tm.get('metrics/mAP50-95(B)', 0))
metrics['mAP50'] = float(tm.get('metrics/mAP50(B)', 0))
metrics['precision'] = float(tm.get('metrics/precision(B)', 0))
metrics['recall'] = float(tm.get('metrics/recall(B)', 0))
has_loss_keys = any(k in tm for k in ('val/box_loss', 'val/cls_loss', 'val/dfl_loss'))
if has_loss_keys:
metrics['box_loss'] = float(tm.get('val/box_loss', 0))
metrics['cls_loss'] = float(tm.get('val/cls_loss', 0))
metrics['obj_loss'] = float(tm.get('val/dfl_loss', 0))
metrics['loss'] = float(metrics['box_loss']) + float(metrics['cls_loss']) + float(metrics['obj_loss'])
model.add_callback("on_fit_epoch_end", on_fit_epoch_end)
这样我们就可以拿到具体的数值了,我在这里把所有的训练指标都保存起来了,这样可以展示出整体的训练走势。并且在训练结束也就是 on_train_end 的时候,将所有的指标都保存下来。


这样就可以非常直观的查看每个类别的训练情况,也算做的一个可视化。挖个坑:实现中途动态调整。
以下是名词解释部分
IoU(交并比)
通俗解释:IoU 就是“你画的框,和标准答案的框,重合了多少”。
- 如果 IoU = 1,说明你的框和标准答案完美重合,一点不差。
- 如果 IoU = 0.5,说明你的框和标准答案有一半是重合的。
- 如果 IoU = 0,说明你完全画偏了,连边都没挨着。
评估指标 Metrics
这部分是看模型学得“有多好”,数值越接近 1(或 100%)越好。
1. P(Precision,精确率)
- 解释:模型说“这是猫”的所有结果里,到底有多少真的是猫?
- 人话:如果 P 很高,说明模型很少大惊小怪(把背景误认成目标,也就是误检少)。
2. R(Recall,召回率)
- 解释:图片里所有的猫,模型一共找出了多少只?
- 人话:如果 R 很高,说明模型眼力好,没漏掉目标(漏检少)。
3. mAP50
- 全称:mean Average Precision at IoU=0.50
- 解释:这是一个相对宽松的评分标准。只要模型画的框,和标准答案的框重合度达到了 50%,就算你“找对了”。
- 人话:就像考试打分,只要你答到了点子上,沾边就给分。这个指标主要看模型能不能把目标“大致找出来并且认对类别”。
4. mAP50-95
- 全称:mean Average Precision at IoU=0.50:0.95
- 解释:这是一个非常严格的评分标准。它把重合度从 50%、55%、60%… 一直要求到 95%,算出 10 次成绩,然后取平均分。
- 人话:不仅要求你找得对,还要求你的框画得极其精准,边缘必须严丝合缝。在自动驾驶、医学图像这种需要高精度的领域,大家更看重这个指标。
损失函数 Loss
这部分是看模型学得“有多痛苦”,数值越低越好(越接近 0 越好)。
1. box_loss(边界框损失)
- 解释:衡量模型画的“框的位置和大小”与真实答案的差距。
- 人话:如果 box_loss 很高,说明模型画的框要么偏离了中心,要么太大太小。这个值越低,说明框得越准。
2. cls_loss(分类损失)
- 解释:衡量模型对“目标是什么类别”的判断误差。
- 人话:框虽然画对了,但如果把“狗”认成了“猫”,cls_loss 就会变高。这个值越低,说明模型认东西越准。
3. dfl_loss(分布焦点损失)
- 解释:这是 YOLOv8 等较新版本特有的。它不直接预测框的坐标,而是预测一个“概率分布”,专门用来优化那些模糊、重叠、边缘不清晰的物体。
- 人话:当两个物体挤在一起,或者物体边缘很模糊时,模型容易懵。dfl_loss 就是强迫模型去死磕这些“难辨认的边缘”,让框贴得更紧。
总结
- 看 Loss(损失):只要
box_loss、cls_loss、dfl_loss这三条线在稳定下降,就说明模型在认真学习,没有“学废”(过拟合或欠拟合)。欠拟合就是没学会,过拟合就是不会变通 - 看 mAP(精度):只要
mAP50和mAP50-95在稳步上升,就说明模型越来越聪明。 - 看 P 和 R:如果 P 高 R 低,说明模型太保守,经常漏检;如果 R 高 P 低,说明模型太激进,经常误报。两者都高才是完美状态。
