ROI Pooling(感兴趣区域池化)【笔记】

RoI池化是目标检测任务中用于提高处理速度和检测精度的关键技术。它通过对不同大小的输入进行最大池化,生成固定尺寸的特征图,从而允许在一次运行中训练整个系统。RoI池化层接收卷积网络的特征映射和感兴趣区域列表作为输入,通过缩放和最大池化操作,将不同大小的矩形转换为统一尺寸的特征映射。

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

引言

感兴趣区域池化(Region of interest pooling)(也称为RoI pooling)是使用卷积神经网络在目标检测任务中广泛使用的操作。例如,在单个图像中检测多个汽车和行人。其目的是对非均匀尺寸的输入执行最大池化以获得固定尺寸的特征图(例如7×7)。

计算机视觉中的两个主要任务是对象分类目标检测。在第一种情况下,系统应该正确地标记图像中的主要对象。在第二种情况下,它应该为图像中的所有对象提供正确的标签和位置。当然还有其他有趣的计算机视觉领域,例如图像分割,但今天我们将专注于检测。在这个任务中,我们通常应该从先前指定的一组类别中的任何对象周围绘制边界框,并为每个类别分配一个类。例如,假设我们正在开发一种自动驾驶汽车的算法,我们想用相机来检测其他汽车,行人,骑自行车者等等 - 我们的数据集可能看起来像这样。

在这种情况下,我们必须在每个重要对象周围绘制一个框并为其分配一个类。此任务比分类任务(如MNIST 或CIFAR)更具挑战性 。在视频的每个帧上,可能存在多个对象,其中一些重叠,一些不明显或被遮挡。而且,对于这样的算法,性能可能是关键问题。特别是对于自动驾驶,我们必须每秒处理数十帧。

那么问题来了

经典架构
我们今天要讨论的对象检测架构分为两个阶段: 1. 区域建议(Region proposal):给定输入图像查找可以定位对象的所有可能位置。此阶段的输出应该是对象的可能位置的边界框列表。这些通常被称为区域提案或感兴趣的区域。 2. 最终分类(Final classification):对于前一阶段的每个区域提案,确定它是属于目标类别之一还是属于背景。在这里,我们可以使用深度卷积网络。

在这里插入图片描述

Object detection pipeline with region of interest pooling
通常在提案(Region proposal)阶段,我们必须生成许多感兴趣的区域。为什么?如果在第一阶段(区域提议)中未检测到对象,则无法在第二阶段对其进行正确分类。这就是为什么这个地区的提案有很高的召回率非常重要。这是通过生成大量提案(例如,每帧几千)来实现的。在检测算法的第二阶段中,大多数将被归类为背景。

这种架构的一些问题是: - 生成大量感兴趣的区域可能会导致性能问题。这将使实时对象检测难以实现。 - 它在处理速度方面不是最理想的。稍后会详细介绍。 - 你无法进​​行端到端的培训,也就是说,你无法在一次运行中训练系统的所有组件(这会产生更好的结果)

这就是感兴趣区域池化所要发挥作用的地方.


**感兴趣区域池化 - 描述**

感兴趣区域池化是用于目标检测任务的神经网络层。它最初是由Ross Girshick在2015年4月提出的(文章可以在这里找到),它实现了培训和测试的显着加速。它还保持高检测精度。该图层有两个输入:

  1. 从具有多个卷积和最大池层的深度卷积网络获得的固定大小的特征映射。
  2. 表示感兴趣区域列表的N×5矩阵,其中N是RoI的数量。第一列表示图像索引,其余四列是区域左上角和右下角的坐标。

在这里插入图片描述
Pascal VOC数据集的图像,注释了区域提案(粉红色矩形)

RoI池实际上做了什么?对于来自输入列表的每个感兴趣区域,它采用与其对应的输入特征图的一部分并将其缩放到某个预定义的大小(例如,7×7)。缩放通过以下方式完成:

  1. 将区域提案划分为相等大小的部分(其数量与输出的维度相同)
  2. 找到每个部分的最大值
  3. 将这些最大值复制到输出(max pooling)

结果是,从具有不同大小的矩形列表中,我们可以快速获得具有固定大小的相应特征映射的列表。请注意,RoI池输出的维度实际上并不取决于输入要素映射的大小,也不取决于区域提议的大小。它仅由我们将提案划分为的部分数量决定。RoI汇集有什么好处?其中之一是处理速度。如果框架上有多个对象建议(并且通常会有很多对象建议),我们仍然可以为所有这些建议使用相同的输入要素图。由于在处理的早期阶段计算卷积非常昂贵,因此这种方法可以为我们节省大量时间。


**感兴趣区域池化 - 例子**

让我们考虑一个小例子,看看它是如何工作的。我们将在单个8×8特征图上执行感兴趣区域,一个感兴趣的区域和2×2的输出大小。我们的输入要素图如下所示:(以下为图像,一般处理时转化像素为映射到0~1的实数,保持精度)
这是感兴趣区域池化层的输出。这是我们以动画形式呈现的示例:
在这里插入图片描述

关于RoI Pooling最重要的事情是什么?

  • 它用于对象检测任务
  • 它允许我们重新使用卷积网络中的特征映射
  • 它可以显著加快训练和测试时间
  • 它允许以端到端的方式训练物体检测系统

参考文献:

  • Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International
    Conference on Computer Vision. 2015.
  • Girshick, Ross, et al. “Rich feature hierarchies for accurate object
    detection and semantic segmentation.” Proceedings of the IEEE
    conference on computer vision and pattern recognition. 2014.
  • Sermanet, Pierre, et al. “Overfeat: Integrated recognition,
    localization and detection using convolutional networks.” arXiv
    preprint arXiv:1312.6229. 2013.

参考:Region of interest pooling explained

### 实现特定ROI内的目标检测 为了实现在特定感兴趣区域Region of Interest, ROI)内进行高效的目标检测,可以采用多种技术和策略。一种常见的方式是在预定义的ROI范围内应用现有的成熟目标检测框架。 #### 使用Selective Search获取ROI 不少领域专家设计出了许多用于选取潜在物体候选框的方法,其中较为著名的是selective search方法。此方法能够有效地从图片中挑选出可能含有对象的候选框(Regions of Interest, ROI)[^1]。这些ROI随后可被传递给更复杂的目标识别模型做进一步分析。 #### 多阶段检测流程 对于两阶段检测器而言,这类架构首先会生成一系列候选区域(Region Proposals),之后再对每一个提议区实施分类与边界框调整操作。这种分步走的设计使得此类系统特别适合那些需要高精度且涉及众多不同种类目标的情况;不过其代价是相对较慢的速度[^4]。 #### 应用RoIPooling改进版技术 考虑到传统RoIPooling可能会引起形状扭曲并影响位置信息准确性的问题,一些研究致力于开发新的解决方案来克服这些问题[^3]。这有助于提高基于卷积神经网络(CNNs)构建的目标探测系统的整体表现力。 #### 结合超分辨率增强特征表示 当涉及到具体实现细节时,还可以考虑引入超分辨率(Super Resolution, SR)模块以优化输入到检测器之前的特征映射质量。例如,在YOLOv3及其简化版本YOLOv3-tiny的基础上加入SR组件后,不仅提高了原始算法的表现——特别是在小型物体上的检出率有所增加——而且也证明了融合浅层纹理特征和深层语义特征的重要性[^5]。 ```python import cv2 from detectron2 import model_zoo from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg def roi_based_object_detection(image_path, rois): cfg = get_cfg() cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")) cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml") predictor = DefaultPredictor(cfg) image = cv2.imread(image_path) outputs_list = [] for (startX, startY, endX, endY) in rois: cropped_image = image[startY:endY, startX:endX] # Perform detection on the cropped region only. output = predictor(cropped_image) boxes = output["instances"].pred_boxes.tensor.cpu().numpy() adjusted_boxes = [] for box in boxes: new_box = [ box[0]+startX, box[1]+startY, box[2]+startX, box[3]+startY ] adjusted_boxes.append(new_box) outputs_list.append({ "boxes": adjusted_boxes, "scores": output["instances"].scores.tolist(), "classes": output["instances"].pred_classes.tolist() }) return outputs_list ``` 上述Python代码展示了如何在一个或多个自定义划定的矩形区域内执行目标检测任务。这里使用Detectron2库加载了一个预先训练好的Faster R-CNN模型,并对其进行了配置以便于处理裁剪后的子图像片段。最后将预测结果转换回原图坐标系下供后续评估之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值