RCNN中的尺度缩放问题的理解(Bounding-Box regression)

本文探讨了在RCNN模型中使用Bounding Box回归技术解决poor localization问题的方法。通过介绍IOU的概念及其在模型训练中的作用,解释了如何从Region Proposal生成更精确的目标边界框。

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

一.问题的引出

在阅读《Rich feature hierarchies for accurate object detection and semantic segmentation》的paper中分析了使用RCNN模型的错误率主要的原因来源于poor localization为了解决这个问题作者使用了Bounding-Box regression的做法来对模型进行优化通过对生成的边框进行调整。

二.详细理解

1.IOU的意义

clipboard.png

如图红色框和绿色框所示,红色框是我们生成的Region Proposal(具体怎么生成的不说明了)记为R,而绿色是我们的实际要达到的检测框(Ground Truth)记为G。那么IOU就是(R∩G)/(R∪G) 。定义这个的目的就是为了在训练时为已标定的Bounding-Box寻找一个能够扩张为该Bounding-Box的Region Proposal,当IOU小于某个值得时候就必须被丢弃,这样的具体原因是因为能够进行Bounding-Box regression的两个框的是差异比较小的,这样才能进行线性模拟(下面会讲述的)。

2.Bounding-Boxd的意思

clipboard.png

如上图中P是训练时生成的边框(要满足IOU的条件)GM为中间的经过回归的边框,G使我们训练样本中标定的边框。我们该如何从P生成到GM呢?首先我们需要知道该如何确定一个边框在一幅图的位置对于窗口一般使用四维向量(x,y,w,h)来表示, 分别表示窗口的中心点坐标和宽高。我们要将P变换到GM只需要进行平移后缩放就可以了,这是几何上的直观想法(本文中GM与P变换后的窗体指代一个对象)

clipboard.png
边框回归学习就是dx(P),dy(P),dw(P),dh(P)这四个变换。下一步就是设计算法那得到这四个映射。
那么问题就来了,我们从图形中获得的数据不可能真的是坐标,不然就成了在某个位置固定了对应得一个变换方法而不管该位置的图形到底是什么东西。我们获得的对象是该Region Proposal的特征向量,这也是十分合理的,想象一下人在确定一幅图中某个固定大小区域的对象时,如该区域只有对象的一部分图片,我们也是进行扩大视野最后就能看到整个对象了呀,最后的视野也就是Ground Truth。而人接受的输入时像素点,那么对应的在回归中就接受特征向量。
在人接受到图片是就知道该如何移动自己的目光来寻找整个对象,相当于人知道当前看到的部分在实际物体对象中所处的位置后,就知道该如何变换自己的目光和视野范围,如看到左半脸就知道将目光平移到右边再扩大自己的视野。类似的在接收到特定Region Proposal的特征向量,算法应该知道朝什么方向移动和如何进行尺度缩放(这些都是从训练中习得的)。这使用数学语言就是一种由特征向量向dx(P),dy(P),dw(P),dh(P)的映射关系!
如何能得到该关系呢,还是要进行训练,下图是我们追求的尺度变换的方法,也就是监督学习中的类似于label的量
clipboard.png

那么我们实际做的尺度变换可以定义为
d∗(P)=wT∗Φ5(P), Φ5(P)是输入 Proposal 的特征向量,w∗是要学习的参数(*表示 x,y,w,h, 也就是每一个变换对应一个目标函数,也就是刚刚说的映射关系) , d∗(P)是得到的预测值。 我们要让预测值跟真实值t∗=(tx,ty,tw,th)差距最小, 得到损失函数为:

clipboard.png

优化函数为

clipboard.png

对于公式为什么才采用上述的格式参见参考的博主文章
http://m.blog.youkuaiyun.com/zijin0...
水平有限,敬请谅解

### RPN 和 RoI Pooling 的工作原理及实现细节 #### Region Proposal Network (RPN) RPN 是一种轻量级的卷积神经网络,其主要功能是从图像中生成候选区域(Region of Interest, ROI)。它通过滑动窗口的方式,在特征图上提取固定大小的区域提议,并对其进行分类和边界框回归调整。 - **Anchors**: Anchors 是预定义的一组矩形框,覆盖整个输入图片的不同位置、尺度和宽高比例。这些锚框作为初始候选区域的基础[^2]。 - **Positive/Negative Labels**: 对于每个 anchor,如果它的 IoU(Intersection over Union)与真实目标框(Ground Truth Box)大于某个阈值,则标记为正样本;反之,IoU 小于另一个较低阈值的被标记为负样本。其余情况通常忽略不计。 - **Softmax Classification**: 使用 Softmax 函数对 anchors 进行二分类判断——即区分前景对象还是背景噪声。这一步骤帮助筛选出可能包含物体的目标建议区。 - **Bounding Box Regression**: 针对那些被认为是正面实例的 proposals,应用边框回归技术进一步优化它们的位置参数。具体而言,通过对原始 anchor 应用平移缩放操作来逼近实际标注框的真实坐标[^3]。 ```python import torch.nn as nn class RPN(nn.Module): def __init__(self, in_channels=512, num_anchors=9): super(RPN, self).__init__() # 卷积层用于特征映射 self.conv = nn.Conv2d(in_channels=in_channels, out_channels=512, kernel_size=3, stride=1, padding=1) # 分类分支预测每个anchor属于前景或背景的概率 self.cls_conv = nn.Conv2d(512, num_anchors * 2, kernel_size=1) # 回归分支估计bounding box偏移量 self.reg_conv = nn.Conv2d(512, num_anchors * 4, kernel_size=1) def forward(self, x): x = F.relu(self.conv(x)) cls_scores = self.cls_conv(x).permute(0, 2, 3, 1).contiguous().view(-1, 2) # 转换形状以便softmax处理 bbox_preds = self.reg_conv(x).permute(0, 2, 3, 1).contiguous().view(-1, 4) # 输出四个维度表示dx, dy, dw, dh return cls_scores, bbox_preds ``` #### RoI Pooling Layer RoI Pooling 层的作用在于接收由 RPN 提供的多个不同尺寸的 region proposals,以及来自 CNN 主干网路产生的全局 feature map,统一裁剪并重采样成固定的 H×W 大小后再传递给全连接层或其他下游模块继续完成检测任务。 - 输入包括两部分:一是完整的 feature maps;二是经过初步挑选后的若干 proposal boxes[^1]。 - 计算过程大致如下: - 根据每一个 proposal 所对应的原图范围找到对应在 feature map 上的小块; - 利用双线性插值法或者其他方法对该局部区域执行空间上的量化分割; - 最大池化或者平均池化得到最终标准化后的 tensor 片段。 ```python def roi_pooling(feature_map, rois, pooled_height, pooled_width): """ :param feature_map: Tensor with shape [batch_size, channels, height, width]. :param rois: List of regions-of-interest tensors. :return: Pooled features from each ROI. """ batch_size, num_channels, data_height, data_width = feature_map.size() outputs = [] for i in range(len(rois)): roi_start_w, roi_start_h, roi_end_w, roi_end_h = rois[i].type(torch.int32)[0] region = feature_map[:, :, roi_start_h:(roi_end_h + 1), roi_start_w:(roi_end_w + 1)] pooled_feature = F.adaptive_max_pool2d(region, output_size=(pooled_height, pooled_width)) outputs.append(pooled_feature.flatten()) return torch.stack(outputs) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值