论文:https://arxiv.org/pdf/2003.12243.pdf
代码:https://github.com/shallowtoil/DRConv-PyTorch (非官方实现)
这个论文的核心词是:动态网络。作者认为,传统卷积对于不同样本使用相同的 filter,如果能够对不同区域的特征使用不同的卷积核可以显著提升特征表达能力。如下图所示,把图像分割为不同区域,对不同区域采用不同的卷积核,可以提高特征表达能力。下图左边是对目标和背景采用不的卷积核,右边是对人脸不同部分采用不同的卷积核。
为了实现这一目标,作者提出了 dynamic region-aware conv,如下图所示,包括两个步骤:
- 第一步,生成 guided mask,将特征分割为若干个区域;
- 第二步,每个区域中,生成一个定制的 filter 进行卷积(filter 可以根据输入的图像动态调整)
![](https://i-blog.csdnimg.cn/blog_migrate/dd9da9012cdc4f8b7ec424e858ed7ef4.png)
在第一步中,如何分割就相当关键了。作者是通过卷积来实现的,使用卷积生成 m m m 个通道的 guided feature 。图中包括背景、眼睛、脸、牌子、嘴五个区域,因此 m = 5 m=5 m=5。分割是通过 argmax 来实现。
动态网络大多会采用 argmax 方法,前向传播用的是 hardmax ,反向传播用的是 softmax 近似。
生成卷积核的步骤如下图所示,将输入特征自适应池化成 k × k k\times k k×k,然后使用两个连续的 1x1 卷积处理,第一个卷积使用 sigmoid 激活,第二个卷积分组为 m m m,不使用激活。
![](https://i-blog.csdnimg.cn/blog_migrate/079a4b7a3ef0705b081c39f8a8baed7f.png)
实验部分有个有趣的发现是,模型规模越小,该方法提升越明显 ,这是因为DRConv在空间维上提高了语义表达能力,对于表达能力较弱的小模型,帮助更为明显。
这个论文还有一个终极问题: feature map 每个区域对应的卷积核都不一样,不清楚如何实现这种分区域的卷积?
最简单的方式是,各个卷积核对 feature 都进行卷积,然后过滤掉不用的区域,然后合并结果。由于作者没有公开代码,不清楚实际是如何实现的。