二手网站需求建设分析,163企业邮箱登录注册入口,做外汇哪个网站看外国消息,小说阅读网站开发视频前言
本文介绍了Shape-IoU方法#xff0c;用于改进YOLOv11的边框回归损失。现有边框回归方法常忽略边框自身形状与尺度对回归的影响#xff0c;为此#xff0c;作者先对边框回归特性分析#xff0c;发现非正方形GT框中#xff0c;边框形状与尺度差异会使IoU值显著不同用于改进YOLOv11的边框回归损失。现有边框回归方法常忽略边框自身形状与尺度对回归的影响为此作者先对边框回归特性分析发现非正方形GT框中边框形状与尺度差异会使IoU值显著不同小尺度边框对GT框形状更敏感。基于此提出Shape-IoU损失函数还针对小目标检测提出相关损失函数。我们将Shape-IoU代码加入ultralytics\utils\metrics.py在ultralytics/utils/loss.py中导入并修改相关函数最后给出验证脚本和结果。文章目录 YOLOv11改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv11改进专栏文章目录前言介绍摘要文章链接创新点方法1.边框回归特性分析2.Shape-IoU核心代码YOLO11引入代码使用导入shape_iou修改 class BboxLoss验证脚本结果介绍摘要作为检测器定位分支的重要组成边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法通常考虑了GT框与预测框之间的几何关系通过使用边框间的相对位置与相对形状等计算损失而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析得出边框自身形状因素与尺度因素会对回归结果产生影响。接着基于以上结论我们我们提出了Shape-IoU方法其能够通过聚焦边框自身形状与自身尺度计算损失从而使得边框回归更为精确。最后我们通过大量的对比实验来验证本文方法实验结果表明本文方法能够有效提升检测效果且优于现有方法在不同的检测任务中达到了sota.文章链接论文地址论文地址代码地址代码地址原文作者CSDN: https://blog.csdn.net/qq_45911380/article/details/135330376视频讲解创新点本研究对边界框回归的特性进行了深入分析并得出结论在边界框回归过程中回归样本的形状与尺度因素对回归结果有显著影响。基于对现有边界框回归损失函数的考量特别是考虑到回归样本自身形状与尺度对边界框回归的影响提出了Shape-IoU损失函数。对于小目标检测任务进一步提出了Shape-Dot-Distance和Shape-NWD损失函数。采用当前最先进的单阶段检测器在不同的检测任务上进行了一系列比较实验。实验结果证实该方法在检测效果上优于现有方法并达到了行业领先水平State of the ArtSOTA。方法1.边框回归特性分析如图所示图a与图b中边框回归样本A与B的基准框GT框尺度相同样本C与D的基准框尺度亦相同。样本A与D的基准框形状相同样本B与C的基准框形状相同。样本C与D的边框尺度大于样本A与B。在图a中所有边框回归样本的偏移量deviation相同形状偏移量shape-deviation为0。图b中所有边框回归样本的形状偏移量相同偏移量为0。观察结果如下- 图a中样本A与B的偏移量相同但它们的IoU值存在差异。 - 图a中样本C与D的偏移量相同但它们的IoU值存在差异且与样本A与B相比其IoU值差异较小。 - 图b中样本A与B的形状偏移量相同但它们的IoU值存在差异。 - 图b中样本C与D的形状偏移量相同但它们的IoU值存在差异且与样本A与B相比IoU值差异较小。分析图a中样本A与B的IoU值差异可知由于GT框形状不同即长边和短边方向的偏差对IoU值的影响各异。对于小尺度边框其IoU值变化更敏感GT框形状对IoU值的影响更显著。此外图b中从形状偏移量角度分析边框回归发现回归样本的GT框形状在回归过程中影响其IoU值。基于以上分析可以得出以下结论1在非正方形GT框中即存在长边与短边的情况下假设偏移量与形状偏移量均不为0边框形状与尺度的差异会导致IoU值存在显著差异。2在相同尺度的边框回归样本中当偏移量与形状偏移量均不为0时边框形状会显著影响IoU值特别是沿边框短边方向的偏移。3在形状相同的边框回归样本中相较于大尺度样本小尺度样本的IoU值更易受GT框形状影响。2.Shape-IoU其中scale为尺度因子与数据集中目标的尺度相关ww与hh分别为水平方向与竖直方向的权重系数与GT框的形状相关。对应的边框回归损失函数如下核心代码defshape_iou(box1,box2,xywhTrue,scale0,eps1e-7):(x1,y1,w1,h1),(x2,y2,w2,h2)box1.chunk(4,-1),box2.chunk(4,-1)w1_,h1_,w2_,h2_w1/2,h1/2,w2/2,h2/2b1_x1,b1_x2,b1_y1,b1_y2x1-w1_,x1w1_,y1-h1_,y1h1_ b2_x1,b2_x2,b2_y1,b2_y2x2-w2_,x2w2_,y2-h2_,y2h2_# Intersection areainter(torch.min(b1_x2,b2_x2)-torch.max(b1_x1,b2_x1)).clamp(0)*\(torch.min(b1_y2,b2_y2)-torch.max(b1_y1,b2_y1)).clamp(0)# Union Areaunionw1*h1w2*h2-intereps# IoUiouinter/union#Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distanceww2*torch.pow(w2,scale)/(torch.pow(w2,scale)torch.pow(h2,scale))hh2*torch.pow(h2,scale)/(torch.pow(w2,scale)torch.pow(h2,scale))cwtorch.max(b1_x2,b2_x2)-torch.min(b1_x1,b2_x1)# convex widthchtorch.max(b1_y2,b2_y2)-torch.min(b1_y1,b2_y1)# convex heightc2cw**2ch**2eps# convex diagonal squaredcenter_distance_x((b2_x1b2_x2-b1_x1-b1_x2)**2)/4center_distance_y((b2_y1b2_y2-b1_y1-b1_y2)**2)/4center_distancehh*center_distance_xww*center_distance_y distancecenter_distance/c2#Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shapeomiga_whh*torch.abs(w1-w2)/torch.max(w1,w2)omiga_hww*torch.abs(h1-h2)/torch.max(h1,h2)shape_costtorch.pow(1-torch.exp(-1*omiga_w),4)torch.pow(1-torch.exp(-1*omiga_h),4)#Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoUiouiou-distance-0.5*(shape_cost)returniou# IoUYOLO11引入代码源代码加入到ultralytics\utils\metrics.py,直接加到文件最后即可。defshape_iou(box1,box2,xywhTrue,scale0,eps1e-7):(x1,y1,w1,h1),(x2,y2,w2,h2)box1.chunk(4,-1),box2.chunk(4,-1)w1_,h1_,w2_,h2_w1/2,h1/2,w2/2,h2/2b1_x1,b1_x2,b1_y1,b1_y2x1-w1_,x1w1_,y1-h1_,y1h1_ b2_x1,b2_x2,b2_y1,b2_y2x2-w2_,x2w2_,y2-h2_,y2h2_# Intersection areainter(torch.min(b1_x2,b2_x2)-torch.max(b1_x1,b2_x1)).clamp(0)*\(torch.min(b1_y2,b2_y2)-torch.max(b1_y1,b2_y1)).clamp(0)# Union Areaunionw1*h1w2*h2-intereps# IoUiouinter/union#Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distanceww2*torch.pow(w2,scale)/(torch.pow(w2,scale)torch.pow(h2,scale))hh2*torch.pow(h2,scale)/(torch.pow(w2,scale)torch.pow(h2,scale))cwtorch.max(b1_x2,b2_x2)-torch.min(b1_x1,b2_x1)# convex widthchtorch.max(b1_y2,b2_y2)-torch.min(b1_y1,b2_y1)# convex heightc2cw**2ch**2eps# convex diagonal squaredcenter_distance_x((b2_x1b2_x2-b1_x1-b1_x2)**2)/4center_distance_y((b2_y1b2_y2-b1_y1-b1_y2)**2)/4center_distancehh*center_distance_xww*center_distance_y distancecenter_distance/c2#Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shapeomiga_whh*torch.abs(w1-w2)/torch.max(w1,w2)omiga_hww*torch.abs(h1-h2)/torch.max(h1,h2)shape_costtorch.pow(1-torch.exp(-1*omiga_w),4)torch.pow(1-torch.exp(-1*omiga_h),4)#Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoUiouiou-distance-0.5*(shape_cost)print(这里是shape-iou计算出来的iou:------------ ,iou)returniou# IoU使用导入shape_iouultralytics/utils/loss.py导包导入shape_ioufrom.metricsimportbbox_iou,probiou,shape_iou修改 class BboxLoss修改ultralytics/utils/loss.py的BboxLoss函数将iou bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywhFalse, CIoUTrue)替换为iou shape_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask])验证脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(/root/ultralytics-main/ultralytics/cfg/models/11/yolo11.yaml)# 修改为自己的数据集地址model.train(data/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerSGD,ampTrue,projectruns/train,nameyolo11,)结果可以打印我们在shape_iou的print