谷歌目前挂在arXiv上, 估计打算投CVPR2020? 基于EfficientNet做的目标检测, 几个主要的点: BiFPN(双向FPN), Cross-Scale Connections(特征加权再融合融合).
paper: https://arxiv.org/abs/1911.09070
code: 未开源, 不过看起来还算容易复现.
>>
效果图
效果非常惊人, 绝对的sota, 并且具有更低的FLOPS(仅仅十分之一).
这篇文章主要针对特征融合和参考EfficientNet的做法通过协调width、depth和resolution三个方面来优化网络的性能和速度(效率).
BiFPN
从结构和融合两个角度做了改进
1. FPN结构
事实上PANet采用的结构在性能上是比较好的, 但是计算量比较大, 于是做出一部分简化:
- 去掉只有单个输入的节点, 因为它不太重要(假设), 就简化成图e的样子.
- 同level的feature map增加skip-connection, 就得到了图f.
- 然后把这个结构当做一个block, 重复几次, 就得到了下图, 也是最终的结构.
相对FPN能涨4个点:2. feature map的融合方式
这部分其实很简单, 但是之前一直没有人注意到, 在以往的对featmap(feature map, 之后我就这样简称了)的融合都是直接resize到相同尺寸然后相加, 这意味着两张featmap具有相同的权重. 从更复杂的建模角度来说这显然是不合理的, 于是作者采用加权求和(这不就是attention嘛…).
简单的说, 如果$feat1, feat2$是两张被融合的featmap, 那么以往的办法就是:
- $feat1->resize(feat2.size())$
- $feat2 = 1feat1 + 1feat2$
那么文章中采用的办法就是:
- 同上
- $feat2 = weight_{feat1}feat1 + weight_{feat2}feat2$
权重需要做出一些限制, 否则会给训练带来困难:
其实就是去掉了指数的softmax.
其他
剩下的一点改进在于参考EfficientNet从网络的width, depth和resolution三个角度来考虑优化如何结构, 这部分其实没什么好说的, 可以直接在paper里看最终结果, 超参数非常非常多, 也没有给出太多解释, 估计也是谷歌用算力硬调出来的(特别是channel里的1.35!).
总结
实际上除了featmap加权求和, 其他的或多或少都在PANET或者其他paper里见过, 而且也有很多经验法则的东西, 不过性能实在是高啊…