深度之眼Pytorch框架训练营第四期——目标检测与Faster RCNN

目标检测与Faster RCNN

1、图像目标检测是什么?

目标检测的核心是:判断图像中目标位置,这里涉及到两个对象,一个是目标,一个是位置,因此目标检测的两要素为:

  • 分类:即对目标进行分类,得到分类向量[p0,,pn][p_0,\ldots, p_n],通常是一个n+1n+1维的向量,背景为第0类
  • 回归:确定回归边界框:[x1,y1,x2,y2][x_1, y_1, x_2, y_2]

2、模型是如何完成目标检测的?

模型要完成目标检测,必须完成两个方面的内容,首先是目标的位置在哪里,其次这个目标是属于什么类别,因此在目标检测中,模型需要把输入的一个三维张量通过复杂的运算,最终输出两个张量:

  • 分类张量:形状为[N,c+1][N, c+1]
  • 边界框张量:形状为[N,4][N, 4]

这里涉及到一个非常重要的问题——目标个数(边界框数量)NN如何确定?

  • 传统方法:滑动窗策略。在一张图像中,利用一定大小的框逐像素进行滑动,遍历整张图片,这种方法的缺点非常明显,那就是
  • 重复计算量大
  • 窗口大小难确定

利用卷积可以减少重复计算,由于特征图一个像素对应原图一块区域,因此由于滑动产生的不同窗口就对应于特征图中不同的像素点,这样就可以避免重复计算

3、深度学习目标检测模型简介

深度之眼Pytorch框架训练营第四期——目标检测与Faster RCNN
从上图可以看出,目标检测的发展可以分为两个阶段,2014年之前为第一阶段,这一时期都是使用传统方法进行目标检测,而2014年RCNNRCNN问世后,标志着目标检测进入了深度学习阶段,Fast RCNNFast \ RCNNFaster RCNNFaster \ RCNN都是与RCNNRCNN一脉相承的,这一派是属于 Two-stage ,而以YOLOYOLO为代表的网络属于 One-stageTwo-stageOne-stage 的区别如下:

深度之眼Pytorch框架训练营第四期——目标检测与Faster RCNN

从上图可以看出 One-stageTwo-stage 的区别就在于是否有 proposal generation 这个区域,这个木块是区域推荐模块,可以生成推荐的区域,输出的是候选框

4、PyTorch中的Faster RCNN训练

(1)Faster RCNN 数据流
  • Feature map
  • Softmax
  • Regressors
  • NMSOUT
  • ROILayer
  • FC1与FC2
  • c+1 Softmax
  • Regressors
(2)Faster RCNN 代码结构
  • torchvision.models.detection.fasterrcnn_resnet50_fpn() 返回 FasterRCNN实例
  • class FasterRCNN(GeneralizedRCNN)
  • class GeneralizedRCNN(nn.Module)
  • forward():
    • features = self.backbone(images.tensors)
    • proposals, proposal_losses = self.rpn(images, features, targets)
    • detections, detector_losses = self.roi_heads(features, proposals, images.image_sizes, targets)

解释:通过torchvision.models.detection.fasterrcnn_resnet50_fpn()调用模型,返回的是FasterRCNN实例,而FasterRCNN是继承于GeneralizedRCNNGeneralizedRCNN又是继承于nn.Module,里面最重要的forward函数中包含三个部分,一个是通过backlone得到特征图,然后利用rpn得到推荐区域以及利用roi_heads得到检测结果