RoI Pooling 到底是如何运作的?轻松理解

鉴于网上博客许许多多的例子都写的让人难以理解

我觉得既然分享了就要让人看的懂

那我就自己写一个能让初入目标检测的小伙伴都能懂的呗

借用一张图来表示整个RoI Pooling的架构
ps.为了比照原来设定比例, 我把32改成16
在这里插入图片描述

首先我们从左手边开始看起, 我们都知道Faster RCNN最一开始就是输入一张原图
那么这个例子中的原图就是800*800大小的

接着经过骨干网络VGG16的extractor之后, 会提取出feature map, 在conv5 卷积之后输出的feature map大小就会是800/16 x 800/16 = 50x50的大小 (对应到此图的中间部分)




好 那么接下来我们要记得 就要准备进入我们今天主角RoI Pooling了
在这里插入图片描述
我们看一下这张图,其实蛮直观的,看中间的部分, 左手边上面有好几个黑色矩形就是RoI, 右手边是一张feature map, 这两个呢 就是我们要输入到RoI Pooling的 两个部分

  1. 刚刚提到的feature map 50*50 (vgg16提取出来的)
  2. RPN网络筛选出来的128个Proposal RoI, 每个Rol 的shape = (索引,左上坐标yx, 右下坐标yx)

如果你对RoI不清楚的话, 下面这只小拽猫应该能帮助你加深印象, 可以看到有非常多proposal RoI在这只猫上, 我们就是从这些紫色框中通过训练找到最好的那个

在这里插入图片描述

我们现在两个都有了就可以输入到RoI 进行Pooling的操作了
首先我们要知道RoI Pooling具体要做的事情是什么?

RoI pooling会将每一个输入的RoI以及feature map上对应RoI的区域 , 转化成一个"固定维度的map", 那么这一个"固定维度的map" 也是for 每一个RoI的, 这个"固定维度的map"的大小是取决于我们设定的超参数

看完这段话是不是有点懵 哈哈, 没关系 往下看就懂了

这个超参数一共会有两个或三个, 如果是两个的情况下就是

  1. pooling之后的大小 pooled_size
  2. 缩放比例spatial_scale

三个的情况其实只是pooled 分成了pooled_height 以及 pooled_width 而已 但是基本都是一样大的, 所以用pooled_size一个参数就可以了

我们先说第一个参数, 一般会是7*7的大小, 当然也能根据手头上的问题来做调整

我们设定pooled_size为 7, 也就是要将feature map上的roi区域变成7x7个block

在这里插入图片描述
feature map是50x50, 而原图上665x665大小的roi也依照1/16倍缩放成41x41就是图中那个红色矩形, 这个41就会被依照pooled_size 切成77个block, 每个block取最大值,最终缩放成77的大小, 我这边在大家补充一下会更明白的

看下这张图, 我们用小一点的feature map来举例子
在这里插入图片描述

实际情况不会每个RoI都刚好是相同的高跟宽了, 像这个图来说
假设feature map= 8x8, 图上的黑色矩形就是其中一个ROI, 大小是5x7 ,
如果我们设定pooled_size = 2, 那么黑色的矩形就会切成2*2个block
接着就做MaxPooling, 也就是每个block取最大值输出, 是吧? 只是max pooling的概念很好理解的

所以你能看见左上那个block最大值是0.85, 右上0.84, 左下0.97, 右下0.96
那么max pooling之后就会输出一张2*2的map, 上面的值分别是如下图

同理的, 刚刚的feature map 是41x41 我们设定pooled_size = 7x7 那么原来的41x41就会分成7x7个block, 一样每个block取最大值, 就得到输出size 7x7了, 也就是Max pooling后的输出

那么同样的操作会在每一个RoI上面都做, 记得128个RoI里面不可能每个区域都是一样大的, 无论RoI区域大小多大, 依照同样的方式进行RoI Pooling 都会得到相同的输出 7x7

我们现在把channel也考虑进来, 一样依照一开始的例子

假设是原图shape依照C, H, W是(3, 800,800)的狗猫照片

经过vgg16 extractor 提取之后 的feature map shape变成了(512, 41, 41)
那么在经过RoI Pooling之后的shape会是多少呢?

这个时候可以先自己思考一下了
.
.
.
.
.
没错, 答案就会是(512, 7, 7) 还没说完, 这是单个RoI的shape
那么如果是128个RoI呢? 那么我们就能看做是(128, 512, 7, 7)
这里的128我们就能看做是batch_size啦

这边我要补充一下
其实上面那张8x8的图, 实际分割的时候 并不是这么刚好的分成四个block, 一个像素点是有可能会被多个block所用
在这里插入图片描述
那么实际的情况会是像这个样子, 中间的十字就是重复的区域

这部分说明可以参考知乎连接
https://zhuanlan.zhihu.com/p/66124459

那么看完应该能够对RoI Pooling有个理解了吧
更进阶的就要来读一下反向传播的公式了
之前一直有疑虑就是RoI Pooling究竟有没有反向传播?
恩 是有的

我这边推荐一篇文章写的还蛮清楚的
https://blog.csdn.net/xunan003/article/details/86597954
可以好好的参考啦






延伸阅读一下
Faster-RCNN anchor box Pytorch 锚点生成 (含代码)

reference :
https://deepsense.ai/region-of-interest-pooling-explained/
https://medium.com/@k.sambasivarao222/region-of-interest-pooling-f7c637f409af
https://zhuanlan.zhihu.com/p/66124459

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值