yolov8检测框过小解决方案

news/2024/11/29 1:52:00/

说明

  • 此篇文章写作时,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, 初始学习率也要相应增大;

http://www.ppmy.cn/news/825668.html

相关文章

dota 服务器 无响应,dota2卡死出现无响应蓝屏红字解决方法

dota2是款众多玩家都非常青睐的一款网络游戏,可是在电脑中玩的时候,想必很多玩家都会碰到这样的现象,比如玩odta2选人或者进画面会卡住不动或者出现无响应的情况,或者右上角显示红字warning:connection problem&#x…

Linux下dota2启动失败解决办法

前段时间听说dota2有linux版本,果断下载安装了一个,当时搞驱动什么的把电脑搞挂了好几次,最后总算能跑了,然后换工作就好久没玩,这两天更新了好多东西之后,发现起不来了,不知道什么原因&#xf…

国服Dota2无法更新故障解决方法一例

为了下载速度更快所以下载了国服的Dota2安装包(最后证明这种方式折腾起来更加费劲),安装后一切无异,启动程序一直显示需要更新,卡住不动了,校验文件完整性也是不动。关联到steam后,仍然故障依旧…

对于dota2与lol游戏的一些想法

dota2和lol作为moba游戏的两个标杆,常被拿来一起对比 一是因为lol制作团队是dota2制作者之一羊刀(dota游戏中羊刀这一装备的冠名者)领衔制作的,听说还参考了大量dota2论坛的玩家想法,并且最初lol的宣传口号也是“dota2…

刀塔2显示连接服务器调解中,大师调解正在连接至dota2网络 【操作方案】 的具体步骤_...

近日有小伙伴发现电脑出现问题了,在突然遇到正在连接至dota2网络 时不知所措了,对于正在连接至dota2网络 带来的问题,其实很好解决正在连接至dota2网络 带来的问题,下面小编跟大家介绍正在连接至dota2网络 解决方法: 一…

dota2大魔导师出装java_DOTA2酱油大魔导师拉比克加点出装攻略

TI2Dendi炙手可热的中单热门,如今FYGOD惊艳四方的无双酱油。拉比克,这个神秘而迷人的小身板,在任何时代,任何版本,都可以风生水起的英雄。在临近的TI6上,拉比克肯定会频频亮相大展身手。 如今的拉比克注定不…

linux刀塔2无法输入中文,Dota 2 - 性能问题、崩溃或无法启动 - Steam Support

崩溃或无法启动,伴有特定出错提示 特定的错误信息中,查看是否有与该出错提示相关的文章。 如果您没有找到相关文章,请阅读下文,为您遇到的问题进行故障排除。 性能问题与崩溃故障排除 请阅读并完成 Dota 2 开发人员提供的常见 Dot…

leetcode之Dota2参议院

题目如下:leetcode 第649题 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可…