mmdetection 代码库中的 anchor 设置原则

本文主要介绍 CUHK 的 mmdetection 代码库 (https://github.com/open-mmlab/mmdetection)中关于 anchor 的设置的一些 tips。以下提到的所有 anchor 尺寸均为对应到输入图像上的bounding box 尺寸。 

mmdetection 代码库总体框架还比较清晰,对于大部分经典的检测算法都有实现。大部分的接口参数都可以通过修改配置接口文件实现,配置文件在 ~/mmdetection/tree/master/configs/ 文件夹中。

一般来说,利用开源的检测代码库做自己的任务,一个肯定要考虑修改的地方便是 anchor 机制。因为自己检测任务中的目标的尺寸和高宽比和开源模型中的目标可能会不一致。

已 mmdetection 的 faster_rcnn_r50_fpn_1x.py 文件为例。本配置主要是算法是 Faster-RCNN + RPN,目标任务是 COCO 物体检测。输入尺寸为 800 * 1333 左右,利用 FPN 在 5 个尺寸的 featuremap 上进行 anchor 设置。最小的 anchor 基准面积为 32 * 32,最大的基准面积为 512 * 512 (高宽比不同,面积相同)。

而如果自己准备输入的图像尺寸为 512 * 512,而且目标相对较小,比如面积在 16*16~32*32之间,那么anchor 设置就不能用默认的了。那么怎么在 mmdetection 代码库中根据自己的任务来设置 anchor 参数呢?

首先关注以下几个参数:

mmdetection 代码库中的 anchor 设置原则
配置文件中的关键字段

其实,这里面有一个隐含参数没有显示出来就是:

anchor_base_sizes : 见~/mmdet/models/anchor_heads/anchor_head.py ;这个参数物理含义是base anchor 的高和宽。与 anchor_scales 共同决定了基准 anchor 的尺寸。为什么在这里没有显示呢?因为在代码中,anchor_base_sizes 被设置为与 anchor_strides 相同。

anchor_strides  -- 与 RPN 中选取的 feature map 尺寸有联动关系,这里 len(anchor_strides)==5,说明在 5 个feature map 上进行anchor 设置。一般原图到目标 feature map 缩小了多少倍,就设置为多少。anchor_strides 为 base anchor 族(一个基准  base size 的基准 anchor + 不同的高宽比的模版形成一个anchor 族)设置完成后平移的 stride,以保证设置的anchors 能覆盖原图所有区域。这里将 anchor_strides 设置为与 anchor_base_size 相同,目的是对于 FPN 的每一个 feature map 中anchor 生成的区域能刚好覆盖所有的原图区域。如果anchor_base_size 大于 anchor_stride 则会照成一些冗余,反之则会有一些区域覆盖不了(有兴趣自己可以画一下)。

anchor_scales -- 默认为 [8, 16, 32], 物理含义是base anchor 的倍数,与 anchor_base_sizes 共同决定anchor 的面积。比如在上图例子中,anchor_base_sizes == anchor_strides == [4, 8, 16, 32, 64],anchor_scales == [8] 因此 anchor 最小面积为 (4*8)*(4*8) = 32 * 32, 最大面积为 (64*8)*(64*8) = 512 * 512。

anchor_ratio: 这个参数比较好理解,就是面积固定后,anchor 的高宽比。

综上,如果我的任务中,目标面积为 16*16~32*32。那么我应该做如下参数设置:

anchor_scales = [4]

anchor_base_size = anchor_stride = [4, 8, 0, 0, 0]

anchor_ratio 根据目标可能的高宽比来设置 (可以先做个统计,同样目标尺寸也可以先看以下统计分布)

 

这样,其实anchor 就在浅层的 feature map 中获取,在深层不取anchor。(fpn中,浅层获取小目标anchor,深层获取大目标anchor)

总结起来,如果要用 mmdetection 中的检测器适配自己的任务,那么在anchor 设置中,首先统计自己目标的尺寸和高宽比,然后按照上面的基本原理调整以上三个参数的配比即可。

有问题,欢迎留言讨论。

参考资料:

1. Faster-RCNN 中的 anchor 与原图中 boundingbox 的对应关系 https://blog.****.net/yangyehuisw/article/details/105033932