深度学习之物体检测——Fast R-CNN(Ross Girshick)

Fast R-CNN是Ross Girshick对R-CNN进行改进的一篇文章,影响力也比较大。R-CNN的基本思想是用box proposal的特征映射作为其特征向量,然后进行分类与box精调。但是R-CNN需要对每个box proposal进行卷积操作得到box特征映射,这样大大降低了检测效率。Fast R-CNN在R-CNN基本思想不变的情况下,只对原图做一次卷次操作得打特征映射,然后把每个box投影到这个特征映射上去,得到box的特征映射。
本文会交替地使用“box proposal”和“RoI”(region of interest)。

网络

RoI投影到特征映射上

首先计算卷积网络的输入图像 H1W1 和特征映射 H2W2 的比

spatial_scale=H2H1.

现在给定图像上的一个box: (x1,y1,x2,y2) ,将其投影到特征映射中:
x1=spatial_scalex1y1=spatial_scaley1x2=spatial_scalex2y2=spatial_scaley2.

RoI Max Pooling

每个box的大小不同,投影到特征映射上大小必然不一样。而卷积操作后面就是全连接层,全连接要求输入的大小是固定的。作者巧妙地加了一层RoI Max Pooling层,将box特征映射池化为H*W大小(一般是6*6或者7*7)。

具体操作如下:假设box特征映射的大小为好h*w,那么将其划分成H*W个格子,每个格子的大小为 hHwW ,然后在每个格子内执行Max Pooling操作。RoI Pooling操作由于过滤器的大小是动态的,所以又称为动态池化操作。

RoI Pooling层除了令输出大小固定还有另外一个特点,即把batch大小由原来的图像数量变成了box数量。

目前Caffe中已经添加ROIPoolingLayer作为基本层,以特征映射和box proposals作为输入。PyTorch也增加了torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)层,以box feature map作为输入。在实现时,Caffe为了减少内存占用率,一张图片只保存一个特征映射,然后所有的box的RoI Pooling操作都是在这个特征映射上得到的,而不是说为每个box存储其特征映射投影再进行RoI Pooling。而PyTorch采用的是后者,所以内存占用率要高,而且这一层的简单化增加了开发者的其他操作。

损失函数

caffe中也新增了SmoothL1LossLayer层,用于计算本文提出的smooth L1。

参考

[1]

你可能感兴趣的:(深度学习)