边框回归:BoundingBox-Regression(BBR)

本文介绍了BoundingBox Regression (BBR)在RCNN中的应用,解释了BBR的主要目的是解决mislocalization问题,通过线性回归提高mAp。内容详细解析了BBR的输入不是所有IoU小于0.6的框,而是选取IoU大于0.6的框进行回归。同时,讨论了为何在IoU较大的情况下,变换可以视为线性变化,并且说明了使用exp形式表示缩放尺寸的原因。最后,阐述了损失函数和输入特征的选择,强调BBR是针对每种类别训练的,而非独立于分类信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要做BoundingBox Regression(BBR)?

首先我们先来考虑,RCNN中为什么要做BoundingBox-Regression?

Bounding Boxregression是 RCNN中使用的边框回归方法,在RCNN的论文中,作者指出:主要的错误是源于mislocalization。为了解决这个问题,作者使用了bounding box regression。
这个方法使得mAp提高了3到4个点。
这里写图片描述

BBR的输入 是什么?

注意,这里网上很多地方都说的不太正确,有误导,我仔细理解了一些论文,把自己的理解写下。(羞涩)
这里写图片描述

对于预测框P,我们有一个ground truth是G:当0.1< IoU < 0.5时出现重复,这种情况属于作者说的poor localiazation, 但注意:我们使用的并不是这样的框进行BBR(网上很多地方都在这里出现了误导),作者是用iou>0.6的进行BBR,也就是iou<0.6的Bounding Box会直接被舍弃,不进行BBR。这样做是为了满足线性转换的条件。否则会导致训练的回归模型不 work.

(当 P跟 G 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理。)

至于为什么当IoU较大的时候,我们才认为是线性变化,我找到一个觉得解释的比较清楚的,截图在下面:

### N-IoU 改进的 IoU-based 边界框回归损失函数 #### 应用场景 N-IoU(Normalized Intersection over Union)作为一种改进型的IoU-based边界框回归损失函数,在目标检测领域得到了广泛应用。该方法不仅保留了传统IoU损失的核心特性,还通过引入新的机制来提升模型性能[^1]。 #### 特性和优势 - **取值范围一致**:同传统的IoU损失一样,N-IoU 的取值同样限定于\[0, 1\]区间内,这使得两者在数值上具备可比较性。 - **加速高IoU样本收敛**:当辅助边框尺寸小于真实边框(ratio<1),虽然有效回归区域缩小,但是由于梯度绝对值更大,因此可以更快速地促使那些已经接近正确的预测结果进一步精细化调整。 - **增强低IoU情况下的表现力**:反之如果辅助边框相对较大,则有助于扩展回归的有效作用域,从而改善初始定位不准确的情况,特别是对于那些原本交并比很低的目标物体而言效果显著。 - **解决原始IoU Loss存在的问题**:直接采用\(1-\text{IoU}\)作为loss来进行bbox regression分支训练虽可行却并非完美无缺;比如它可能无法很好地处理不同大小的对象之间的比例变化等问题[^2]。而经过改良后的版本则能在一定程度上缓解这些问题的影响。 ```python def n_iou_loss(pred_boxes, target_boxes): """ 计算两个矩形框间的N-IoU损失 参数: pred_boxes (Tensor): 预测得到的边界框坐标[N, 4] target_boxes (Tensor): 实际标签对应的边界框坐标[N, 4] 返回: Tensor: 平均N-IoU损失值 """ # 获取每个box的高度宽度以及中心点位置 wh_pred = pred_boxes[:, 2:] - pred_boxes[:, :2] centers_pred = (pred_boxes[:, 2:] + pred_boxes[:, :2]) / 2. wh_target = target_boxes[:, 2:] - target_boxes[:, :2] centers_target = (target_boxes[:, 2:] + target_boxes[:, :2]) / 2. inter_wh = torch.min(wh_pred, wh_target) inner_area = inter_wh[..., 0] * inter_wh[..., 1] outer_wh = torch.max(wh_pred, wh_target) outer_area = outer_wh[..., 0] * outer_wh[..., 1] union_area = wh_pred.prod(dim=-1) + wh_target.prod(dim=-1) - inner_area iou = inner_area / union_area.clamp(min=1e-7) ratio = ((centers_pred - centers_target).abs() / outer_wh).prod(-1)**0.5 niou = iou * ratio return 1 - niou.mean() ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值