首页 > 编程知识 正文

giao(含有ciou的单词)

时间:2023-05-05 12:56:54 阅读:68526 作者:231

简介IoU又称正交比,是一种计算不同图像重叠比例的算法,常用于深度学习领域的目标检测和语义分割任务。

1.1 IoU在目标检测中的应用在目标检测任务中,往往会让模型一次生成大量的候选框candidate bound,根据各个框的可靠度对框进行排序,依次计算框与框之间的iou,在没有极大值抑制的情况下,哪个才是真正寻找的物体例如,检测人脸时,模型输出的可能是左图,但最终得到的是右图。

得到最终输出后,取输出框和原始标志框之间的IoU,将1-IoU作为loss (区间[ 0,1 ]寻找极小值),也可以实现模型的迭代优化。

模型输出框(黄色)和实际脸框(红色)的计算IoU

1.2 IoU在语义分割中的应用语义分割任务还可以计算图像中预测区域与实际区域之间的IoU,并使用1-IoU作为Loss对模型进行迭代优化。

如果使用模型抠出左图的人物像,则右图的红色区域为实际存在的人物像区域,黄色区域为模型的预测结果

1.3 IoU的终极目标通过上述几个例子,IoU的计算可以看作是比较两个框或两个图像的大小、区域、位置不同,进而比较两个图像之间的几何图形的相似度。 请想想这个相似度与什么样的参数有关。 可能的原因包括重叠比例、图形距离、形状相似度(矩形长宽比)等。

下面介绍IoU的计算原理,以及它是如何一步一步优化,并朝着理想的方向发展的。

2 IoU 2.1 IoU原理IoU实际上是单元交互的简称,也叫“交并比”。 IoU在目标检测和语义分割中具有重要的作用。

首先,让我们来看看IoU的定义。

直观上,如下图所示,可以将IoU的值作为两个图形面积的交点和并集的比。

通过IoU评估两个图像的匹配度具有以下优点。

有尺度不变性; 满足非阴性; 满足对称性; 但同时,IoU也存在一些明显的不足:

|AB|=0,即如果两个图像不相交,则无法比较两个图像的距离,无法表达两个图像是如何相交的。我们可以认为,这个IoU初步满足了计算两个图像的几何图形相似度的要求,简单实现了图像重叠度的计算,但无法体现两个图形之间的距离以及图形长宽比的相似性。

2.2 IoU计算

让我们手动计算一下IoU。

2.3 IoU是import numpy as np# box:[上、左、下、右] box1=[ 0,0,8,6 ] box2=[ 2,3,10,9 ] defi ou (box 1,box2) 盒2 [3] ) -最大)盒1 [1], box2[1]计算交集、并集面积inter=0ifin _ h0 orin _ w0 else in _ h * in _ w union=(box1[2]-box1[0] ) (box1[3]-)

3 GIoU 3.1 GIoU原理通用隔离(gIoU )比IoU多一个“通用化”,就是在更广的层次上计算iou,刚才提到的“两个”

GIoU的计算公式如下。

在此,c表示两个图像的最小被复面积,也可以认为是这两个图像的最小外接矩形的面积。

由此可见:

取原IoU值的区间为[ 0,1 ],而取GIoU值的区间为[-1,1 ]; 如果两个图像完全重叠,则IoU=GIoU=1;如果两个图像处于无限远,则IoU=0,则GIoU=-1。 相对于IoU只关注重叠区域,GIoU不仅关注重叠区域,还关注非重叠区域,可以更好地反映两个图像的重叠度。此时我们可以认为,GIoU完善了图像重叠度的计算功能,但仍无法对图形距离以及长宽比的相似性进行很好的表示。

注: GIoU论文地址https://arxiv.org/pdf/1902.09630.pdf

3.2 GIoU计算

p>

3.3 GIoU实现 import numpy as np# box:[上, 左, 下, 右]box1 = [0,0,8,6]box2 = [2,3,10,9]def GIoU(box1, box2): # 计算最小包庇面积 y1,x1,y2,x2 = box1 y3,x3,y4,x4 = box2 area_C = (max(x1,x2,x3,x4)-min(x1,x2,x3,x4)) * (max(y1,y2,y3,y4)-min(y1,y2,y3,y4)) # 计算IoU in_h = min(box1[2], box2[2]) - max(box1[0], box2[0]) in_w = min(box1[3], box2[3]) - max(box1[1], box2[1]) inter = 0 if in_h < 0 or in_w < 0 else in_h * in_w union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter iou = inter / union # 计算空白部分占比 end_area = (area_C - union)/area_C giou = iou - end_area return giouGIoU(box1, box2)

Out: 0.09743589743589745

4 DIoU 4.1 DIoU原理

GIoU虽然解决了IoU的一些问题,但是它并不能直接反映预测框与目标框之间的距离,DIoU(Distance-IoU)即可解决这个问题,它将两个框之间的重叠度、距离、尺度都考虑了进来,DIoU的计算公式如下:

其中b,bgt分别代表两个框的中心点,ρ代表两个中心点之间的fkdmj距离,C代表最小包庇矩形的对角线,即如下图所示:

DIoU相较于其他两种计算方法的优点是:

DIoU可直接最小化两个框之间的距离,所以作为损失函数的时候Loss收敛的更快;在两个框完全上下排列或左右排列时,没有空白区域,此时GIoU几乎退化为了IoU,但是DIoU仍然有效。

此时我们可以认为,DIoU在完善图像重叠度的计算功能的基础上,实现了对图形距离的考量,但仍无法对图形长宽比的相似性进行很好的表示。

注:DIoU论文地址 https://arxiv.org/pdf/1911.08287.pdf

 4.3 DIoU计算

通过计算可得,黄框中心点K、蓝框中心点J的坐标分别为:

K:(3,4) J:(6,6)

那么此时的DIoU计算公式为:

 

4.3 DIoU实现 import numpy as npimport IoU# box:[上, 左, 下, 右]box1 = [0,0,8,6]box2 = [2,3,10,9]def DIoU(box1, box2): # 计算对角线长度 y1,x1,y2,x2 = box1 y3,x3,y4,x4 = box2 C = np.sqrt((max(x1,x2,x3,x4)-min(x1,x2,x3,x4))**2 + (max(y1,y2,y3,y4)-min(y1,y2,y3,y4))**2) # 计算中心点间距 point_1 = ((x2+x1)/2, (y2+y1)/2) point_2 = ((x4+x3)/2, (y4+y3)/2) D = np.sqrt((point_2[0]-point_1[0])**2 + (point_2[1]-point_1[1])**2) # 计算IoU iou = IoU(box1, box2) # 计算空白部分占比 lens = D**2 / C**2 diou = iou - lens return diouDIoU(box1, box2)

Out: 0.1589460263493413

5 CIoU 5.1 CIoU原理

CIoU的全称为Complete IoU,它在DIoU的基础上,还能同时考虑两个矩形的长宽比,也就是形状的相似性,CIoU的计算公式为:

其中α是权重函数,而v用来度量长宽比的相似性:

可以看出,CIoU就是在DIoU的基础上,增加了图像相似性的影响因子,因此可以更好的反映两个框之间的差异性。

我们还需要注意的一点是,在使用CIoU作为Loss的时候,v的梯度同样会参与反向传播的计算,其中:

如果矩形的w和h均小于1,w2+h2的值则会很小,这样很容易出现梯度爆炸的现象,所以在计算v的梯度时,直接把  当做1来计算。

至此,我们终于完成了最初所定的目标,实现了对两个图像之间的重叠比例、图形距离、形状相似度(矩形长宽比)的综合度量。

注:CIoU论文与DIoU是同一篇。

5.2 CIoU计算

通过计算可得,黄框中心点K、蓝框中心点J的坐标分别为:

K:(3,4) J:(6,6)

此时CIoU的计算公式为:

由于最开始设定的两个矩形的形状相同,计算所得的形状惩罚项为0,因此此时CIoU=DIoU。由此可见,两个形状差别越大,CIoU相较于DIoU则越小。

5.3 CIoU实现 import numpy as npimport mathimport IoUimport DIoU# box:[上, 左, 下, 右]box1 = [0,0,8,6]box2 = [2,3,10,9]def CIoU(box1, box2): y1,x1,y2,x2 = box1 y3,x3,y4,x4 = box2 iou = IoU(box1, box2) diou = DIoU(box1, box2) v = 4 / math.pi**2 * (math.atan((x2-x1)/(y2-y1)) - math.atan((x4-x3)/(y4-y3)))**2 + 1e-5 alpha = v / ((1-iou) + v) ciou = diou - alpha * v return ciouCIoU(box1, box2)

Out: 0.1589460263493413

 参考文献:

https://zhuanlan.zhihu.com/p/111013447

https://www.zhihu.com/people/li-ge-35-18/posts

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。