Fast RCNN 目标检测网络学习记录 (附代码)

论文地址:https://arxiv.org/abs/1504.08083

代码地址:https://github.com/rbgirshick/fast-rcnn

1.是什么?

Fast RCNN是目标检测领域的一个算法框架,是RCNN的改进版。Fast RCNN的主要目的是解决RCNN算法中的瓶颈问题,即选择性搜索算法的速度较慢。Fast RCNN通过引入ROI池化层,将整张图片的卷积特征图和候选框的位置信息输入到全连接层中,从而避免了对每个候选框都进行卷积操作的问题,大大提高了检测速度。Fast RCNN的作用是在目标检测任务中,对于输入的图像进行目标检测,输出图像中所有目标的类别和位置信息。

2.为什么?

  1. RCNN对每个proposal单独通过CNN进行特征提取,速度非常慢,并且有很多的区域是重叠的,导致冗余计算。Fast RCNN只对全图进行一次特征提取,然后对于每个proposal,从提取的全图特征中截取对应的特征。
  2. 提出了RoI Pooling,由于后面有分类和回归任务,需要固定长度的特征。而Region Proposal的大小是不固定的,RCNN中的处理是对proposal进行裁剪缩放到固定大小,无法完整保存原始图像的信息。Fast RCNN提出了RoI Pooling将特征调整为同样大小。
  3. Fast RCNN使用全连接层+softmax代替了RCNN中的SVM分类器,特征提取、分类、回归这个三部分合在了一起。

3.怎么样?

3.1网络结构

如图,将一张图像输入到 Deep ConvNet 中得到图像的特征图,根据ROI区域与整体图像的坐标映射关系 (RoI Projection)进行特征映射(Conv feature map),能够得到每一个候选区域(ROI区域)的特征矩阵。
将每一个特征矩阵通过RoI pooling layer,池化到固定尺寸(7*7),然后展平为向量(vector)。再经过两个全连接层(fully connected layers,FC),得到ROI特征向量(ROI feature vector)。
之后 ROI feature vector 并联两个FC,其中一个用于目标概率预测(softmax),另一个用于边界框参数的回归(bbox regressor,bbox 表示 bounding box)。
 

3.2 算法流程 

(1)输入图像;
(2)通过深度网络中的卷积层(VGG、Alexnet、Resnet等中的卷积层)对图像进行特征提取,得到图片的特征图;
(3)通过选择性搜索算法得到图像的感兴趣区域(通常取2000个);
(4)对得到的感兴趣区域进行ROI pooling(感兴趣区域池化):即通过坐标投影的方法,在特征图上得到输入图像中的感兴趣区域对应的特征区域,并对该区域进行最大值池化,这样就得到了感兴趣区域的特征,并且统一了特征大小,如图2所示;
(5)对ROI pooling层的输出(及感兴趣区域对应的特征图最大值池化后的特征)作为每个感兴趣区域的特征向量;
(6)将感兴趣区域的特征向量与全连接层相连,并定义了多任务损失函数,分别与softmax分类器和boxbounding回归器相连,分别得到当前感兴趣区域的类别及坐标包围框;
(7)对所有得到的包围框进行非极大值抑制(NMS),得到最终的检测结果。

 3.3 框架

Fast RCNN将CNN特征提取,SVM边界框分类,bbox regression边界框回归三部分结合到了一起,都融合到同一个CNN中。那么Fast RCNN就只有两部分了:先通过SS算法获取候选框,再通过CNN完成特征提取、分类和边界框回归。

3.3.1 ROI Pooling(Region of Interest)

它的输入是特征图,输出则是大小固定的channel x H x W的vector。ROI Pooling是将一个个大小不同的region proposals,映射成大小固定的(W x H)的矩形框。它的作用是根据region proposals的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和输出回归框操作。它可以加速处理速度。

ROI Pooling有两个输入,一个是图片进入CNN后的特征图,另一个是区域的边框。ROI 的输出是一个region_nums x channels x W x H的向量。

  RoI可以看成是SPP的简化版本,原版SPP是多尺度池化后进行concat组成新特征,而RoI只使用一个尺度,可以将任意维度的特征矩阵缩放成固定维度。论文中的具体做法是,把高和宽都平均分为7*7的小块,然后在每一个小块做max pooling操作,channel维度不变,这样做能使输出维度固定,同时RoI Pooling不是多尺度的池化,梯度回传非常方便,为fine-tune卷积层提供了条件。(SPP Net不能fine-tune卷积层)
Fast RCNN 目标检测网络学习记录 (附代码)_第1张图片

3.3.2  softmax 分类器

softmax 分类器输出N+1个类别的概率,如下图所示。PASCAL VOC2012数据集中有20个分类,因此会输出21个类别的概率,其中第一个为背景概率,其余20个为每个分类的概率。所以softmax的FC中有N+1个节点。

3.3.3 边界框回归器(bbox regressor )

一幅图片中会画出N+1个分类的候选框,每个候选框都有x、y、w、d四个参数,所以 bbox regressor 的FC中有 4(N+1) 个节点。

 边界框参数回归的计算方法:

3.3.4 Fast RCNN 中 loss 的计算

因为在Fast RCNN 中需要预测N+1个类别的概率以及边界框的回归参数,所以定义了两个损失函数:分类损失和边界框回归损失。 

3.4 代码实现 

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
class FastRCNN(nn.Module):
    def __init__(self, num_classes):
        super(FastRCNN, self).__init__()
 
        self.features = torchvision.models.vgg16(pretrained=True).features
        self.roi_pool = nn.AdaptiveMaxPool2d((7, 7))
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, num_classes + 1)
        )
        self.bbox = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, (num_classes + 1) * 4)
        )
 
    def forward(self, x, rois):
        x = self.features(x)
        rois = torch.cat([rois[:, :1], rois[:, 1:] - rois[:, :1] + 1], dim=1)
        rois = self.roi_pool(F.roi_align(x, [rois], output_size=(7, 7)))
        rois = rois.view(rois.size(0), -1)
        cls_scores = self.classifier(rois)
        bbox_preds = self.bbox(rois)
 
        return cls_scores, bbox_preds

4.然后捏!

Fast R-CNN 问题和缺点

1.训练和推断时间较长:Fast R-CNN 的训练过程相对较慢,需要先训练候选区域生成网络(RPN),然后再训练目标分类网络。此外,在推断阶段,需要对整个图像进行前向传播,计算较为耗时。

2.ROI Pooling 的固定大小:ROI Pooling 操作将不同大小的候选区域映射到固定大小的特征图上。这种固定大小的映射可能导致信息的损失或扭曲,特别是对于较小或较大的目标区域。

3.候选区域生成器的质量:Fast R-CNN 使用候选区域生成网络(RPN)生成候选区域,而候选区域生成器的质量直接影响到目标检测的准确性。如果候选区域生成器无法准确地提供包含目标的候选区域,那么最终的检测结果可能会受到影响。

4.依赖预训练模型:Fast R-CNN 通常需要在预训练的卷积神经网络(CNN)模型上进行微调。这意味着它对于预训练模型的选择和质量有一定的依赖性,如果预训练模型不够准确或不适用于特定的任务,可能会影响 Fast R-CNN 的性能。

5.基于滑动窗口的候选区域生成:Fast R-CNN 仍然采用了基于滑动窗口的候选区域生成方法,这可能导致在大规模图像上的计算量较大。尽管 RPN 可以减少滑动窗口的数量,但仍需要对整个图像进行扫描。
 

参考:

[深度学习基础]Faster RCNN系列

深度学习之目标检测Fast-RCNN模型算法流程详解说明(超详细理论篇)

你可能感兴趣的:(目标检测,学习,目标跟踪,神经网络,深度学习,cnn,计算机视觉)