通常在 Flag 立下之后的第一篇博客,总想把很多东西都放在一篇文章里面说得透透的,这样就像是在一个迷宫,越走发现可以走的路越多,所以往往就偏离主线越来越远,因此原计划就成了烂尾楼。
而解决拖延症的最好办法就是抛弃完美主义,无论写的多烂,先搞定一个版本,后面再改。因此本篇就是出于这个初衷,可能有理解不到位的地方,希望大家讨论指正。
闲话少叙,下面进入主题
------------------------这是分割线---------------------------
Anchor 的使用是 faster-rcnn 最核心和本质的创新点,faster-rcnn 通过预定义一系列位置相对固定的 anchors,对应回原图获得bounding boxes (bbxes),然后利用 RPN 网络对anchor 进行 前/背景 判断,位置回归;从而获得最终的 proposals。接下来就是fast-rcnn 的事情了。而一般来说,对于faster-rcnn 的应用,一个好的 anchor 设置方式,能够起到非常关键的作用。
而关于 anchor 到底是怎么和 proposal 对应上的?这个点如果不看代码,只看论文其实还挺让人疑惑的,不知道怎么回事,我也没有找到特别好的技术博客来介绍这个细节 。我原来一直以为是这个点比较简单,以至于大家都不屑于讨论,但是后来我问过很多人,很少能对这个问题给出满意答复。我一直笃信的是,对于一个算法来说,了解其运行原理比能调通它的代码更加重要,只有知道本质所在,才能真正因地制宜,收为己用。基于这个出发点,本博客就是介绍 anchor 是怎么对应到原图上的bbx 的?以及由此过程,带来的一些注意事项。
一、 如何确定原图中对应的 bbxes?
要冲anchor设置中在原图中获得对应的 bbxes, 关注两个因数即可:
- bbxes 中心点位置;
- bbxes 的高 和 宽。
如下图所示,每个 bbx 的中心点由 backbone 最后一个卷积层后的 feature map 大小确定。如果 feature map 大小是 50 * 38, 即将原图划分为 50 * 38 的栅格,每个栅格的中心即为bbxes 的中心点。
而 bbxes 的长 & 宽,则由 anchor 的scale 与 aspect ratio 确定。如 fater-rcnn 原文中,确定基准面积为, bbxes 高宽比为
,由此可得每个位置的 9 个bbxes 的高宽如图中所示。这里每个 bbx 的高宽确定逻辑如下:
- 从基准面积里面选定一个面积,比如选定 bbx 的面积 =
- 然后从高宽比里面选定一个比值,比如高/宽 = 2
- 设 bbx 宽为 w, 则高为 2w;
(注意在很多代码中,会先确定一个基准矩形base_size 比如 16 * 16, scale 用 [8,16, 32],这里的scale 是基础矩形面积的倍数,其实是一致的)
中心点与长宽都确定后,这样原图中所有 bbxes 的位置就确定了,也就是说,bbxes 的中心由 backbone 的featue map size 确定,高 & 宽由 anchor 设置的面积和高宽比确定。
二、anchor 设置有什么注意事项?
初始 bbxes 确定后。便可以训练 RPN 网络。在这之前还要进行两个步骤:
1. 计算bbxes 与 groundtruth 的 iou ,如果iou 大于阈值,则认为是前景,否则认为是背景(用与训练rpn分类分支)
2. 计算bbx与最近 grountruth 的偏移量 (用与训练rpn 回归分支)
通过 rpn 网络获得了 proposals 后,在原图中找到对应的 bbxes (需要加上偏移量);接下来便是fast-rcnn 的套路:通过新的 bbxes 按比例在conv feature map 上找到相应的节点区域;把proposals 对应的 feature map区域通过 roi pooling 层化为为统一尺寸进行具体类别的判断和位置回归。
通过上面,在 faster-rcnn 调参时,有一下几个注意事项:
1. 要根据自己目标的特点来设置anchor,不要盲目用原来的比例设置。比如,我们要检测的是人,一般来说就很少会出现高宽比 0.5 的情况,这样就不要设置高宽比为 0.5 的anchor 了,要灵活。
2. backbone 的深度要注意,并不是越深越好。如在上图中,cov feature map 中一个节点对应与原图感受野至少是 16 * 16 范围。如果目标比较较小,无论怎么样,到 feature map 是找不到合适到对应区域的。反之越浅的层获得的 proposal 分辨率越高,但是可能模型能力又会受限,而且 bbx 个数会比较多。backbone 的深度要与目标物体大小也是一个权衡。这里有个相对比较好的解决方案是将 fpn 网络(feature pyramid netwrok)的思路引入faster-rcnn (这个思路比较简单,有兴趣可以直接看原文)
-----
好了,到这里,这篇博客终于凑的差不多了,有问题,欢迎指正。随着知识体系的发展和积累,对问题的看法和角度总是螺旋上升,因此本博内容会持续更新,查漏补缺。
下一篇将介绍 anchor 对应到 bbx 后,如何通过分类和回归形成最终的 proposals
参考资源:
1. faster-rcnn 原文:https://arxiv.org/pdf/1506.01497.pdf
2. 一文读懂Faster RCNN: https://zhuanlan.zhihu.com/p/31426458