谷歌和伯克利一起提出的Bottleneck Transformer(BoT)属于一种hybrid network,将cnn和transformer结合起来,以期达到比二者单独使用更好的效果。
BoT整体的想法其实比较简单,针对object detection、instance segmentation等对输入图像尺寸要求较高的任务,普通的transformer(ViT)计算量和显存占用都很难做到大分辨率输入,DeTR这一类网络则是直接采用了cnn输出的特征作为transformer的输入,无法实现端到端的训练。因此,BoT作者提出在resnet的bottleneck中直接用MHSA替换3x3卷积,也就是所谓的BoT block。在BoT block中,采用的依然是4倍的通道压缩率。
作者进行了一系列object detection的实验,证明了并非将所有的bottleneck都换成BoT效果是最好的,最终只替换了C5的三个bottleneck。这相比普通的resnet,其实改动量并不是那么大,而且个人感觉跟non-local network也很像。虽然作者在一开始就解释了BoT和non-local的区别,但其实都是实现细节上的,比如是否加入了position embedding,是plug-in还是replace等等,本质上的区别实际上不是很大。
最后就是实验效果,作者主打的是检测任务的backbone,一系列ablation study都是检测实验,既避开了跟检测的各类方法进行比较,也避开了跟其他backbone网络硬碰硬拼精度,也是很鸡贼了。在image recognition任务上,模仿EfficientNet,作者也加了很多训练的trick,比如large resolution,longer training,random augmentation等,最终精度84.7是刷的非常高了,跟efficientnet-b7 comparable了,对于后期想入坑做同样任务的工作来说是一个需要比较的非常强的baseline。不过我感觉一般同等计算量的情况下,比较到T3或T4就ok了吧。