Two stage and One stage
文章目录
关于Faster RCNN
Faster RCNN结构如上图所示,从图中可以看出,Faster RCNN主要可以分为4个部分:
1.Conv Layers
这一层其实很好理解,就是一个基础的backbone网络,它可以是VGG,GoogLenet,Resnet…中的任何一种
它的作用也很简单,就是提取特征,一般情况下,我们通常采用Conv + Activation(Relu) + Pooling作为一个Block,用来提取输入图片的特征
这里需要注意,与CNN分类网络不同的是,CNN分类网络在提取输入图片的特征以后,一般会接上一个全连接层(Fully Connected Layer),而全连接层的神经元个数,就是我们最终要分类的类别数量,但在Faster RCNN的Conv Layers中,只提取了输入图片的特征,这个特征后没有接全连接层
-
以论文中的VGG网络框架为例,VGG网络中有13个Conv层,13个Relu层,4个Pooling层,首先经过resize将输入图片缩放到固定的MxN大小
-
主干特征提取网络中所有的conv层都是kernel_size = 3, padding = 1, stride = 1,所有的Pooling层都是kernel_size = 2, padding = 0, stride = 2
-
先说说padding
在kernel_size = 3且stride = 1的情况下padding = 1可以保证输入图像大小和输出图像大小不变
-
再看看Pooling
kernel_size = 2, stride = 2,就保证每个特征图在经过Pooling层以后,它的宽和高都会变为原来的1/2
以上两个操作就保证了一个MxN大小的矩阵,在经过Conv Layers以后,它会固定变为(M/16)x(N/16),这样生成的Feature Map中的点都可以和原图对应起来
-
2.Region Proposal Network(RPN层)
经过上面Conv Layers提取的特征层(这里取个名字叫公用特征层)有两条路可以走,一条直接和ROIPooling结合,另一条是经过一个3x3的卷积,进行一个18通道的1x1卷积和一个36通道的1x1卷积**(这里需要解释一下为什么是18通道和36通道,因为在Faster RCNN中,先验框的数量为9,也就说每一个网格点上都有9个先验框,那么公用特征层上每个网格点上的每个先验框的变化情况都有4个参数,分别是x, y, w_offset, h_offset,这样一来就是9x4=36,而9x2的卷积用来预测公用特征层上每个网格点的先验框内是否包含了物体,其实是一个二分类问题)**,9x4的卷积会对这些先验框进行调整,从而获得一个新的框,9x2的卷积会判断上述获得的框内是否包含了物体
这里就获得了一个粗略的框的获取,也就是建议框,这也是Region Proposal Network这个名称的由来,实际上网络进行到这里也就完成了目标定位的功能,接下来会在这些建议框里面继续找东西
3.ROIPooling
从上面的结构图中可以看出,ROIPooling共接受2个输入,一个是经过Conv Layers后的Feature Map,一个是经过RPN层输出的Proposal boxes,需要注意的是,Proposal boxes大小是不同的,但是接下来还需要用这些特征层进行后续的分类和回归操作,如果特征层的大小不统一,则很难进行,而ROIPooling的作用就是将这些大小不同的Proposal boxes变成统一的输出大小**(其实RPN层提取的Proposal boxes可以理解为ROIPooling层的先验框)**
经过这样的处理后,即使大小不同的Proposal输出的结果也是相同大小,实现了固定长度的输出
4.Classification
分类部分就是利用获得的Proposal Feature Maps,通过全连接层与Softmax计算每个框到底属于那个类别(这里需要注意,一般情况下还有一个类别是背景),输出cls_prob概率,同时再次利用bbox回归,获得每个框的位置偏移量(x, y, w_offset, h_offset),用于回归更加精确的目标检测框
关于YOLO-V3
上图是YOLOV3的整体结构,这里主要关注以下几个部分
1.Conv Layers
YOLOv3的主干网络是Darknet-53(就像在Faster RCNN里面提到的,主干网络的作用其实很单一,就是更好的提取输入图片的特征),Darknet-53的网络结构也不复杂,就是一个个的残差模块堆叠起来的(至于什么是残差模块,这里不细讲)。当然,如果硬件配置较低,系统容量小,可以选用更小的MobileNet网络作为主干网络来提取特征,这些都是可以的
需要注意的是,在整个Conv Layers中并没有出现Pooling层,取而代之的是将卷积层的stride设置为2,以此来达到下采样的效果
2.Feature Pyramid Network(FPN层)
通常在一幅图像中包含了各种大小的物体,比如说有近处的人,远处的汽车,天上的鸟等等,这些目标物体在整幅图像中所占有的比例是不同的,我们希望目标检测网络能够一次性将这些目标物都检测出来,这就要求网络具备能“看到”不同大小目标物的能力
-
上图(a)是处理这类问题最常用的方法,即特征金字塔
-
上图(b)就是对单个特征层的检测(比方说上面的Faster RCNN),对单个特征层的检测并不能很好的检测到小目标,这也是Faster RCNN算法的缺点之一
-
上图(c)表示除了使用图像金字塔,还使用了深度学习本身的多层次结构来提取多尺度特征,(比如另一种经典的目标检测网络SSD就采用的这种方法)即特征金字塔,它采用不同大小的特征层分别进行预测,希望小目标会在较大的特征层中被检测出来,而大目标会在较小的特征层中检测出来
但是在实际的特征层中,深度不同所对应的特征层包含的信息并不是绝对相同的(比方说,随着网络的加深,浅层的特征层中主要包含低级信息,如边缘,颜色,初级位置信息等,而深层的特征层则包含高级信息,如目标的语义信息:猫,狗,汽车等),因此,对不同级别的特征层进行检测似乎可以对应不同的尺寸,但实际精度却没有那么高,这也正好解释了SSD算法对小目标检测效果不好的原因
-
上图(d)就是YOLOv3采用的FPN网络结构,它能较好的让各个不同尺度的特征都具有较强的语义信息,因为当前层的特征层会对未来层的特征层进行上采样,并加以利用,这样就保证了下一层次的语义信息合并到了上一层当中,当前层的特征层可以获得“未来”层的信息,这样的话低阶特征与高阶特征就有机的融合起来了,提高了检测的精度
3.Prediction
以输入图片大小416x416为例
经过了上面的主干特征提取网络和FPN层以后,会分别输出三个不同大小的特征尺度(13x13, 26x26, 52x52),特征层上的每个点都会对应3中(共9个)不同的先验框,其对应关系如下
特征图 | 13x13 | 26x26 | 52x52 |
---|---|---|---|
感受野 | 大 | 中 | 小 |
先验框 | (116x90),(156x198),(373x326) | (30x61),(62x45),(59x119) | (10x13),(16x30),(33x23) |
分配上,在最小的13x13特征图上(有最大的感受野)应用较大的先验框,是和检测较大的对象,中等的26x26特征图上(中等感受野),应用中等的先验框,较大的52x52特征图(较小感受野)应用较小的先验框,适合检测较小对象
同时网络的Softmax层被替换为一个1x1卷积层+logistic激活函数的结构,给出每个框的调整参数以及每个框内物体的置信度
那什么是Two Stage & One Stage?
这篇文章中所列举的两个目标检测模型其实就是Two Stage & One Stage的代表网络(Faster RCNN,YOLO系列),究竟二者有什么差别呢?(其实他们都有主干特征提取网络,都有先验框,都有回归,并且都需要调整每个框的参数,置信度等等)
根本区别
- 观察Faster RCNN网络不难发现,在经过主干特征提取网络以后还经过了一个RPN网络,其目的就是选取推荐框(过滤掉一些不包含目标的框),经过RPN网络后其实已经算是初步完成了目标检测的定位工作,只是不那么准确,然后再送入ROIPooling层,再回归出更精确的检测框参数,这也就是为什么Faster RCNN网络可以更精确的检测到目标(毕竟人家先过滤了一遍,然后再来了一遍)
- 而YOLO系列网络直接用提取到的特征进行回归同时进行置信度判断,也就是说一个网络搞定了所有问题(所以速度上会快很多,但是不可避免的会带来精度的下降,其实这也是二者的一个trade off)