目标检测与Faster RCNN
1、图像目标检测是什么?
目标检测的核心是:判断图像中目标的位置,这里涉及到两个对象,一个是目标,一个是位置,因此目标检测的两要素为:
- 分类:即对目标进行分类,得到分类向量 [ p 0 , … , p n ] [p_0,\ldots, p_n] [p0,…,pn],通常是一个 n + 1 n+1 n+1维的向量,背景为第0类
- 回归:确定回归边界框: [ x 1 , y 1 , x 2 , y 2 ] [x_1, y_1, x_2, y_2] [x1,y1,x2,y2]
2、模型是如何完成目标检测的?
模型要完成目标检测,必须完成两个方面的内容,首先是目标的位置在哪里,其次这个目标是属于什么类别,因此在目标检测中,模型需要把输入的一个三维张量通过复杂的运算,最终输出两个张量:
- 分类张量:形状为 [ N , c + 1 ] [N, c+1] [N,c+1]
- 边界框张量:形状为 [ N , 4 ] [N, 4] [N,4]
这里涉及到一个非常重要的问题——目标个数(边界框数量) N N N如何确定?
- 传统方法:滑动窗策略。在一张图像中,利用一定大小的框逐像素进行滑动,遍历整张图片,这种方法的缺点非常明显,那就是
- 重复计算量大
- 窗口大小难确定
利用卷积可以减少重复计算,由于特征图一个像素对应原图一块区域,因此由于滑动产生的不同窗口就对应于特征图中不同的像素点,这样就可以避免重复计算
3、深度学习目标检测模型简介
从上图可以看出,目标检测的发展可以分为两个阶段,2014年之前为第一阶段,这一时期都是使用传统方法进行目标检测,而2014年
R
C
N
N
RCNN
RCNN问世后,标志着目标检测进入了深度学习阶段,
F
a
s
t
R
C
N
N
Fast \ RCNN
Fast RCNN和
F
a
s
t
e
r
R
C
N
N
Faster \ RCNN
Faster RCNN都是与
R
C
N
N
RCNN
RCNN一脉相承的,这一派是属于 Two-stage ,而以
Y
O
L
O
YOLO
YOLO为代表的网络属于 One-stage , Two-stage 和 One-stage 的区别如下:
从上图可以看出 One-stage 和 Two-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
是继承于GeneralizedRCNN
,GeneralizedRCNN
又是继承于nn.Module
,里面最重要的forward
函数中包含三个部分,一个是通过backlone
得到特征图,然后利用rpn
得到推荐区域以及利用roi_heads
得到检测结果