位置: IT常识 - 正文

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

编辑:rootadmin
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU 《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU文章目录《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoUIoU出现背景什么是IoU?IoU发展历程GIoU(CVPR2019)DIoU(AAAI2020)CIoU(AAAI2020)EIoU(arXiv2021)αIoU(NeurlPS2021)SIoU(arXiv2022)各IoU源代IoUGIoUDIoUCIoUIoU出现背景

推荐整理分享《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。因此,更好的定位有利于模型精度的提高。在IoU Loss提出来之前,检测上有关候选框的回归主要是通过坐标的回归损失来优化。但L1 Loss和L2 Loss存在比较大的问题:

L1 Loss的问题:损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。L2 Loss的问题:损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。

而且,基于L1/L2 Loss的坐标回归不具有尺度不变性,且并没有将四个坐标之间的相关性考虑进去。因此,像L1/L2 Loss直接的坐标回归实际上很难描述两框之间的相对位置关系。

因此,在ACM2016的论文中提出了IoU loss,它将四个坐标点看成一个整体进行计算,具有尺度不变性(也就是对尺度不敏感)。IoU Loss的定义是先求出预测框和真实框之间的交集和并集之比,再求负对数,但是在实际使用中我们常常将IoU Loss写成1-IoU。如果两个框重合则交并比等于1,Loss为0说明重合度非常高。因此,IoU的取值范围为[0,1]。

什么是IoU?

IOU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。

IoU发展历程

虽然IoU Loss虽然解决了Smooth L1系列变量相互独立和不具有尺度不变性的两大问题,但是它也存在两个问题:

当预测框和目标框不相交时,即IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。如上图三个框,假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,即其IoU值相同时,IoU值不能反映两个框是如何相交的。GIoU(CVPR2019)

针对IoU无法反映两个框是如何相交的问题,GIoU通过引入预测框和真实框的最小外接矩形(类似于图像处理中的闭包区域)来获取预测框、真实框在闭包区域中的比重。这样子,GIoU不仅可以关注重叠区域,还可以关注其他非重合区域,能比较好的反映两个框在闭包区域中的相交情况。

从公式上来看,GIoU是一种IoU的下界,取值范围[-1,1]。在两者重合的时候取最大值1,在两者无交集且无限远的时候取最小值-1。因此,与IoU相比,GIoU是一个比较好的距离度量指标。

DIoU(AAAI2020)

虽然GIoU通过引入闭包区域缓解了预测框与真实框相交位置的衡量问题,但其实际上仍存在两个问题:

对每个预测框与真实框均要去计算最小外接矩形,计算及收敛速度受到限制当预测框在真实框内部时,GIoU退化为IoU,也无法区分相对位置关系

因此,考虑到GIoU的缺点,DIoU在IoU的基础上直接回归两个框中心点的欧式距离,加速了收敛速度。DIoU的惩罚项是基于中心点的距离和对角线距离的比值。这样就避免了GIoU在两框距离较远时产生较大闭包时所造成的Loss值较大而难以优化的情况。

CIoU(AAAI2020)

虽然DIoU Loss通过中心点回归缓解了两框距离较远时难优化的问题,但DIoU Loss仍存在两框中心点重合,但宽高比不同时,DIoU Loss退化为IoU Loss的问题。因此,为了得到更加精准的预测框,CIoU在DIoU的基础上增加了一个影响因子,即增加了预测框与真实框之间长宽比的一致性的考量。

比如上面三种情况,目标框包裹预测框,本来DIoU可以起作用。

但预测框的中心点的位置都是一样的,因此按照DIoU的计算公式,三者的值都是相同的。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

CIoU Loss虽然考虑了边界框回归的重叠面积、中心点距离及长宽比。但是其公式中的v反映的时长宽比的差异,而不是宽高分别与其置信度的真实差异,所以有时会阻碍模型有效的优化。

EIoU(arXiv2021)

EIoU在CIoU的基础上将长宽比拆开,明确地衡量了三个几何因素的差异,即重叠区域、中心点和边长,同时引入Fcoal loss解决了难易样本不平衡的问题。

αIoU(NeurlPS2021)

αIoU将现有的基于IoU 的损失进行了一个推广

使得αIoU可以显着超越现有的基于 IoU 的损失,通过调节α,使探测器更灵活地实现不同水平的bbox回归精度,并且αIoU对小数据集和噪声的鲁棒性更强

SIoU(arXiv2022)

传统的目标检测损失函数依赖于边界框回归指标的聚合,例如预测框和真实框(即 GIoU、CIoU、ICIoU 等)的距离、重叠区域和纵横比。然而,迄今为止提出和使用的方法都没有考虑期望的真实框和预测框之间不匹配的方向。这种不足导致收敛速度较慢且效率较低,因为预测框在训练过程中可能会“四处游荡”,最终会产生一个更差的模型。

SIoU提出了一种新的损失函数,重新定义了惩罚度量,考虑了期望回归之间的向量夹角。

SIoU损失函数由4个成本函数组成

Angle cost

Distance cost

Shape cost

IoU cost

将 SIoU 应用于 COCO-train/COCO-val 与其他损失函数相比,提高了 +2.4% (mAP@0.5:0.95) 和 +3.6%(mAP@0.5)

各IoU源代IoUimport numpy as npdef Iou(box1, box2, wh=False): if wh == False:xmin1, ymin1, xmax1, ymax1 = box1xmin2, ymin2, xmax2, ymax2 = box2 else:xmin1, ymin1 = int(box1[0]-box1[2]/2.0), int(box1[1]-box1[3]/2.0)xmax1, ymax1 = int(box1[0]+box1[2]/2.0), int(box1[1]+box1[3]/2.0)xmin2, ymin2 = int(box2[0]-box2[2]/2.0), int(box2[1]-box2[3]/2.0)xmax2, ymax2 = int(box2[0]+box2[2]/2.0), int(box2[1]+box2[3]/2.0) # 获取矩形框交集对应的左上角和右下角的坐标(intersection) xx1 = np.max([xmin1, xmin2]) yy1 = np.max([ymin1, ymin2]) xx2 = np.min([xmax1, xmax2]) yy2 = np.min([ymax1, ymax2]) # 计算两个矩形框面积 area1 = (xmax1-xmin1) * (ymax1-ymin1) area2 = (xmax2-xmin2) * (ymax2-ymin2) inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1])) #计算交集面积 iou = inter_area / (area1+area2-inter_area+1e-6)  #计算交并比 return iouGIoUdef Giou(rec1,rec2): #分别是第一个矩形左右上下的坐标 x1,x2,y1,y2 = rec1 x3,x4,y3,y4 = rec2 iou = Iou(rec1,rec2) area_C = (max(x1,x2,x3,x4)-min(x1,x2,x3,x4))*(max(y1,y2,y3,y4)-min(y1,y2,y3,y4)) area_1 = (x2-x1)*(y1-y2) area_2 = (x4-x3)*(y3-y4) sum_area = area_1 + area_2 w1 = x2 - x1 #第一个矩形的宽 w2 = x4 - x3 #第二个矩形的宽 h1 = y1 - y2 h2 = y3 - y4 W = min(x1,x2,x3,x4)+w1+w2-max(x1,x2,x3,x4) #交叉部分的宽 H = min(y1,y2,y3,y4)+h1+h2-max(y1,y2,y3,y4) #交叉部分的高 Area = W*H #交叉的面积 add_area = sum_area - Area #两矩形并集的面积 end_area = (area_C - add_area)/area_C #闭包区域中不属于两个框的区域占闭包区域的比重 giou = iou - end_area return giouDIoUdef Diou(bboxes1, bboxes2): rows = bboxes1.shape[0] cols = bboxes2.shape[0] dious = torch.zeros((rows, cols)) if rows * cols == 0:# return dious exchange = False if bboxes1.shape[0] > bboxes2.shape[0]: bboxes1, bboxes2 = bboxes2, bboxes1 dious = torch.zeros((cols, rows)) exchange = True # #xmin,ymin,xmax,ymax->[:,0],[:,1],[:,2],[:,3] w1 = bboxes1[:, 2] - bboxes1[:, 0] h1 = bboxes1[:, 3] - bboxes1[:, 1] w2 = bboxes2[:, 2] - bboxes2[:, 0] h2 = bboxes2[:, 3] - bboxes2[:, 1] area1 = w1 * h1 area2 = w2 * h2 center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2 center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2 center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2 center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2 inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:]) inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2]) out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:]) out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2]) inter = torch.clamp((inter_max_xy - inter_min_xy), min=0) inter_area = inter[:, 0] * inter[:, 1] inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2 outer = torch.clamp((out_max_xy - out_min_xy), min=0) outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2) union = area1+area2-inter_area dious = inter_area / union - (inter_diag) / outer_diag dious = torch.clamp(dious,min=-1.0,max = 1.0) if exchange: dious = dious.T return diousCIoUdef bbox_overlaps_ciou(bboxes1, bboxes2): rows = bboxes1.shape[0] cols = bboxes2.shape[0] cious = torch.zeros((rows, cols)) if rows * cols == 0: return cious exchange = False if bboxes1.shape[0] > bboxes2.shape[0]: bboxes1, bboxes2 = bboxes2, bboxes1 cious = torch.zeros((cols, rows)) exchange = True w1 = bboxes1[:, 2] - bboxes1[:, 0] h1 = bboxes1[:, 3] - bboxes1[:, 1] w2 = bboxes2[:, 2] - bboxes2[:, 0] h2 = bboxes2[:, 3] - bboxes2[:, 1] area1 = w1 * h1 area2 = w2 * h2 center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2 center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2 center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2 center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2 inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:]) inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2]) out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:]) out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2]) inter = torch.clamp((inter_max_xy - inter_min_xy), min=0) inter_area = inter[:, 0] * inter[:, 1] inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2 outer = torch.clamp((out_max_xy - out_min_xy), min=0) outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2) union = area1+area2-inter_area u = (inter_diag) / outer_diag iou = inter_area / union with torch.no_grad(): arctan = torch.atan(w2 / h2) - torch.atan(w1 / h1) v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(w2 / h2) - torch.atan(w1 / h1)), 2) S = 1 - iou alpha = v / (S + v) w_temp = 2 * w1 ar = (8 / (math.pi ** 2)) * arctan * ((w1 - w_temp) * h1) cious = iou - (u + alpha * ar) cious = torch.clamp(cious,min=-1.0,max = 1.0) if exchange: cious = cious.T return cious

参考文献

https://mp.weixin.qq.com/s/jLnde0Xms-99g4z16OE9VQ

DIoU、CIoU、GIoU、IoU再理解结合代码

IoU:《UnitBox: An Advanced Object Detection Network》

GIoU:《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》

D/C IoU:《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》

EIoU:《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》

αIoU:《Alpha-IoU: A Family of Power Intersection over Union Losses for Bounding Box Regression》

SIoU:《SIoU Loss: More Powerful Learning for Bounding Box Regression》

本文链接地址:https://www.jiuchutong.com/zhishi/299593.html 转载请保留说明!

上一篇:关于HTML中常用选择器(html用语)

下一篇:基于stm32的太空人温湿度时钟项目——DHT11(HAL库)(基于stm32的飞行器)

  • 闪退讯飞学习机(闪退)(讯飞闪退是怎么回事)

    闪退讯飞学习机(闪退)(讯飞闪退是怎么回事)

  • 如果你爱的人已经不爱你了怎么办(如果你爱的不是我)(如果你爱的人也爱着你)

    如果你爱的人已经不爱你了怎么办(如果你爱的不是我)(如果你爱的人也爱着你)

  • 华为mate30pro数据网速太慢怎么办(华为mate30pro数据线连接电脑)

    华为mate30pro数据网速太慢怎么办(华为mate30pro数据线连接电脑)

  • 手机充满电关机放5个月会坏吗(手机充满电关机后再开机就没电了)

    手机充满电关机放5个月会坏吗(手机充满电关机后再开机就没电了)

  • 开通阿里巴巴需要什么条件(开通阿里巴巴需要什么)

    开通阿里巴巴需要什么条件(开通阿里巴巴需要什么)

  • iphone怎么互传软件(苹果手机如何互传软件)

    iphone怎么互传软件(苹果手机如何互传软件)

  • 微信怎么调黑色(微信怎么调黑色屏幕)

    微信怎么调黑色(微信怎么调黑色屏幕)

  • Word如何为文字设置渐变填充效果(word如何为文字添加拼音)

    Word如何为文字设置渐变填充效果(word如何为文字添加拼音)

  • 一个空格怎么打两行字(一个空格怎么打字)

    一个空格怎么打两行字(一个空格怎么打字)

  • ipadair3悬浮球怎么设置(ipadair3悬浮球怎么设置返回)

    ipadair3悬浮球怎么设置(ipadair3悬浮球怎么设置返回)

  • 为什么改不了群昵称(改不了群昵称是怎么回事)

    为什么改不了群昵称(改不了群昵称是怎么回事)

  • minihdmi和hdmi区别(miniHDMI和HDMI区别)

    minihdmi和hdmi区别(miniHDMI和HDMI区别)

  • 抖音极速版能看直播么(抖音极速版能看到抖音的消息吗)

    抖音极速版能看直播么(抖音极速版能看到抖音的消息吗)

  • 苹果锁屏去掉手电筒(苹果锁屏去掉手机图标)

    苹果锁屏去掉手电筒(苹果锁屏去掉手机图标)

  • 绿洲点赞再取消会收到消息吗(绿洲点赞怎么取消)

    绿洲点赞再取消会收到消息吗(绿洲点赞怎么取消)

  • 桌面上的图标可以用来表示(桌面上的图标可以放在任务栏的开始菜单中吗)

    桌面上的图标可以用来表示(桌面上的图标可以放在任务栏的开始菜单中吗)

  • 抖音答题提示设备异常(抖音答题又开始了)

    抖音答题提示设备异常(抖音答题又开始了)

  • 苹果xr怎么设置铃声模式(苹果xr怎么设置动态壁纸)

    苹果xr怎么设置铃声模式(苹果xr怎么设置动态壁纸)

  • qq实名认证怎么修改(qq实名认证怎么解除绑定)

    qq实名认证怎么修改(qq实名认证怎么解除绑定)

  • 苹果x显示edge怎么解决(苹果X显示edge怎么解决)

    苹果x显示edge怎么解决(苹果X显示edge怎么解决)

  • oppo reno升降摄像头怎么用(OPPO Reno升降摄像头多少钱)

    oppo reno升降摄像头怎么用(OPPO Reno升降摄像头多少钱)

  • 小米pay怎么刷公交(小米pay怎么用)

    小米pay怎么刷公交(小米pay怎么用)

  • 快手绑定的手机号丢了怎么解绑(快手绑定的手机号不能用了登不上去怎么办)

    快手绑定的手机号丢了怎么解绑(快手绑定的手机号不能用了登不上去怎么办)

  • 京豆如何使用(京豆如何使用方法)

    京豆如何使用(京豆如何使用方法)

  • ps全屏快捷键(ps所有快捷键)

    ps全屏快捷键(ps所有快捷键)

  • 【chatgpt】chatgpt APi使用 GPT3(chattra)

    【chatgpt】chatgpt APi使用 GPT3(chattra)

  • 营业税金及附加包括哪些
  • 委托加工业务中,委托方是纳税义务人
  • 幼儿园经营支出指什么
  • 应付账款周转率和存货周转率公式
  • 企业所得税的营业成本
  • 税款已缴未入库是怎么回事
  • 没开发票的收入可以不入账吗
  • 存货损失
  • 购销印花税会计分录
  • 怎样填列分析资产负债表
  • 职工暖气费报销算福利
  • 不得抵扣的会计分录
  • 超过认证期限的发票怎么处理
  • 费用进项税额转出怎么做账务处理分录
  • 建设厂房需要几个证
  • 未收到增值税专用发票怎么处理
  • 银行转贴现业务违法吗
  • 小规模纳税人隔月可以作废发票吗
  • 增值税税控系统技术维护费计入什么科目
  • 个体工商户的税收优惠政策有哪些
  • 代收代付业务是什么意思
  • 专用发票离线限额是什么意思
  • 房地产企业申请破产,原来的购房合同还有效吗?
  • 智能化的发展现状与趋势
  • vmware15虚拟机
  • 工程筹建期间发票怎么开
  • 如何办理存款证明
  • 新买的电脑如何激活windows
  • nod32kui.exe - nod32kui是什么进程 作用是什么
  • 电脑CPU性能天梯
  • php中面向对象
  • 销项负数发票应该给谁
  • mcappins.exe - mcappins进程是什么文件 什么意思.
  • 物业管理单位收取的物业费征不征收增值税
  • php实现分页查询
  • 保姆级官方yolov7的训练自己的数据集以及项目部署
  • vue watch监听localstorage变化
  • python的Django框架
  • vue监听页面加载完毕
  • 学python真的好就业吗
  • 最强alpha什么意思
  • ifconfig命令配置地址
  • 详解Yii2 rules 的验证规则
  • telnet命令大全
  • 注销对公账户要去原支行吗
  • 一般纳税人暂估入账的会计分录
  • 帝国cms常见的英文
  • 股东投钱一般怎么投
  • 百旺如何作废发票
  • 增值税发票扩版申请说明
  • 投资收益属于资产嘛
  • 固定资产折旧的计算方法
  • 向税务局缴纳工会经费的没计提
  • 合同履约成本与一份当前或预期取得的区别
  • 销售货款是什么
  • 应收账款因质量问题被扣除的损失可以税前扣除吗
  • 政府补助计入资本公积吗
  • 应付职工薪酬属不属于流动负债
  • 出纳的现金日记账表格怎么做
  • 如何卸载影子还原软件
  • win7自带防火墙关闭后自己打开啥原因
  • windows更新后桌面没反应
  • win8怎样恢复系统
  • ExtJS4中的requires使用方法示例介绍
  • html+css代码
  • jquery.upload.js
  • python event.pos
  • 关于jQuery中的DOM操作,下列哪种方法用来复制元素?
  • for循环取数据
  • python3.5怎么保存
  • js图片轮播和点击切换
  • 后缀名为是什么意思
  • python怎么用
  • htc windows
  • js构造器constructor
  • 税务ukey怎么升级不了
  • 国家税务局天津市税务总局官网
  • 广东省国家税务总局稽查局局长
  • 资产管理公司收购不良资产后怎么处置
  • 上海纳税总额
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设