个人理解:

整个过程是anchor回归两次,anchor第一次回归得到的咱们按论文里说的叫learned anchor,然后learned anchor再回归一下,这样回归出来的框会更加准确,这也是RefineDet做的事情,但是RefineDet做到这一步还不够完美,因为RefineDet两次回归用的特征都是与RoI不对齐的特征(虽然第二次时利用反卷积结合了高维特征)。咱们画个示例图说明一下:

黄色框是anchor,红色是GT,紫色是learned anchor,由anchor回归到learned anchor是用feature map上黑色特征点这一特征(D维向量)做的,而这一黑色特征是使用的灰色卷积核在其相邻的9个点做卷积得到的,这9个相邻的点所组成的区域映射到原图,也就是原图中灰色区域这一部分,换句话说,这一黑色特征的全部信息基本都来自于原图的灰色部分,但是显然,这一灰色区域并没有完全包含整个长颈鹿,用这一区域所得到的特征去预测一个完整的长颈鹿,肯定有一点问题。这就是特征与RoI不对齐的意思。这里的RoI实际上就是learned anchor。

那怎样才能将特征与RoI对齐,这就是AlignDet要做的事。第一步跟RefineDet一样,先将初始的anchor回归得到learned anchor。这个时候learned anchor其实已经比较接近GT了。第二步,就是跟RefineDet不同之处了,RefineDet还是使用的不对齐特征再把learned anchor回归一次,而AlignDet是用的对齐的新特征。怎么做到对齐的?如下图:

把第一次用的特征再用deformable conv卷一下,当卷积核卷到黑色位置的时候,卷积核加上此位置给定的offset,于是卷积核的形状就变成浅红色的9个点,这九个点所组成的区域映射回原图就是learned anchor的包含区域。这样的话,经过deformable conv所得到的特征就是对齐的了。那么他咋能保证卷积核加上offset就正好是learned anchor 包围区域的?原因是这里的offset是根据learned anchor与卷积核的位置差算出来的。因此RoIConv实质上是一种offset已知的Demforable Conv。AlignDet是RefineDet的延申,而RefineDet又是SSD的延申。确实是很好的工作,值得学习!


随便说两点吧

1.前一段时间刚在Anchor的前世今生中提到misalignment问题,今天就放出文章了。

2.能不能顺便解决一下正负样本定义问题,这个问题在之前关于cascade R-CNN的介绍中提及过。我最近的实验发现,正负样本的定义稍微变一下就能有1个点左右的gain

厚脸皮地附上我的几个实验:


事情好像变得有点奇怪,感觉还是得出来正面回应一下。

首先感谢大家对我们工作的关注,本来出结果之前都不准备放 paper 的,但是最近有一些相似的工作,比如 @王剑锋 提到的 PA 挂出来了,所以还是放出来。

整个工作的思路还是沿著 refinedet -&> guided anchoring 过来的,兼有吸收了一些 cascade r-cnn 的思想。做这个工作一方面是想解决 anchor 和 feature 对不齐的问题,另一方面也是想阐述 one-stage 和 two-stage 的区别并没有想像中的大(paper 另一个候选名字叫 bridging one-stage and two-stage detection)。

其实一旦讲清楚了 im2col 和 roialign 的关系之后,如何去弥合 one-stage和 two-stage 在 alignment 上的差别就已经显而易见了。

选择 7x7 RoIConv 和 1x1 1024c 的 feature 是为了尽可能的对齐 FPN Faster R-CNN,由于 1x1 卷积不会扩散 roi feature ,从而保持每个 region feature 的独立性,这样就和 R-CNN head 完全一致了。Aligndet 和 Faster R-CNN 的区别也就仅仅剩下 dense prediction + focal loss 对上 balanced sampling prediction 了。

仔细研究了一下 reppoints,发现虽然 motivation 大不相同,但是最后大家确实殊途同归。对于 table 7 里 RPDet 不是 multi-scale training 表示确实疏忽了,误以为和其他 retinanet-based method 用的相同的 protocol,后续会更新一版 paper。在这里对 @B1ueber2y 以及其他作者表示歉意,也期待你们在新一版的论文里更公平的比较。

另一方面,我们对点数这个东西其实没有特别关注,诸如 GN/SyncBN,用 YOLO/FCOS 这类更好的 assign 策略,回归单独用大一点的头,smooth_l1 换成 l1,同等 FLOPs 下换 depthwise 涨点/降计算量这些方法我们都有意回避了。如果大家能从 ablation 分析里获得一些 insight,就是对我们工作最大的鼓励。谢谢。


AlignDet本质就是一个two stage检测器。不过它把two stage检测器的第二个阶段(ROIAlign和RCNN)用基础模块(ROIConv+Conv)实现了。

现在的two stage检测器,要是代码功底不强,不管是想亲手撸一个训练框架还是前向框架都不太容易。

ROIConv有两大优势:

1、大大降低了手撸two stage检测器的难度,方便two stage检测器的部署;

2、ROIConv计算量跟普通Conv差不多,也就是ROIConv可以使得一个检测器既有one stage检测器的速度,又有two stage检测器的效果。


我最初看的时候以为主要想解的是single-stage里面point feature和region feature的misalign,后来看著看著发现怎么RoI都出现了,又重新整理了下自己的观点

核心motivation是去解cascade single-stage detector里面不同stage之间的feature misalignment,之前的比如RefineDet这样的工作虽然相当于有多个stage去做多次分类和回归,但是不同stage用的feature是相同的,并没有考虑到每次refine之后框都发生了变化,后续的操作应该依赖于更新之后的feature,我之前在Cascade RetinaNet里面有分析过这种feature misalign,厚颜无耻放一下水文链接

https://arxiv.org/abs/1907.06881

所以一个很容易想到的idea就是用deformable conv去学习这种regression前后的offset,然后用feature aggregation来做align,Guided Anchor也用了类似的做法不过主要解的是shape misalignment

再往前进一步,既然你已经知道了regression offset的预测值,那直接把这个拿过来当做deformable conv的offset不就是RoIConv了,相比于直接用deformable,这样的方式可能会更明确一些,在Table4里面能裸涨一个点

当然RoIConv在去解上述regression前后的misalign的同时,也因为经过deformable conv整合了一些original conv采样区域外的信息,所以也能更好的拟合region feature

羡慕韬哥和乃岩一直有solid work产出,弱鸡如我流下了不会写kernel的泪水

P.S. AlignDet的名字被用了,难过


推荐阅读:
相关文章