美文网首页
目标检测基础模块之IoU及优化

目标检测基础模块之IoU及优化

作者: 笑傲NLP江湖 | 来源:发表于2021-07-01 10:06 被阅读0次

    1 简介

    IoU又名交并比,是一种计算不同图像相互重叠比例的算法,时常被用于深度学习领域的目标检测或语义分割任务中。

    1.1 IoU在目标检测中的应用

    在目标检测任务中,我们时常会让模型一次性生成大量的候选框(candidate bound),然后再根据每一个框的置信度对框进行排序,进而依次计算框与框之间的IoU,以非极大值抑制的方式,来判断到底哪一个是我们真正要找的物体,哪几个又该删除。例如在做人脸检测时,模型输出的可能是左图,而最终我们得到的是右图。

    模型生成的多个候选框(橙色);最终输出的候选框(黄色)

    在我们得到最终的输出后,也可以拿输出框与原标记框(ground truth bound)之间的IoU,使用1-IoU来作为loss(区间[0,1]找极小值),并以此实现模型的迭代优化。

    模型输出框(黄色)与真实人脸框(红色)计算IoU

    Loss=1-IoU=1-0.91=0.09\

    1.2 IoU在语义分割中的应用

    在语义分割任务里,我们同样可以计算图像中的预测区域与真实区域之间的IoU,并使用1-IoU作为Loss来对模型进行迭代优化。

    使用模型抠出左图中的人像,右图红色区域为真实人像区域,黄色区域为模型预测结果

    Loss=1-IoU=1-0.89=0.11\

    1.3 IoU的终极目标

    通过上述几个例子,我们能够发现,计算IoU可以看做是在比较两个框或者两个图像的大小、区域、位置相不相同,进而可以把它想象成是在比较两个图像之间的几何图形相似度,那么我们不妨想一想,这个相似度都与哪些参数相关呢?我们能想到的有重叠比例、图形距离、形状相似度(矩形长宽比)等等。

    下面我将为大家介绍IoU的计算原理,以及它是如何一步一步进行优化,朝着理想的方向迈进的。

    2 IoU

    2.1 IoU原理

    IoU其实是Intersection over Union的简称,也叫‘交并比’。IoU在目标检测以及语义分割中,都有着至关重要的作用。

    首先,我们先来了解一下IoU的定义:

    IoU=\frac{|A∩B|}{|A∪B|}\

    直观来讲,我们可以把IoU的值定为为两个图形面积的交集和并集的比值,如下图所示:

    img

    通过IoU来评判两个图像的重合度具有以下几点优点:

    • 具有尺度不变性;

    • 满足非负性;

    • 满足对称性;

    但与此同时,IoU也有几点很明显的不足:

    • 如果|A∩B|=0,也就是两个图像没有相交时,无法比较两个图像的距离远近;

    • 无法体现两个图像到底是如何相交的。

    我们可以认为,这个IoU初步满足了计算两个图像的几何图形相似度的要求,简单实现了图像重叠度的计算,但无法体现两个图形之间的距离以及图形长宽比的相似性。

    2.2 IoU计算

    下面我来带大家手动计算一下IoU:


    img

    如上图所示,黄色矩形与蓝色矩形相交,他们的顶点A、B、C、D分别是:

    A:(0,0) B:(3,2) C:(6,8) D:(9,10)

    此时IoU的计算公式应为:

    IoU=\frac{|A∩B|}{|A∪B|}=\frac{绿色面积}{黄色+蓝色-绿色}=\frac{(Cx-Bx)*(Cy-By)}{(Cx-Ax)*(Cy-Ay)+(Dx-Bx)*(Dy-By)-(Cx-Bx)*(Cy-By)}\

    带入A、B、C、D四点的实际坐标后,可以得到:

    IoU=\frac{(6-3)*(8-2)}{(6-0)*(8-0)+(9-3)*(10-2)-(6-3)*(8-2)}=\frac{3*6}{6*8+6*8-3*6}=\frac{18}{78}=0.23\

    所以,别看两个矩形相交了不少,但IoU的值其实只有0.23。

    2.3 IoU实现

    import numpy as np
    # box:[上, 左, 下, 右]
    box1 = [0,0,8,6]
    box2 = [2,3,10,9]
    
    def IoU(box1, box2):
        # 计算中间矩形的宽高
        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
        iou = inter / union
        return iou
    IoU(box1, box2)
    

    Out: 0.23076923076923078

    3 GIoU

    3.1 GIoU原理

    GIoU(Generalized Intersection over Union)相较于IoU多了一个‘Generalized’,这也意味着它能在更广义的层面上计算IoU,并解决刚才我们说的‘两个图像没有相交时,无法比较两个图像的距离远近’的问题。

    GIoU的计算公式为:

    GIoU=IoU-\frac{|C-(A∪B)|}{C}\

    其中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计算

    img

    还是刚才那种情况,现在我们来计算GIoU:

    GIoU=IoU-\frac{|C-(A∪B)|}{C}=0.23-\frac{|红框面积-黄绿蓝面积|}{红框面积}=0.23-\frac{9*10-78}{9*10}=0.097\

    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 giou
    GIoU(box1, box2)
    

    Out: 0.09743589743589745

    4 DIoU

    4.1 DIoU原理

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

    DIoU=IoU-\frac{\rho^{2}(b,b^{gt})}{c^{2}}\

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

    img

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

    • DIoU可直接最小化两个框之间的距离,所以作为损失函数的时候Loss收敛的更快;

    • 在两个框完全上下排列或左右排列时,没有空白区域,此时GIoU几乎退化为了IoU,但是DIoU仍然有效。

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

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

    4.2 DIoU计算

    img

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

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

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

    DIoU=IoU-\frac{\rho^{2}(b,b^{gt})}{c^{2}}=0.23-\frac{\sqrt{3^{2}+2^{2}}^{2}}{\sqrt{9^{2}+10^{2}}^{2}}=0.158\

    4.3 DIoU实现

    import numpy as np
    import 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 diou
    DIoU(box1, box2)
    

    Out: 0.1589460263493413

    5 CIoU

    5.1 CIoU原理

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

    CIoU=IoU-\frac{\rho^{2}(b,b^{gt})}{c^{2}}-\alpha v\

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

    v=\frac{4}{\pi^{2}}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^{2}\

    \alpha=\frac{v}{(1-IoU)+v}\

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

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

    \begin{align} \frac{∂v}{∂w}&=2*\frac{4}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*(-1)*\frac{1}{1+(\frac{w}{h})^{2}}*\frac{1}{h}\\ &=\frac{8}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*(-1)*\frac{h^{2}}{w^{2}+h^{2}}*\frac{1}{h}\\ &=-\frac{8}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*\frac{h}{w^{2}+h^{2}}\\ \end{align}\

    \begin{align} \frac{∂v}{∂h}&=2*\frac{4}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*(-1)*\frac{1}{1+(\frac{w}{h})^{2}}*w*(-1)*h^{-2}\\ &=\frac{8}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*\frac{h^{2}}{w^{2}+h^{2}}*w*h^{-2}\\ &=\frac{8}{\pi^{2}}*(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*\frac{w}{w^{2}+h^{2}}\\ \end{align}\

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

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

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

    5.2 CIoU计算

    img

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

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

    此时CIoU的计算公式为:

    \begin{align} CIoU&=IoU-\frac{\rho^{2}(b,b^{gt})}{c^{2}}-\alpha v\ &=0.1589-\frac{v}{(1-IoU)+v}*\frac{4}{\pi^{2}}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^{2}\ &=0.1589-\frac{v}{(1-0.23)+v}*\frac{4}{\pi^{2}}(arctan\frac{6^{gt}}{8^{gt}}-arctan\frac{6}{8})^{2}\ &=0.1589 \end{align}\

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

    5.3 CIoU实现

    import numpy as np
    import math
    import IoU
    import 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 ciou
    CIoU(box1, box2)
    

    Out: 0.1589460263493413

    相关文章

      网友评论

          本文标题:目标检测基础模块之IoU及优化

          本文链接:https://www.haomeiwen.com/subject/nttkultx.html