赞
踩
#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:]
所能检出框的最大边长为 ( 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_max−1)∗2∗max_stride, 原始yolov8中,strides为[8, 16, 32],self.reg_max为16,因此检测框的最大边长为(16-1)x2x32=960
检查训练数据标签有无问题;
如果自行更改了ultralytics仓的代码,请确认更改的代码是否正确;
将self.reg_max设置为1,即不采用dfl loss,查看检测框是否正常;
如果不采用dfl loss检测框正常时,可选择不采用dfl训练,如果想继续采用dfl训练时,要调节各loss函数的权重、batchsize和初始学习率:
分析:dfl loss是检测框和真实框比较相近时(即在真实框的某个相近范围内),loss就会很小,个人理解是一种软标签,而我们平时用的box loss是硬标签,此时要加大box loss在loss中的权重
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。