IoU:使用最广泛的检测框loss。
GIoU:2019年CVPR Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression
DIoU和CIoU:2020年AAAI Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
#-------------------------------------------------------------------------------------------------------------------------------------------------------#

##IOU

介绍
IoU 的全称为交并比(Intersection over Union),通过这个名称我们大概可以猜到 IoU 的计算方法。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。计算过程如下:

IOU的优点:

  • IOU可以作为距离,loss=1-IOU。但是当两个物体不相交时无回传梯度。
  • IOU对尺度变化具有不变性,即不受两个物体尺度大小的影响。
    以A,B两个box重合的情况为例,若boxes1=[[0,0,10,10],[0,0,5,5]],boxes2=[[0,0,10,10],[0,0,5,5]],此时IOU=[1,1]

IOU的缺点:

  • 无法衡量两框是相邻还是甚远,如下图2所示,两种情况下IOU均为0,(a)中两框距离较近,(b)中两框明显距离要远,但是仅从IOU数值上无法判断两者距离较近还是较远(两个物体不相交时无回传梯度)

  • IOU不能反映两个物体如何重叠(相交方式)。
    如下图3所示,两种情况下的IOU均为0.1428,(a)中两框要比(b)中的相交更整齐一些,但是IOU并没有反映出这个特点。

代码如下:

def bb_intersection_over_union(boxA, boxB):
#定义一个函数来计算IOU的值boxA = [int(x) for x in boxA] #从boxA中提取每一个元素x,并且每一个元素均为正数boxB = [int(x) for x in boxB]xA = max(boxA[0], boxB[0]) # #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最左边值yA = max(boxA[1], boxB[1]) #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最上边值xB = min(boxA[2], boxB[2]) #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最右边值yB = min(boxA[3], boxB[3]) #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最下边值interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)  #BoxA,BoxB相交阴影部分面积boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)  #boxA的面积boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1) #boxB的面积iou = interArea / float(boxAArea + boxBArea - interArea)   #阴影部分/ boxA、boxB总的面积return iou

#-------------------------------------------------------------------------------------------------------------------------------------------------------#

GIOU

介绍
GIOU是为克服IOU的缺点同时充分利用优点而提出的.(论文:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression)
GIOU计算公式:

可以这样理解:

1.假设A为预测框,B为真实框,S是所有框的集合
2.不管A与B是否相交,C是包含A与B的最小框(包含A与B的最小凸闭合框),C也属于S集合
3.首先计算IoU,A与B的交并比
4.再计算C框中没有A与B的面积,比上C框面积;
5.IoU减去前面算出的比;得到GIoU
6.Note:本文提出的例子中A、B均是矩形框,但是也可以为其他的。比如:A、B为椭圆形,那么此时C将是包含A、B的最小椭圆形;或者A、B均是3D box也可。
过程如下图5所示:

论文作者给出几个GIoU的性质:

  • 对尺度的不变性
  • GIoU可认为是IoU的下界,小于等于IoU
    如boxes1=[0,0,10,10],boxes2=[0,0,10,10],此时IOU=1,GIOU=1,这种情况下A与B重合
    boxes1=[0,0,10,10],boxes2=[0,10,10,20],此时IOU=0,GIOU=0
    boxes1=[0,0,10,10],boxes2=[5,5,15,15],此时IOU=0.1428,GIOU=-0.07936
  • -1<=GIoU<=1,当A=B时,GIoU=IoU=1;当A与B不相交而且离得很远时,GIoU(A,B)趋向于-1。
    如boxes1=[[10,10,15,15],[100,100,105,105]],boxes2=[5,5,10,10],计算的GIOU为[-0.5,-0.995],即A与B不相交,随着两者距离增加,GIOU值将趋向于-1,如下图6所示。
  • 因此选用loss=1-GIoU
  • GIoU能够更好地反应相交情况。如上面图3所示,虽然两种情况下IOU一致,但是(a)中相交的更为整齐,因此GIOU要比(b)中大。

    GIoU最主要的作用: (1)对于相交的框,IOU可以被反向传播,即它可以直接用作优化的目标函数。但是非相交的,梯度将会为0,无法优化。此时使用GIoU可以完全避免此问题。所以可以作为目标函数
    (2)可以分辨框的对齐方式

代码如下:

import numpy as np
def GIOU (boxes1 , boxes2 ):"calculate GIOU  "'''boxes1 shape : shape (n, 4)boxes2 shape : shape (k, 4)gious: shape (n, k)       '''IOU = []GIOU = []num = (boxes1[:,0]).sizex1 = boxes1[:,0]y1 = boxes1[:,1]x2 = boxes1[:,2]y2 = boxes1[:,3]xx1=boxes2[:,0]yy1=boxes2[:,1]xx2=boxes2[:,2]yy2=boxes2[:,3]area1 = (x2 -x1) * (y2 -y1)  #求取框的面积area2 = (xx2-xx1) * (yy2- yy1)for i in range (num):inter_max_x = np.minimum(x2[i], xx2[:])   #求取重合的坐标及面积inter_max_y = np.minimum(y2[i], yy2[:])inter_min_x = np.maximum(x1[i], xx1[:])inter_min_y = np.maximum(y1[i], yy1[:])inter_w = np.maximum(0 ,inter_max_x-inter_min_x)inter_h = np.maximum(0 ,inter_max_y-inter_min_y)inter_areas = inter_w * inter_hout_max_x = np.maximum(x2[i], xx2[:])  #求取包裹两个框的集合C的坐标及面积out_max_y = np.maximum(y2[i], yy2[:])out_min_x = np.minimum(x1[i], xx1[:])out_min_y = np.minimum(y1[i], yy1[:])out_w = np.maximum(0, out_max_x - out_min_x)out_h = np.maximum(0, out_max_y - out_min_y)outer_areas = out_w * out_hunion = area1[i] + area2[:] - inter_areas  #两框的总面积   利用广播机制ious = inter_areas / uniongious = ious - (outer_areas - union)/outer_areas # IOU - ((C\union)/C)print("ious :",ious)print("gious" ,gious)IOU.append(ious)GIOU.append(gious)return GIOU

#-------------------------------------------------------------------------------------------------------------------------------------------------------#

DIOU

介绍
由于IOU Loss在候选框和真实框没有重叠的时候不提供任何移动梯度(LIoU=1-IOU始终为1),于是GIOU Loss引入了一个惩罚项(即图5中的(C-A并B)/C)。由于惩罚项的引入,在不重叠的情况下,预测框会向目标框移动。
但是考虑如下图图7情况。

当出现上图情况时,GIoU Loss完全降级成IoU Loss,因此引入DIoU Loss,DIoU Loss是在IoU Loss基础上引入一个惩罚项,定义如下:

上述损失函数中,b,bgt分别代表了anchor框和目标框的中心点,且p代表的是计算两个中心点间的欧式距离。c代表的是能够同时覆盖anchor和目标框的最小矩形的对角线距离。因此DIoU中对anchor框和目标框之间的归一化距离进行了建模。直观的展示如下图所示。
DIoU的优点如下:
1.与GIoU loss类似,DIoU loss在与目标框不重叠时,仍然可以为边界框提供移动方向。
2.DIoU loss可以直接最小化两个目标框的距离,而GIOU loss优化的是两个目标框之间的面积,因此比GIoU loss收敛快得多。
3.对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失

代码如下:

def bboxes_diou(boxes1,boxes2):'''cal DIOU of two boxes or batch boxes:param boxes1:[xmin,ymin,xmax,ymax] or[[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]:param boxes2:[xmin,ymin,xmax,ymax]:return:'''#cal the box's area of boxes1 and boxessboxes1Area = (boxes1[...,2]-boxes1[...,0])*(boxes1[...,3]-boxes1[...,1])boxes2Area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1])#cal Intersectionleft_up = np.maximum(boxes1[...,:2],boxes2[...,:2])right_down = np.minimum(boxes1[...,2:],boxes2[...,2:])inter_section = np.maximum(right_down-left_up,0.0)inter_area = inter_section[...,0] * inter_section[...,1]union_area = boxes1Area+boxes2Area-inter_areaious = np.maximum(1.0*inter_area/union_area,np.finfo(np.float32).eps)#cal outer boxesouter_left_up = np.minimum(boxes1[..., :2], boxes2[..., :2])outer_right_down = np.maximum(boxes1[..., 2:], boxes2[..., 2:])outer = np.maximum(outer_right_down - outer_left_up, 0.0)outer_diagonal_line = np.square(outer[...,0]) + np.square(outer[...,1])#cal center distanceboxes1_center = (boxes1[..., :2] +  boxes1[...,2:]) * 0.5boxes2_center = (boxes2[..., :2] +  boxes2[...,2:]) * 0.5center_dis = np.square(boxes1_center[...,0]-boxes2_center[...,0]) +\np.square(boxes1_center[...,1]-boxes2_center[...,1])#cal dioudious = ious - center_dis / outer_diagonal_linereturn dious

#-------------------------------------------------------------------------------------------------------------------------------------------------------#

CIOU

介绍
一个好的目标框回归损失应该考虑三个重要的几何因素:重叠面积、中心点距离、长宽比。
GIoU:为了归一化坐标尺度,利用IoU,并初步解决IoU为零的情况。
DIoU:DIoU损失同时考虑了边界框的重叠面积和中心点距离。
然而,anchor框和目标框之间的长宽比的一致性也是极其重要的。基于此,论文作者提出了Complete-IoU Loss。
CIOU Loss又引入一个box长宽比的惩罚项,该Loss考虑了box的长宽比,定义如下:
上述损失函数中,CIoU比DIoU多出了α和v这两个参数。其中α是用于平衡比例的参数。v用来衡量anchor框和目标框之间的比例一致性。

从α参数的定义可以看出,损失函数会更加倾向于往重叠区域增多方向优化,尤其是IoU为零的时候。

DIOU CIOU结果分析

代码如下:

def bboxes_ciou(boxes1,boxes2):'''cal CIOU of two boxes or batch boxes:param boxes1:[xmin,ymin,xmax,ymax] or[[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]:param boxes2:[xmin,ymin,xmax,ymax]:return:'''#cal the box's area of boxes1 and boxessboxes1Area = (boxes1[...,2]-boxes1[...,0])*(boxes1[...,3]-boxes1[...,1])boxes2Area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1])# cal Intersectionleft_up = np.maximum(boxes1[...,:2],boxes2[...,:2])right_down = np.minimum(boxes1[...,2:],boxes2[...,2:])inter_section = np.maximum(right_down-left_up,0.0)inter_area = inter_section[...,0] * inter_section[...,1]union_area = boxes1Area+boxes2Area-inter_areaious = np.maximum(1.0*inter_area/union_area,np.finfo(np.float32).eps)# cal outer boxesouter_left_up = np.minimum(boxes1[..., :2], boxes2[..., :2])outer_right_down = np.maximum(boxes1[..., 2:], boxes2[..., 2:])outer = np.maximum(outer_right_down - outer_left_up, 0.0)outer_diagonal_line = np.square(outer[...,0]) + np.square(outer[...,1])# cal center distanceboxes1_center = (boxes1[..., :2] +  boxes1[...,2:]) * 0.5boxes2_center = (boxes2[..., :2] +  boxes2[...,2:]) * 0.5center_dis = np.square(boxes1_center[...,0]-boxes2_center[...,0]) +\np.square(boxes1_center[...,1]-boxes2_center[...,1])# cal penalty term# cal width,heightboxes1_size = np.maximum(boxes1[...,2:]-boxes1[...,:2],0.0)boxes2_size = np.maximum(boxes2[..., 2:] - boxes2[..., :2], 0.0)v = (4.0/np.square(np.pi)) * np.square((np.arctan((boxes1_size[...,0]/boxes1_size[...,1])) -np.arctan((boxes2_size[..., 0] / boxes2_size[..., 1])) ))alpha = v / (1-ious+v)#cal cioucious = ious - (center_dis / outer_diagonal_line + alpha*v)return cious

#-------------------------------------------------------------------------------------------------------------------------------------------------------#

总结
DIoU要比GIou更加符合目标框回归的机制,将目标与anchor之间的距离,重叠率以及尺度都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。

IoU,GIoU,DIoU、CIoU详解相关推荐

  1. IoU GIoU DIoU CIoU分析比较

    IoU GIoU DIoU CIoU分析比较 IoU 1. IoU的简介及原理解析 2.IOU的应用有哪些? GIoU 1.Iou的缺陷 2.GIoU的简介及原理解析 3.GIoU的性质 DIoU & ...

  2. IOU .GIOU.DIOU.CIOU

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IOU .GIOU.DIOU.CIOU 一.IOU(Intersection over Union) 二.GIOU(Generaliz ...

  3. IoU系列(IoU, GIoU, DIoU, CIoU)

    ​​​​​ 写在前面 一.IoU (Intersection over Union) 1.1 IoU的优点 1.2 作为损失函数会出现的问题(缺点) 二.GIoU (Generalized) 三. D ...

  4. IOU GIOU DIOU CIOU 及代码实现

    总体发展过程: IOU IOU(交并比)顾名思义就是两个框的交集除以他们的并集. IOU Loss:IOU Loss = 1 -IOU(比较常用) IOU 的优点:1.能够很好的反应重合的程度    ...

  5. 基于IOU的损失函数合集, IoU, GIoU, DIoU,CIoU, EIoU

      目标检测任务的损失函数一般由 Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成.   Bounding ...

  6. 目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:极市平台 目标检测任务的损失函数由Classificitio ...

  7. 目标检测回归损失函数:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

    文章目录 1. Smooth L1 Loss 1.1 假设x为预测框和真实框之间的数值差异,常用的L1和L2 Loss定义为: 1.2 上述的3个损失函数对x的导数分别为: 1.3 实际目标检测框回归 ...

  8. IOU, GIOU, DIOU, CIOU

    IOU IOU是用来衡量两个边界框的重叠程度的.普通的IOU也分为两种,一种是交并比,一种是最小面积与并集的比 计算公式如下: 并集面积 = 面积A + 面积B - 交集面积 交集面积 = 框A与框B ...

  9. IOU GIOU DIOU CIOU

    # -*- coding: utf-8 -*- # @Time : 2022/8/7 10:34 # @Author : hllyzms import mathdef euclidean_distan ...

  10. 【IoU全总结】GIoU, DIoU, CIoU, EIoUFocal, αIoU, SIoU,WIoU【基础收藏】

最新文章

  1. 配置一台路由器,两台电脑的重点
  2. 阿里云Centos系统使用密钥对登陆
  3. 如何正确地使用Java的@deprecated标注
  4. 微信小程序模仿开眼视频app(一)——视频首页、视频详情、分类
  5. linux睡眠进程,linux一个进程如何睡眠
  6. Mac 配置vscode调试PHP
  7. 接口自动化-接口测试初介
  8. 【分享】 图片轮换--函数化继承
  9. 基于深度学习的人脸表情识别实现
  10. 科密考勤机对比和参考价
  11. null object java_java1.8--Null Object模式
  12. win10虚拟服务器安装xp,win10安装xp虚拟机安装教程_win10安装xp虚拟机详细步骤
  13. 基于正态分布的抽样分布-T分布
  14. js实现60秒倒计时
  15. 科技大停滞--过去已逝,未来未来
  16. 1.maya基本操作
  17. 数据仓库(三)之架构篇
  18. 枚举子集复杂度 O(n^3) 证明
  19. 5GNR中PDCCH的polar编码
  20. 条形码识别Matlab版本

热门文章

  1. MySQL常用操作指令大全
  2. GC overhead limit exceeded 的解决方案与详情分析
  3. 服务器怎么连接无线路由器怎么设置,光猫连接无线路由器怎么设置
  4. 在输入框输入时限制输入框只能输入正整数以及两位小数正则表达式
  5. modeler 连接oracle,spss modeler(clementine)连接oracle数据库
  6. FPGA设计之门控时钟
  7. 七夕,眼光长远点,聊点孩子的事?
  8. ipsw —— iOS/macOS 研究瑞士军刀
  9. Rust 调用标准C接口的自定义c/c++库,FFI详解
  10. 三十九、如何单独发布jar包