yolov8检测框过小解决方案

文章讲述了在使用UltralyticsYOLO版本8.0.117时遇到的训练问题,包括如何保留验证集上的检测图以及如何追踪训练和验证集上的检测框最大边长。针对大目标检测框过小的问题,提出了修改Detect类的self.reg_max参数和调整dflloss权重、batchsize及学习率的解决方案。建议在调试阶段减小训练集规模并动态调整训练参数以优化模型性能。
摘要由CSDN通过智能技术生成

说明

  • 此篇文章写作时,ultralytics更新至8.0.117,后续版本可能已经针对以下问题进行更改;
  • 因ultralytics当前更新比较频繁,前期使用时,不建议采用pip安装库,而采用拉取ultralytics仓放置在代码中调用;
  • ultralytics训练过程中没有保留在验证集上的检测图,建议保留,方式为:屏蔽ultralytics/yolo/engine/validator.py BaseValidator类__call__函数中以下代码:
#self.args.plots = trainer.stopper.possible_stop or (trainer.epoch == trainer.epochs - 1)
  • 跟踪训练过程中训练集和验证集上检测框最大边长:

    • 训练集上最大边长:ultralytics/yolo/utils/loss.py(此为8.0.117版本位置,前期版本位置不太一样,找到训练的loss函数即可),在loss函数中加入打印,即以下代码中的print

      
      pred_bboxes = self.bbox_decode(anchor_points, pred_distri)  # xyxy, (b, h*w, 4)
      AA = (pred_bboxes.detach() * stride_tensor)
      print('pred w max:', (AA[:,:,2]-AA[:,:,0]).max())
      print('pred h max:', (AA[:,:,3]-AA[:,:,1]).max())
      _, target_bboxes, target_scores, fg_mask, target_gt_idx = self.assigner(
      pred_scores.detach().sigmoid(), (pred_bboxes.detach() * stride_tensor).type(gt_bboxes.dtype),
      anchor_points * stride_tensor, gt_labels, gt_bboxes, mask_gt)
      
    • 验证集上最大边长:ultralytics/yolo/utils/plotting.py中 output_to_target函数中加入打印,以下代码中的try … except…代码:

      def output_to_target(output, max_det=300):
          """Convert model output to target format [batch_id, class_id, x, y, w, h, conf] for plotting."""
          targets = []
          for i, o in enumerate(output):
              box, conf, cls = o[:max_det, :6].cpu().split((4, 1, 1), 1)
              try:
                  print('max w:', (box[:, 2] - box[:, 0]).max())
                  print('max h:', (box[:, 3] - box[:, 1]).max())
              except Exception as e:
                  print(e)
              j = torch.full((conf.shape[0], 1), i)
              targets.append(torch.cat((j, cls, xyxy2xywh(box), conf), 1))
          targets = torch.cat(targets, 0).numpy()
          return targets[:, 0], targets[:, 1], targets[:, 2:]
      

问题描述

  1. 无论是目标检测还是实例分割,当图像中存在非常大的目标时,检测框过小;

解决方案

  1. 修改ultralytics/nn/modules/head.py Detect类的参数self.reg_max为更大值,使得 ( s e l f . r e g _ m a x − 1 ) ∗ 2 ∗ m a x _ s t r i d e (self.reg\_max-1)*2*max\_stride (self.reg_max1)2max_stride>最大目标边长

所能检出框的最大边长为 ( s e l f . r e g _ m a x − 1 ) ∗ 2 ∗ m a x _ s t r i d e (self.reg\_max-1)*2*max\_stride (self.reg_max1)2max_stride, 原始yolov8中,strides为[8, 16, 32],self.reg_max为16,因此检测框的最大边长为(16-1)x2x32=960

  1. 如果1调整后检测框依然过小,请按照以下方式调整:
  • 检查训练数据标签有无问题;

  • 如果自行更改了ultralytics仓的代码,请确认更改的代码是否正确;

  • 将self.reg_max设置为1,即不采用dfl loss,查看检测框是否正常;

  • 如果不采用dfl loss检测框正常时,可选择不采用dfl训练,如果想继续采用dfl训练时,要调节各loss函数的权重、batchsize和初始学习率:

    分析:dfl loss是检测框和真实框比较相近时(即在真实框的某个相近范围内),loss就会很小,个人理解是一种软标签,而我们平时用的box loss是硬标签,此时要加大box loss在loss中的权重

    • Step1: 在训练集中随机挑选200张左右作为训练集,加快验证速度;
    • Step2: box loss的权重扩大为原来的2倍,训练30个epoch左右,观察验证集上的检测框是否正常;
    • step3: 如果检测框依然过小,尝试将初始学习率扩大为原来的2倍、4倍、5倍,训练30个epoch左右,观察验证集上的检测框是否正常;
    • step4: 重复step2和step3直至检测框正常;
    • step5: 更换为原始数据集,注:如果调大batchsize, 初始学习率也要相应增大;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤劳的凌菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值