关于YOLO训练时的回调函数-3
关于YOLO训练时的回调函数-3

关于YOLO训练时的回调函数-3

我们没有相见,却是此刻最好的相聚。

今天补上回调函数在完成一轮拟合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_losscls_lossdfl_loss 这三条线在稳定下降,就说明模型在认真学习,没有“学废”(过拟合或欠拟合)。欠拟合就是没学会,过拟合就是不会变通
  • 看 mAP(精度):只要 mAP50 和 mAP50-95 在稳步上升,就说明模型越来越聪明。
  • 看 P 和 R:如果 P 高 R 低,说明模型太保守,经常漏检;如果 R 高 P 低,说明模型太激进,经常误报。两者都高才是完美状态。