Object Detection Memo
This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat:
jintianiloveu
本篇记录一些目标检测上知识,以备忘。
NMS
NMS 是一个基础,首先从检测器中会生成很多框,比如Car有100个,Pedestrian有200个,但是实际上图上只有10个Car, 2个Pedestrian,怎么去精确的得到这个12个物体bbox呢?比如说我们要对100个Car的候选框进行一个非极大值抑制,我们先对这100个候选框按照回归的概率排个序,也就是说有多大的概率是属于Car,x1, x2, x3, x4….x100, 然后我们取x100,计算剩下的99个框与这个x100的IOU,如果IOU大于某个阈值,我们就把这些框删掉,并且把x100纳入到我们picked也就是选中了的框当中,接着再选择剩下的框当中,概率最大的框,比如x98, 再判断剩下的框与x98的重叠区域是否大于一个IOU阈值,如果大于就去掉这些框,直到剩下的框当中没有可以被去掉的,就把这些框保留下来。非常好理解。
Faster-RCNN如何提取anchor
在faster-rcnn中有很多问题,很多是不回去思考它的,问题有这么一些:
- faster-rcnn生成的anchor是怎么和原图对应起来的,比如从特征图映射anchor,怎么还原到原图中去?
- faster-rcnn的anchor是怎么生成的?比如你有几种尺寸和几种长宽比的anchor,怎么去提取proposal?
单单这两个问题估计很多就不知道了。首先说一下第一个问题,为什么从特征图提取anchor可以对应到原图的确切位置呢?试想一下,我从一张原始图片经过几层卷积池化之后得到一个featuremap,那么我从featuremap中选择一个box,这个box选中的区域跟原图是没有啥对应的,因为你featuremap不是原图片的等比例缩小,可能还包含一些强行拉伸的过程,这样转换的过程有很多种,你咋么知道哪个对应哪个呢?其实这个问题的核心在于,fast-rcnn的卷积层中,用的都是3x3的卷积核,并且padding都是1,每一个卷积层都是这样的,思考一下,这样下来,我经过一次步长为1的卷积之后,原特征图的长宽是不是没有变?是的,没有变!仔细想一下便知道,然后经过一次pooling之后变为原来的1/2,那么经过4层之后就是原来的1/16,这样等于是原图片的等比例缩小了!!直接按照比例映射回去就ok了!!那么思考到这个层面,以后对比SSD,Yolo算法的时候,这些前置网络的结构就一目了然,是不是也会是这么一种情况?我想应该是的。
再说一下第二个问题,anchor如何生成的?很显然,在这里面,你的anchor box必须要在生成的featuremap的每一个像素点上做预测(以每一个像素点为中心点)获取到这么个box大小的区域,对他进行分类和位置的微调。这样的话加入你的featuremap有40x40,你的anchor是9,那么总共会产生40x40x9这么多个proposal,在这里还有一个细节,你拿到的这个proposal的anchor实际上还会对每一个anchor预测一个是前景物体还是背景的概率,这些背景的box用来作为负样本进行训练. 当然最后不是所有的anchor都会拿去训练,会提取其中一些,比如128个就足够了。
FPN
Feature Pyramid Networks for Object Detection。 这个特征金字塔网络又是什么卵东西?FPN实际上实在深度学习以前用的比较多的一种方法,不管是特征金字塔还是一层一层的CNN,都有这么一个矛盾存在 前面高分辨率的特征包含的语义较为浅层,后面低分辨率的特征反而包含了高层的语义信息,因此这是一个矛盾,我们希望高层的语义信息能够更加高分辨率,因此需要做一些改变。说白了,这个FPN要做的事情就是,以前是提取一个特征图,然后在这个特征图上提取anchor,现在FPN觉得你这个只对深层的提取anchor虽然语义强但是分辨率太低了,我不如在每一层都提取一次anchor,我还可以更简单一些,直接只用一个anchor的size,这也每一层得到的尺寸是递减的,同时能在高分辨率的浅层语义和低分辨率的深层语义提取anchor,毫无疑问这样可以打打的提升检测的效果。
Faster-RCNN中的两次分类
实际上Faster-RCNN是有两次分类过程了,只是很多人一般都不注意,第一次是在RPN里面,为什么RPN要分类呢?分的又是什么?RPN里面分的其实是当前的物体是不是物体,也就是说是不是背景,所以我们一般都有一个背景的类别,然后我们提取Proposal的时候,基本上已经可以得到一个比较精确的候选框了,再经过nms之后,我们就能够得到一个较好的结果,只不过这个时候还没有分类,我们还不知道具体每个框到底是属于哪个类别。
第二次分类就是在ROI-Pooling之后,对统一尺寸后的ROI进行分类操作。