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

1 简介

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

1.1 IoU在目标检测中的应用

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

img

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

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

img

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

L o s s = 1 − I o U = 1 − 0.91 = 0.09 Loss=1-IoU=1-0.91=0.09\\ Loss=1IoU=10.91=0.09

1.2 IoU在语义分割中的应用

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

img

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

L o s s = 1 − I o U = 1 − 0.89 = 0.11 Loss=1-IoU=1-0.89=0.11\\ Loss=1IoU=10.89=0.11

1.3 IoU的终极目标

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

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

2 IoU

2.1 IoU原理

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

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

I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ IoU=\frac{|A∩B|}{|A∪B|}\\ IoU=ABAB

​ 直观来讲,我们可以把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的计算公式应为:

I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = 绿 色 面 积 黄 色 + 蓝 色 − 绿 色 = ( C x − B x ) ∗ ( C y − B y ) ( C x − A x ) ∗ ( C y − A y ) + ( D x − B x ) ∗ ( D y − B y ) − ( C x − B x ) ∗ ( C y − B y ) IoU=\frac{|A∩B|}{|A∪B|}=\frac{绿色面积}{黄色+蓝色-绿色}=\frac{(Cx-Bx)*(Cy-By)}{(Cx-Ax)*(Cy-Ay)+(Dx-Bx)*(Dy-By)-(Cx-Bx)*(Cy-By)}\\ IoU=ABAB=+绿绿=(CxAx)(CyAy)+(DxBx)(DyBy)(CxBx)(CyBy)(CxBx)(CyBy)

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

I o U = ( 6 − 3 ) ∗ ( 8 − 2 ) ( 6 − 0 ) ∗ ( 8 − 0 ) + ( 9 − 3 ) ∗ ( 10 − 2 ) − ( 6 − 3 ) ∗ ( 8 − 2 ) = 3 ∗ 6 6 ∗ 8 + 6 ∗ 8 − 3 ∗ 6 = 18 78 = 0.23 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=(60)(80)+(93)(102)(63)(82)(63)(82)=68+683636=7818=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的计算公式为:

G I o U = I o U − ∣ C − ( A ∪ B ) ∣ C GIoU=IoU-\frac{|C-(A∪B)|}{C}\\ GIoU=

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值