最近在看faster-rcnn的源码,写一写笔记~
之前看论文的时候,anchorbox这个东西,虽然大概意思是理解了,但是还是有很多细节没想明白,之前读代码的时候又有了更深的理解。
首先,faster-rcnn在计算anchorbox之前大概是下面这几步:
为了更方便理解,我列出了实际情况中一个图片的输入对应的过程中的各个输出结果的size,而实际情况中,输入的size是不确定的,resize之后的大小也不确定,这里只是为了方便理解和说明。可以看到,anchorbox实际上是基于feature map的,而anchorbox的数量为:75 x 100 x 9 = 67500,这里的9就是论文中的k,后面会说道,也就是说,anchorbox的数量是依赖与featuremap的,featuremap上的每个点,都对应着k个anchorbox。
关于anchorbox的生成
其实上面提到的k并不难理解,论文里说明,anchorbox有base的size,之后根据面积缩放因子(scales)和长宽比(aspect ratios)来得到k个不同大小的框。我不理解的是,这个base size是从哪来的?该不会是拍脑袋想出来的吧?论文里貌似也没怎么解释这个数字是怎么得到的。后来想了想,可能也是经过计算的,这个数值配上缩放之类的操作,大部分图片上的区域也就出来了。
其实featuremap对于anchorbox的生成的贡献就是提供了一个中心点而已,featuremap每个位置上的点,就对应一个anchorbox的中心,然后呢,我知道了这么多中心点,根据base size,scales,aspect ratios就可以算出来一个矩形的长和宽。矩形的中心点就是featuremap上的那个点对应原图上的点。
那么问题来了,这个矩形的长和宽的计算很好理解,但是怎么得到featuremap的点对应原图(这里原图指的是resize之后的图,后面也都这么说,因为是resize之后的图参与计算,得到的location信息是图上的相对比例的坐标,所以不用真正的原图也没关系)上是哪个点呢?之前我一直想不明白,以为有什么高端的算法,直到我看到代码以后,发现是我傻逼了。通过上面的图可以看到,原图过了网络之后,大概缩放比例就是8倍,源码里,有一个stride参数,也就是把featuremap的坐标平移一下(乘8)就得到相对于原图的坐标了。
所以anchorbox的值跟featuremap的值其实并没有什么卵关系,只和featuremap的size相关,这就比较好理解了吧。我们得到了anchorbox,它的值是一系在原图中的中心点和长宽值组成的矩形,接下来的操作就是根据anchorbox的位置和大小把featuremap切出对应区域然后做roipooling,回归等等……
相关源码
下面的是生成anchorbox的源码,可以参考看,一些地方我加了些注释方便理解
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Generates grid anchors on the fly as used in Faster RCNN.
Generates grid anchors on the fly as described in:
&#