Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression

2019-05-20 19:34:55

Paperhttps://arxiv.org/pdf/1902.09630.pdf

Project pagehttps://giou.stanford.edu/

Codehttps://github.com/generalized-iou

1. Background and Motivation:

IoU (Intersection over Union) 是物体检测领域最常用的评价指标,用于衡量任意两个形状之间的相似性。IoU 将物体的形状信息,如:width,height,and locations of two bounding boxes,编码为 region property,然后计算一个聚焦于该区域的度量。这个性质使得 IoU 对 scale 有不变性。由于具有这样的特点,IoU 被广泛的应用于物体检测,分割,跟踪等任务。

从上述内容可以发现,最小化常用的损失 与 改善他们的 IoU 值,之间并没有强烈的关系。如图 1(a)所示:(绿色的BBox 为真值黑色的为预测的结果

为了简化起见,我们假设两个 BBox 的一个角固定,所以,任何预测的 BBox,只要第二个角在圆周线上,将会产生相同的 l2-norm distance;然而,IoU值却明显的不同。可以发现,regression loss 的优化 和 IoU values 之间的 gap,并不能很简单的跨越。

本文针对该问题,探索了 IoU 的新的计算方法。作者这里借鉴了 UnitBox 的思想,直接将 BBox 作为优化目标进行回归。所以,将 IoU 作为 2D 物体检测任务的目标函数就更适合了。但是,IoU 作为 metric 和 loss 有如下的不足:如果两个物体根本没有重合,那么 IoU value 将会是 0,并且不会反应两个 BBox 到底有多远。在这种不重合的情况下,如果用了 IoU 作为损失函数,那么梯度将会为 0,无法进行优化

在本文中,作者通过解决这个不重合的问题,克服了 IoU 的弱点。作者确保其拓展版本的有如下的特性:

a). 与 IoU 一样,拥有相同的定义,即:将对比物体的形状属性编码为区域属性(region property);

b). 保持了 IoU 的尺寸不变性;

c). 确保了在重合物体上与 IoU 的强烈相关性;

我们引入该 generalized verison of IoU, named GIoU, 作为一种新的对比方式。也提供了一种分析性的方案,来计算 GIoU,允许其作为 loss function。将 GIoU loss 引入到顶尖的物体检测算法中,我们的方法稳定的提升了其在主流物体检测benchmark 上检测性能。

2. Generalized Intersection over Union :

常规的 IoU 的定义如下:

IoU 有如下的两个优势:

1). IoU 作为距离,可以看做是一种 metric;

2). IoU 对问题的尺寸具有不变性(Invariant to the scale of the problem);

与此同时,也有如下的一个劣势:如果两个 BBox 不重合,那么其 IoU 得分就是 0。那么,此时的 IoU 无法反映出两个BBox 真实的距离。

作者提出的 GIoU 可以很好的解决这个问题,具体的计算方式如下:

首先,计算两个 BBox  A 和 B 的 smallest convex shapes C, 同时包含 A and B;

然后,我们计算如下的比值:分子是 排除 A 和 B 后的 C的区域,分母是 C 的总面积;这个表达了 A 和 B 之间的空闲区域的大小比例;

最终,将 IoU 的值,减去上述的比值,就可以得到 GIoU 的值。

上图中的绿色区域,即展示了所要计算的区域 C 的面积。

3. Experiments

==== Core Code:

def bbox_transform(deltas, weights):
wx, wy, ww, wh = weights
dx = deltas[:, 0::4] / wx
dy = deltas[:, 1::4] / wy
dw = deltas[:, 2::4] / ww
dh = deltas[:, 3::4] / wh dw = torch.clamp(dw, max=cfg.BBOX_XFORM_CLIP)
dh = torch.clamp(dh, max=cfg.BBOX_XFORM_CLIP) pred_ctr_x = dx
pred_ctr_y = dy
pred_w = torch.exp(dw)
pred_h = torch.exp(dh) x1 = pred_ctr_x - 0.5 * pred_w
y1 = pred_ctr_y - 0.5 * pred_h
x2 = pred_ctr_x + 0.5 * pred_w
y2 = pred_ctr_y + 0.5 * pred_h return x1.view(-1), y1.view(-1), x2.view(-1), y2.view(-1) def compute_iou(output, target, bbox_inside_weights, bbox_outside_weights, transform_weights=None, batch_size=None):
   ## the output is predicted bounding box, the target is ground truth bbox. (you need to transform them into tensor, when use this function)
if transform_weights is None:
transform_weights = (1., 1., 1., 1.) if batch_size is None:
batch_size = output.size(0) x1, y1, x2, y2 = bbox_transform(output, transform_weights)
x1g, y1g, x2g, y2g = bbox_transform(target, transform_weights) x2 = torch.max(x1, x2)
y2 = torch.max(y1, y2) xkis1 = torch.max(x1, x1g)
ykis1 = torch.max(y1, y1g)
xkis2 = torch.min(x2, x2g)
ykis2 = torch.min(y2, y2g) xc1 = torch.min(x1, x1g)
yc1 = torch.min(y1, y1g)
xc2 = torch.max(x2, x2g)
yc2 = torch.max(y2, y2g) intsctk = torch.zeros(x1.size()).to(output)
mask = (ykis2 > ykis1) * (xkis2 > xkis1)
intsctk[mask] = (xkis2[mask] - xkis1[mask]) * (ykis2[mask] - ykis1[mask])
unionk = (x2 - x1) * (y2 - y1) + (x2g - x1g) * (y2g - y1g) - intsctk + 1e-7
iouk = intsctk / unionk area_c = (xc2 - xc1) * (yc2 - yc1) + 1e-7
miouk = iouk - ((area_c - unionk) / area_c)
iou_weights = bbox_inside_weights.view(-1, 4).mean(1) * bbox_outside_weights.view(-1, 4).mean(1)
iouk = ((1 - iouk) * iou_weights).sum(0) / batch_size
miouk = ((1 - miouk) * iou_weights).sum(0) / batch_size return iouk, miouk ## the iouk is regular IoU value, the miouk is the GIoU value.

Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression的更多相关文章

  1. 论文阅读笔记四十七:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression(CVPR2019)

    论文原址:https://arxiv.org/pdf/1902.09630.pdf github:https://github.com/generalized-iou 摘要 在目标检测的评测体系中,I ...

  2. 『计算机视觉』Generalized Intersection over Union: A Metric and A Loss for Bounding BoxRegression

    论文地址:Generalized Intersection over Union 一.相关工作 目标检测精度标准 度量检测优劣基本基于 IOU,mAP 是典型的基于 IOU 的标准,但是 mAP 仅有 ...

  3. 目标识别(object detection)中的 IoU(Intersection over Union)

    首先直观上来看 IoU 的计算公式: 由上述图示可知,IoU 的计算综合考虑了交集和并集,如何使得 IoU 最大,需要满足,更大的重叠区域,更小的不重叠的区域. 两个矩形窗格分别表示: 左上点.右下点 ...

  4. Intersection over Union(IoU) algorithms

    IoU算法可用与评估两个多维度数据的相似度,举一个实际应用,做CV,目标检测,我们需要评估模型的识别准确率,不同于二元类问题,普通的评估算法不合适,于是用到了这个算法,这个算法简单易懂,评估效果也不错 ...

  5. CVPR2019目标检测方法进展综述

    CVPR2019目标检测方法进展综述 置顶 2019年03月20日 14:14:04 SIGAI_csdn 阅读数 5869更多 分类专栏: 机器学习 人工智能 AI SIGAI   版权声明:本文为 ...

  6. IoU、GIoU、DIoU、CIoU损失函数

    IoU.GIoU.DIoU.CIoU损失函数 目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成.目标检测任务中近几年 ...

  7. CVPR2019目标检测论文看点:并域上的广义交

    CVPR2019目标检测论文看点:并域上的广义交 Generalized Intersection over Union Generalized Intersection over Union: A ...

  8. 非极大抑制睔PYTHON实现

    非极大抑制(Non-maximum suppression)python代码实现原创Butertfly 发布于2018-11-20 18:48:57 阅读数 293 收藏展开定位一个物体,最后算法就找 ...

  9. 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015

    Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...

随机推荐

  1. 解决ifuse不支持24位UDID问题

    在使用ifuse对iphone设备进行沙盒挂载时, 对类似XXXXXXXX-XXXXXXXXXXXXXXXX UDID设备会提示Invalid device UDID specified, lengt ...

  2. php工具、拓展下载地址

    php工具.拓展下载地址 php各版本下载地址: https://windows.php.net/downloads/releases/archives/ php_redis 下载地址 windwos ...

  3. (Linux基础学习)第二章:CentOS7.4安装教程

    001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 ...

  4. IDEA实用教程(七)—— IDEA的断点调试

    IDEA实用教程(七)-- IDEA的断点调试 23/100 发布文章 qq_41684621 六. IDEA的断点调试 打断点 在行号的右侧点击鼠标左键,出现红色圆形图标,说明已经被打上断点 Deb ...

  5. 1211 BBS后台管理文章添加

    目录 昨日内容回顾 侧边栏inclusion_tag inclusion_tag的响应 使用 自定义inclusion_tag,标签,过滤器 文章的点赞点踩 前端 后端 校验规则 文章的评论功能 1. ...

  6. EF映射——从数据库更新实体

    最近在做ITOO项目,由于更新了数据库,需要重新从数据库映射到实体,本来看过关于EF的学习资料,直接可以从数据库更新到实体,但这种小事也是有很多问题的,必须在更新的时候做好选择.下面分享一下如何从数据 ...

  7. python开发笔记-python-numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能:  除了为Python提供快速的数组处理能力,Numpy在数据分析方面还有另外 ...

  8. docker创建Webvirtmgr容器

    链接:https://hub.docker.com/r/unws/webvirtmgr/ Webvirtmgr Dockerfile 拉起镜像并创建webvirtmgr用户和组(注意uid和guid必 ...

  9. List list = new ArrayList();和ArrayList list=new ArrayList();的区别

    List是一个接口,而ArrayList 是一个类. ArrayList 继承并实现了List.List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到 ...

  10. URI与URN与URL详解

    当没有URI时 什么是URI和URN和URL URI详解 Uniform Resource Identifier 统一资源标识符 URI的组成 案例: https://tools.ietf.org/h ...