faster-rcnn中,对RPN的理解

先吐槽一下,网上教程很多,但是对 滑动窗口、anchor、rpn这一块说出这是太烂了,很少人可以讲的清楚明白,
经过自己看了原文章《Faster R-CNN: Towards Real-Time Object Detectionwith Region Proposal Networks》,结合网上一些资料,貌似终于明白了这里的工作原理的。
不得不说,真的很经典,但是不仔细理解的话,很容易和一般的cnn搞混!

原文中rcnn部分的截图




图片来自网上,黑色是滑动窗口的区域,就是上图的红色区域的sliding window其他颜色 9种窗口 就是anchor机制生成的9种区域

这里要把sliding window和卷积层的滑动区别开,sliding winsow的stride步长是1!(想到经典的harr+adaboost人脸检测)

sliding window只是选取所有可能区域,并没有额外的什么作用!


以下是我对faster-rcnn中的RPN的理解:

经过前面的网络 生成了一个 多通道的特征图,接下来就是通过在这些特征图上应用 滑动窗口 加 anchor 机制 进行目标区域判定和分类了,

目标检测,就是包括 目标框定 和 目标判定。

所以 这里的 滑动窗口 + anchor的机制 的功能就 类似于 fast rcnn 的selective search 生成region 的作用

rpn就是一种对这些 可能region进行 回归 和分类的 小网络,

用原文的话讲“we slide a small network over the conv feature map output by the last shared conv layer”

1.RPN是一个 卷积层(256维) + relu + 左右两个层的(clc layer 和 reg layer)的小网络
  应用在滑动窗口区域上的 , 所有的滑动窗口 共享这个 RPN
  这个卷积层 对比 普通的卷积层
  1,它是一个将 n x n x channels的输入 通过256个 n x n 大小的卷积核 生成 1 * 1 * 256的feature map,即最后是256维的特征
  2,没错 和 普通的卷积层一样,只不过经过它卷积后 特征图变成1 x 1了
  3,由于此时输出的是 1 * 1 *256,所有cls layer 和reg layer是用 1 x 1的卷积核进行进一步的特征提取,
这里1 x 1卷积核卷积时,对各个通道都有不同的参数,因为输入又是1 x 1的图片,所以相当于全连接的功能,相当于把 1 * 1 * 256展平成 256,然后进行全连接
2.关于 anchor机制
  anchor机制 就是 在n x n的滑动窗口上,进一步选择,生成k种可能的区域
  滑动窗口 加 anchor机制 基本把目标可能出现的区域都涵盖了

  所以 滑动窗口 加 anchor 就替代了 滑动窗口加金字塔 的功能


但是anchor的区域大小不一样,怎么输入到rpn?目前还没有进一步看,目测也是根据 fast rcnn的坐标映射,即输入一个滑动窗口的,经过rpn,提取这个滑动窗口上所有k个区域的特征

待补充。。。

---------------2018.1.20补充

anchor是根据nxn区域的中心点,推算出对应原图在这个中心点的k种不同大小的可能区域。

之前的理解错了,用anchor机制只是为了得到k个区域的监督信息(区域的坐标和前景背景标签)

从nxn提出的256d特征是被这k种区域共享的,在clc layer和reg layer计算损失的时候,用这共享的256d特征 加上 anchor推算出k种区域的坐标和前景、背景的标签,便可以对这k种区域同时计算loss。

clc layer和reg layer同时预测k个区域的前景、背景概率(1个区域2个scores,所以是2k个scores),以及bounding box(1个区域4个coordinates,所以是4k个coordinates),具体的说:

clc layer输出预测区域的2个参数,即预测为前景的概率pa和pb,损失用softmax loss(cross entropy loss)(本来还以为是sigmoid,这样的话只预测pa就可以了?)。需要的监督信息是Y=0,1,表示这个区域是否ground truth

reg layer输出预测区域的4个参数:x,y,w,h,用smooth L1 loss。需要的监督信息是 anchor的区域坐标{xa,ya,wa,ha} 和 ground truth的区域坐标{x*,y*,w*,h*}

显然,上面的监督信息:Y,{xa,ya,wa,ha}(k个),{x*,y*,w*,h*}(1个),就是通过anchor机制产生的。这几个参数的指定(比如k个anchor区域的Y是怎么得到的)是根据文章中的样本产生规则,很多博客中也都提到了。

e....



猜你喜欢

转载自blog.csdn.net/ying86615791/article/details/72788414