![](https://i-blog.csdnimg.cn/blog_migrate/31d2c7c5e73bd2c145efea6738a42814.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f7cf6ac9507cf1ebc4ac3a805ecc673b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7f25a23441a38acea4619e4803270ac6.jpeg)
2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。(包涵foreground和backrround的判断和bboxregression两步.)
RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal ( bbox regression的输入仅是个:1x1 后的 map)。 最后的Proposal 层负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。解释下im_info,im_info是proposal 层的输入。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定 ,im_info=[M, N, scale_factor] 则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为
大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。
对bbx 的 regression,我参考的知乎文章写的很清楚,我这里就直接搬过来:
- 给定:anchor
和
- 寻找一种变换F,使得:
,其中
那么经过何种变换F才能从图10中的anchor A变为G'呢? 比较简单的思路就是:
- 先做平移
![](https://i-blog.csdnimg.cn/blog_migrate/ac9528cc5424d91c0d06fbec22c39127.jpeg)
- 再做缩放
![](https://i-blog.csdnimg.cn/blog_migrate/ed0e6e8b670d338b8ec92972248c848d.jpeg)
观察上面4个公式发现,需要学习的是 这四个变换。当输入的anchor A与GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当anchors A和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了 。。。有待好好理解...)。
接下来的问题就是如何通过线性回归获得 了。线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即
。对于该问题,输入X是一张经过卷积获得的feature map,定义为Φ;同时还有训练传入的GT,即
。输出是
四个变换。那么目标函数可以表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/7c24c48741528b38c1c4668c194a0ee1.png)
其中Φ(A)是对应anchor的feature map组成的特征向量,w是需要学习的参数,d(A)是得到的预测值(*表示 x,y,w,h,也就是每一个变换对应一个上述目标函数)。为了让预测值与真实值差距最小,设计损失函数:
![](https://i-blog.csdnimg.cn/blog_migrate/8c68611f67d1ed7b665a7cd329b63df2.jpeg)
函数优化目标为:
![](https://i-blog.csdnimg.cn/blog_migrate/b747cb9b264dae1a9363b93040672951.jpeg)
需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。
说完原理,对应于Faster RCNN原文,foreground anchor与ground truth之间的平移量 与尺度因子
如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8e1f18eda3b25f85c26d9188d0727181.jpeg)
对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 ,即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。
那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 ,显然即可用来修正Anchor位置了。
RPN网络的总结:生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
3. RoI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
RoI pooling层主要是解决上述得到的各个 proposals size 各不相同的问题。它们这样的不同size直接resize是会破坏特征的,如:
RoI pooling 具体操作:
将每个proposal水平和竖直分为pooled_w和pooled_h份(本文是7 和 7),对每一份都进行max pooling处理。这样处理后,即使大小不同 size 的proposal,输出结果都是 大小,实现了fixed-length output(固定长度输出)。 caffe layer 参数:
layer {
name: "roi_pool5"
type: "ROIPooling"
bottom: "conv5_3"
bottom: "rois"
top: "pool5"
roi_pooling_param {
pooled_w: 7
pooled_h: 7
spatial_scale: 0.0625 # 1/16
}
}
4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。(进行目标具体类别识别.并在一次bbox regression,精准目标坐标.)
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。Classification部分网络结构如图:
![](https://i-blog.csdnimg.cn/blog_migrate/20b1a564e989dc6d870cfccc85f53c8c.jpeg)
从PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:
1. 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
2. 再次对proposals进行bounding box regression,获取更高精度的rect box
这里来看看全连接层InnerProduct layers,简单的示意图如图:
![](https://i-blog.csdnimg.cn/blog_migrate/a419b6011ac4ba5dc9588f409c8abbbb.jpeg)
其计算公式如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdc14300cb643c508319541723c7e206.jpeg)
其中W和bias B都是预先训练好的,即大小(维度)是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性。 RoI 的必要性!!!
更所细节,移步知乎传送门,大神写的真心良心!!!