SPPNet
简单说一下 SPPNet 的操作,这个是通过你输入的size 来决定你最后pooling 层的 SizeX,SizeY, 以及它的 StrideX, StrideY。相当于是固定了一个你的 output 的通道,然后将你现有的内容压缩到了一个固定的长度之内。
图像识别的训练过程:
SPPNet的能够接受任意尺寸图片的输入,但是训练难点在于所有的深度学习框架都需要固定大小的输入,因此SPPNet做出了多阶段多尺寸训练方法。在每一个epoch的时候,我们先将图像放缩到一个size,然后训练网络。训练完整后保存网络的参数,然后resize 到另外一个尺寸,并在之前权值的基础上再次训练模型。相比于其他的CNN网络,SPPNet的优点是可以方便地进行多尺寸训练,而且对于同一个尺度,其特征也是个空间金字塔的特征,综合了多个特征的空间多尺度信息。目标检测的训练过程如图:
其他过程与RCNN类似,只不过是先通过卷积获得一定的特征图,再在特征图上标记寻找SS出来的 region proposal 映射而来的特征图信息。
P.S: 这里画图的大部分内容,其实在于训练全连接层。因为SPPNet的反向传播非常的困难(参考:https://www.zhihu.com/question/66283535),所以我们这边看到的SPP Pooling层之前的卷积参数是使用迁移学习所得到的。
Fast RCNN
简单来说,Fast RCNN 是对于原RCNN 及 SPPNet 进行了组合。首先,在上一篇博客RCNN中提及了,在RCNN训练时候,我们往往开销过大,开销过大的原因在于,我们在计算多个 proposal (即生成多个候选框)之后,我们根据候选框对原图进行了裁剪,这个裁剪使得我们将可能存在物体的区域变成了图片,然后放入网络进行训练。
但是这种方式的缺点就在于,我们对于一张图片会重复计算多次它的抽象特征。这就造成了不必要的开销。所以在Fast RCNN中,我们通过先将原始图进行卷积网络抽取特征,之后我们对 feature map 在进行抽取。这里会出现一个问题,我们在根据 proposal 大小位置,抽取相同区域的 feature map 然后在进行全连接层的非线性计算。在这个过程中,我们传入全连接层的 特征向量必须使得维度相同。
ROI Pooling
根据上述的差不多的描述,我们可以得出 ROI Pooling 层究竟做了什么,简单来总结就是两点:
ROI Pooling 其实比 SPPNet Pooling 要简单很多,简单来说就是在最后卷积出来的 feature map 上进行特征区域选择,选择完毕后,然后直接暴力简单分成 HW 块进行 max pooling.
- (1)根据 region proposal 的位置信息,获取相应的 feature map;
- (2)在相应的 feature map 上做 max pooling ,将其整规到相同维度的特征向量。
训练方式
假设这是一个 5个分类(其中一类是北京)的图像识别,那么我最后生成的 Label( 即 Y )的长度就是 5 + 4 * 4 = 21 。 前五即分类信息, 就是我们平常使用的 softmax 来做, 后面 16,就是剩下4个类的 左上角以及右下角坐标信息,每个类有4个 [ X左上, Y左上, X右下, Y右下 ], 如果这个候选框没有出现该类别物体,那么就全部标记为 [ 0, 0, 0, 0 ] . 根据这个预测出来的信息,在分开两边对 FC(全连接层)进行反向传播的参数更新。
参考博客及代码:
【1】https://blog.csdn.net/WoPawn/article/details/52463853
【2】https://github.com/Liu-Yicheng/Fast-RCNN
【3】https://blog.csdn.net/xiaqunfeng123/article/details/78716060
【4】https://blog.csdn.net/auto1993/article/details/78514071
【5】https://blog.csdn.net/u011918382/article/details/79455407
【6】https://blog.csdn.net/sunyao_123/article/details/77628365
【7】https://www.jianshu.com/p/fa9a5929d2e7
【8】https://www.zhihu.com/question/66283535
【9】https://blog.csdn.net/AUTO1993/article/details/78514071 【ROI 层 seesion 选取】