前言

针对目标检测框Box(x1,y1,x2,y2)的回归学习中,网络损失函数从最早的IoU到GIoU,再到DIoU、CIoU和EIoU,现在出现了SIoU。那么他们都是什么呢?又由哪些优点?

正文

IOU就是交并比,预测框和真实框相交区域面积和合并区域面积的比值,计算公式如下:
优点:1、能够很好的反映重合度;2、具有尺度不变形
缺点:不相交时,值为0,无法反映中心距离

GIoU克服了两个框不相交时IoU恒为0,损失恒为1,没法优化的问题。


GIoU引入了一个最小闭包区的概念,即能将预测框和真实框包裹住的最小矩形框,其中,Ac为最小闭包区,u为预测框和真实框的并集,那么GIoU第二项的分子就是上图中白色区域,白色区域与最小闭包区的比值越高,loss越高。
GIoU具有以下特点:

  1. GIoU对scale不敏感
  2. GIoU是IoU的下界,取值为[-1, 1]
  3. GIoU除了关注重叠区域不同,还关注了非重叠区域,能够更好的反应重合度

DIoU
paper:https://arxiv.org/pdf/1911.08287.pdf 提出DIOU和CIOU
如下图所示,当出现该场景时,计算各种基于IOU的损失函数值,LdiouL_{diou}Ldiou​能够描述检测框与gt框的位置信息。从图中我们可以看到,当处于第三幅图时,检测框和gt都位于中心,IoU=GIoU=DIoU。但位置出现差异,如第一幅图和第二幅图时,明显第二幅图的效果要好一些,此时GIOU降级成为IOU,而DIOU的损失值较大,能够较好的描述当前位置信息。


基于此场景,作者提出了DIoU。并提出了2个问题,第一:最小化两个边界框中心点的归一化距离能否加快收敛?第二:如何在回归时,能够更好的描述重叠信息,同时使得回归更准确,更快速?

bbb和bgtb^{gt}bgt分别代表预测框和gt框的中心点,ρ\rhoρ代表欧氏距离,c代表最小闭包区的对角线距离。
DIoU具有以下特点:

  1. 对scale不敏感
  2. 与GIoU 类似,与目标框不重叠时,仍然可以为边界框提供移动方向。
  3. DIoU可以直接最小化两个目标框的距离,而GIoU 优化的是两个目标框之间的面积。因此,比GIoU loss收敛快得多。
  4. 对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失

CIoU
DIoU解决了上文提到的第一个问题,归一化两个中心点的距离从而加速收敛的问题,但是还未解决第二个问题,即如何在回归时能够更好的描述重叠信息。
paper指出,预测的bbox的三个重要的因素分别是,重叠面积、中心点距离和纵横比(长宽比)。LiouL_{iou}Liou​考虑了重叠区域,而GIoU很大程度上依赖了IOU损失,DIoU则同时考虑了重叠区域和中心点距离,更进一步的,边界框的长宽比的一致性也是一个重要的几何因素。因此,基于DIoU,作者通过施加长宽比的一致性来提出了LciouL_{ciou}Lciou​。

EIoU
作者认为CIoU loss有以下两个缺点:

  • 如果预测框和gt框的长宽比是相同的,那么长宽比的惩罚项恒为0,不合理
  • 观察CIoU中w, h相对于v的梯度,发现这两个梯度是一对相反数,也就是说,w和h不能同时增大或减小,这显然也不够合理的。

针对上述问题,作者对于长宽比的惩罚项进行了替换,形成了EIoU,如下式:


其中,CwC_{w}Cw​和ChC_{h}Ch​是最小闭包的w和h。

SIoU

paper:https://arxiv.org/ftp/arxiv/papers/2205/2205.12740.pdf
作者认为以前的IoU损失都没有考虑角度问题,但框的角度确实可以影响回归,因此提出SIoU loss,其中SIoU使用4组cost组成见下:

  • 角度损失
  • 距离损失
  • 形状损失
  • IoU损失

Angle cost



Distance cost


可以看出,当α\alphaα →\rightarrow→ 0时,Distance cost的贡献大大降低。相反,α\alphaα越接近π\piπ/4,Distance cost贡献越大。随着角度的增大,问题变得越来越难。因此,γ\gammaγ被赋予时间优先的距离值,随着角度的增加。

Shape cost

IoU cost

整体LossLossLoss计算如下:


各类IoU损失计算代码如下:

import torch
import mathdef iou_loss(pred, target, eps=1e-7, reduction='mean', loss_type='iou'):""":param pred: [[x1, y1, x2, y2], [x1, y1, x2, y2], ...]:param target: [[x1, y1, x2, y2], [x1, y1, x2, y2], ...]:param eps::param reduction: "mean" or "sum":param loss_type: "iou", "giou", "diou", "ciou", "eiou" or "siou":return:"""inter_x1 = torch.max(pred[:, 0], target[:, 0])inter_y1 = torch.max(pred[:, 1], target[:, 1])inter_x2 = torch.min(pred[:, 2], target[:, 2])inter_y2 = torch.min(pred[:, 3], target[:, 3])outer_x1 = torch.min(pred[:, 0], target[:, 0])outer_y1 = torch.min(pred[:, 1], target[:, 1])outer_x2 = torch.max(pred[:, 2], target[:, 2])outer_y2 = torch.max(pred[:, 3], target[:, 3])inter_w = (inter_x2 - inter_x1 + 1.0).clamp(0.)inter_h = (inter_y2 - inter_y1 + 1.0).clamp(0.)inters = inter_w * inter_hpred_w = pred[:, 2] - pred[:, 0] + 1.0pred_h = pred[:, 3] - pred[:, 1] + 1.0tag_w = target[:, 2] - target[:, 0] + 1.0tag_h = target[:, 3] - target[:, 1] + 1.0uni = pred_h * pred_w + tag_w * tag_h - intersouter_w = (outer_x2 - outer_x1).clamp(min=0.)outer_h = (outer_y2 - outer_y1).clamp(min=0.)ious = (inters / uni).clamp(min=eps)if loss_type == 'iou':loss = -ious.log()  # -torch.log(ious)elif loss_type == 'giou':enclose = outer_w * outer_h + epsgious = ious - (enclose - uni) / encloseloss = 1 - giouselif loss_type == 'diou' or loss_type == 'ciou' or loss_type == 'eiou':c2 = outer_w ** 2 + outer_h ** 2rho2 = ((pred[:, 0] + pred[:, 2] - target[:, 0] - target[:, 2]) ** 2 +(pred[:, 1] + pred[:, 3] - target[:, 1] - target[:, 3]) ** 2) / 4dious = ious - rho2 / c2if loss_type == 'ciou':v = torch.pow((torch.atan(tag_w / tag_h) - torch.atan(pred_w / pred_h)), 2) * (4 / (math.pi ** 2))alpha = v / (1 - ious + v)cious = dious - alpha * vcious = torch.clamp(cious, min=-1.0, max=1.0)loss = 1 - ciouselif loss_type == 'eiou':rho_w2 = (tag_w - pred_w) ** 2rho_h2 = (tag_h - pred_h) ** 2cw2 = outer_w ** 2 + epsch2 = outer_h ** 2 + epseious = dious - rho_w2 / cw2 - rho_h2 / ch2loss = 1 - eiouselse:loss = 1 - diouselif loss_type == 'siou':s_cw = (pred[:, 0] + pred[:, 2] - target[:, 0] - target[:, 2]) * 0.5s_ch = (pred[:, 1] + pred[:, 3] - target[:, 1] - target[:, 3]) * 0.5sigma = torch.pow(s_cw ** 2 + s_ch ** 2, 0.5) + 1.0sin_alpha_1 = torch.abs(s_cw) / sigmasin_alpha_2 = torch.abs(s_ch) / sigmathreshold = pow(2, 0.5) / 2sin_alpha = torch.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1)angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2)rho_x = (s_cw / outer_w) ** 2rho_y = (s_ch / outer_h) ** 2gamma = angle_cost - 2distance_cost = 2 - torch.exp(gamma * rho_x) - torch.exp(gamma * rho_y)omiga_w = torch.abs(tag_w - pred_w) / torch.max(tag_w, pred_w)omiga_h = torch.abs(tag_h - pred_h) / torch.max(tag_h, pred_h)shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)sious = ious - 0.5 * (distance_cost + shape_cost)loss = 1 - siouselse:raise NotImplementedErrorif reduction == 'mean':loss = torch.mean(loss)elif reduction == 'sum':loss = torch.sum(loss)else:raise NotImplementedErrorprint(f"{loss_type} loss: {loss}")return lossif __name__ == '__main__':pred_box = torch.tensor([[2, 4, 6, 8], [5, 9, 13, 12]])gt_box = torch.tensor([[3, 4, 7, 9]])iou_loss(pred=pred_box, target=gt_box, loss_type='iou')iou_loss(pred=pred_box, target=gt_box, loss_type='giou')iou_loss(pred=pred_box, target=gt_box, loss_type='diou')iou_loss(pred=pred_box, target=gt_box, loss_type='ciou')iou_loss(pred=pred_box, target=gt_box, loss_type='eiou')iou_loss(pred=pred_box, target=gt_box, loss_type='siou')

基于深度学习的目标检测的IOU损失函数介绍相关推荐

  1. 基于深度学习的目标检测综述

    基于深度学习的目标检测算法归类和总结 整体框架 目标检测算法 主要包括:[两阶段]目标检测算法.[多阶段]目标检测算法.[单阶段]目标检测算法 什么是两阶段目标检测算法,与单阶段目标检测有什么区别? ...

  2. 综述 | 基于深度学习的目标检测算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 导读:目标检测(Object Det ...

  3. 基于深度学习的目标检测研究进展

    前言 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个人,具体的位置就是上图右侧图像两个边框(bounding-box)所在的位 ...

  4. 【深度学习】基于深度学习的目标检测研究进展

    原文出处:http://chuansong.me/n/353443351445 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个 ...

  5. 基于深度学习的目标检测算法综述(一)

    基于深度学习的目标检测算法综述(一) 基于深度学习的目标检测算法综述(二) 基于深度学习的目标检测算法综述(三) 本文内容原创,作者:美图云视觉技术部 检测团队,转载请注明出处 目标检测(Object ...

  6. 基于深度学习的目标检测技术演进:从目标检测到人脸检测

    本篇博客主要转载两篇写得好的分别介绍基于深度学习的目标检测和人脸检测的文章,最近在调研基于深度学习的人脸检测相关的文章,在网上查相关资料时,有幸看到.文末附带基于深度学习的目标检测和人脸检测相关经典文 ...

  7. 基于深度学习的目标检测发展历程:deep_learning_object_detection

    目标检测论文从 2014-2018 模型表现表格 Detector VOC07 (mAP@IoU=0.5) VOC12 (mAP@IoU=0.5) COCO (mAP) Published In R- ...

  8. 基于深度学习的目标检测算法综述(二)

    转自:https://zhuanlan.zhihu.com/p/40020809 基于深度学习的目标检测算法综述(一) 基于深度学习的目标检测算法综述(二) 基于深度学习的目标检测算法综述(三) 本文 ...

  9. 学习笔记之——基于深度学习的目标检测算法

    国庆假期闲来无事~又正好打算入门基于深度学习的视觉检测领域,就利用这个时间来写一份学习的博文~本博文主要是本人的学习笔记与调研报告(不涉及商业用途),博文的部分来自我团队的几位成员的调研报告(由于隐私 ...

  10. 基于深度学习的目标检测综述(单阶段、多阶段、FPN变体、旋转目标检测等)

    随着深度学习的发展,基于深度学习的目标检测方法因其优异的性能已经得到广泛的使用.目前经典的目标检测方法主要包括单阶段(YOLO.SSD.RetinaNet,还有基于关键点的检测方法等)和多阶段方法(F ...

最新文章

  1. 凤凰网广告包装的js
  2. NSProxy的理解和使用
  3. 打造数字化服务能力,中国联通如何借助云原生技术实现增长突围?
  4. java 内存快照怎么看_jvm内存快照dump文件太大,怎么分析
  5. mysql schema是什么_MySQL中information_schema是什么
  6. [Linux 使用(2)] 64位Linux下安装jboss-as-7.1 以及jdk1.7
  7. python读取文件并存入mysql_1.python读取txt文件并插入到mysql数据库以及将py脚本文件打包成独立的exe程序...
  8. 资料管理工具VSGoogle?
  9. 大话css预编译处理(一)通读介绍篇
  10. (秒杀项目) 4.2 用户登录和注册
  11. Best quotes from The Vampire Diary(《吸血鬼日记》经典台词)
  12. Atitit 通用服务端代理接口 转接口 attilax总结
  13. 转载——yum源的超级简单配置
  14. idea2017+kemulator搭建J2ME开发环境
  15. VMP学习笔记之壳基础(一)
  16. dage手法之 头部和banner ad tpl_header
  17. FlashFxp配置ftp
  18. error occurred during initialization of VM报错解决
  19. VB.Net几个函数split(),ubound(),lbound(),instr(),mid(),Format()与Round()
  20. 长春市计算机职业技术学校,长春职业技术学校

热门文章

  1. 软件版本中的Alpha,Beta,RC,Trial是什么意思?
  2. Bottled Water: 实时集成postgresql与kafka
  3. XML解析—开源XOM类库
  4. iOS - 距离传感器
  5. KMP,LCA(XJT Love Strings,玲珑杯 Round#8 A lonlife 1079)
  6. PHP攻防安全相关 -- 转
  7. 将docx转为pdf文档
  8. 画PCB必备的3D元器件模型下载地址整理
  9. Reducer类——hadoop
  10. 企业微信api调用报50001错误