【CV中的注意力机制】史上最强"ResNet"变体--ResNeSt
关注上方“深度学习技术前沿”,选择“星标公众号”,
资源干货,第一时间送达!
【前言】:我们前面已经详细介绍了Attention机制和视觉注意力机制在图像分类结构中的应用--SENet 和 基于SENet的改进版--SKNet。本篇我们将来介绍另一篇SENet的改进版,与此同时,它也针对ResNet网络结构的变体,号称史上最强“ResNet”--它就是ResNeSt。
ResNeSt:Split-Attention Networks
论文地址:https://hangzhang.org/files/resnest.pdf
代码地址:https://github.com/zhanghang1989/ResNeSt
ResNeSt 的全称是:Split-Attention Networks,也就是特别引入了Split-Attention模块。ResNeSt中的S 应该就是 Split。
ResNeSt 实际上是站在巨人们上的"集大成者",特别借鉴了:Multi-path 和 Feature-map Attention思想。主要是基于 SENet,SKNet 和 ResNeXt,把 attention 做到 group level。
其中:
GoogleNet 采用了Multi-path机制,其中每个网络块均由不同的卷积kernels组成。
ResNeXt在ResNet bottle模块中采用组卷积,将multi-path结构转换为统一操作。
SE-Net 通过自适应地重新校准通道特征响应来引入通道注意力(channel-attention)机制。
SK-Net通过两个网络分支引入特征图注意力(feature-map attention)。
ResNeSt将通道维度的注意力机制扩展到特征图组表示,可以使用统一的CNN操作符进行模块化和加速
ResNeSt 和 SE-Net、SK-Net 的对应图示如下:
Split-Attention 网络
1
Split-Attention 块
Split-Attention 块是一个由特征图组和 split attention 运算组成的计算单元,下图展示了 Split-Attention 块的整体思路:
2
特征图组(Feature-map Group)
与 ResNeXt 块一样,输入的特征图可以根据通道维数被分为几组,特征图组的数量由一个基数超参数 K 给出,得到的特征图组被称为基数组(cardinal group)。研究者引入了一个新的底数超参数 R,该参数规定了基数组的 split 数量。
然后将块输入 X 根据通道维数 X = {X1, X2, ...XG} 分为 G = KR 个组。在每个单独的组中应用不同的变换 {F_1, F_2, ...F_G},则每个组的中间表征为 Ui = Fi(Xi), i ∈ {1, 2, ...G}。
3
基数组中的 Split Attention
根据 [30,38],每个基数组的组合表征可以通过跨多个 split 的元素求和融合来获得。第 k 个基数组的表征为:,k ∈ 1, 2, ...K。带有嵌入 channel-wise 统计数据的全局上下文信息可以通过全局池化来获得。第 c 个分量的计算公式为:
基数组表征 V^k ∈ R^{H×W×C/K} 的加权融合通过使用 channel-wise 软注意力来聚合。其中,每个特征图通道都是在若干 split 上使用一个加权组合获得的。第 c 个通道的计算公式如下:
4
Split-Attention模块的细节:
对上图的详细解释如下:忽略batch size,并假设C能被K*R整除。模块的输入feature map的shape是[C, H, W],采用group conv的思想,将input沿着channel维度split K个,这K个tensor的集合我们称之为一个group。更进一步,将该group中的每个tensor沿着channel维继续split R个,这R个tensor组成一个subgroup,这样总共有K个subgroup,每个subgroup的大小是R。考虑每个subgroup,其由R个tensor组成,记为U。
1. 先将这R个tensor沿着channel纬相加,然后作global average pooling,得到一个d = C / K / R大小的向量
2. 以该向量作为输入,后接入多层非线性变换,最终输出向量长度必须等于C / K,如此K个subgroup就会产生总长为C的attention权重
3. 每个subgroup中的tensor,channel维等于C / K / R,乘以上步输出的逐channel权重
关于attention权重:
1. R > 1时,每个subgroup中超过1个tensor,不妨设为x、y列向量,权重就是a、b,a * x + b * y,其中a、b都是列向量,同一行的两个scalar之和为1,因此在上面第2步最终输出attention之前用的是softmax;
2. R = 1时,就是SE,上面第2步的最终输出之前用sigmoid,然后a * x
关于实现:
在实际实现中,由于打包成一个模块,因此输入C,输出D,其他参数比如radix不影响D,也就是conv的output channel就是D * radix。另外,由于最终还要concatenate,下面举例解释,假设group以及subgroup的size都是2,tensor就是x、y、v、w,attention weight是a、b、c、d,都假设是1D列向量
1. 原始op
分别a * x + b * y,c * v + d * w,得到两个列向量,然后列方向concatenate,也就是,
2. 向量化实现的op
先将x、v,y、w分别concatenate,同样a、c,b、d也分别concatenate,加权和,因此上述原始op的结果,进行如下等价转换,
这也是开源代码中的实现方式。
5
实验结果
ResNeSt 在ImageNet 图像分类性能如下,轻松超越SKNet、SENet、ResNetXt和ResNet。
ResNeSt 和其他SoTA的CNN模型进行性能比较(特别是NAS阵营)
ResNeSt 在MS-COCO 目标检测和实例分割任务上的表现性能如下,涨点太恐怖!
ResNeSt 在ADE20K 语义分割任务上的表现性能如下:
参考链接
https://zhuanlan.zhihu.com/p/133496926
https://zhuanlan.zhihu.com/p/135220104
https://zhuanlan.zhihu.com/p/133197521
https://zhuanlan.zhihu.com/p/132655457
https://zhuanlan.zhihu.com/p/134135389
重磅!DLer-计算机视觉交流群已成立!
欢迎各位Cver加入计算机视觉微信交流大群,本群旨在交流图像分类、目标检测、点云/语义分割、目标跟踪、机器视觉、GAN、超分辨率、人脸检测与识别、动作行为/时空/光流/姿态/运动、模型压缩/量化/剪枝、NAS、迁移学习、人体姿态估计等内容。更有真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、行业技术交流等,欢迎加群交流学习!
进群请备注:研究方向+地点+学校/公司+昵称(如图像分类+上海+上交+小明)
广告商、博主请绕道!
???? 长按识别添加,邀请您进群!