task
Fine-Grained Visual Classification(细粒度视觉分类),以下简称FGVC。
相较于传统的目标检测和分类,有如下两个难点:
1.高类内方差(high intra-class variance):
图片中属于同一类别的对象通常呈现显著不同的姿态和视角。
2.低类间方差(low inter-class variance):
下属类(例如哈士奇和金毛两个下属类,都属于狗这一超类)之间的视觉差异往往是微妙的,因为它们属于同一超类别。
数据集
当前细粒度分类的主流数据集有三个:
- CUB-200-2011:鸟类数据集,200类11788张图像,每张图像包含15各部位的位置信息。(位置信息主要给基于部件的网络模型训练用)
- Stanford Cars:汽车数据集,196类16185张图像,不包含部件信息。
- FGVC-Aircraft:飞机数据集,102类10200张图像,不包含部件信息。
近两年大部分细粒度分类论文都以上述三个数据集作为benchmark。
AP-CNN
2021年2月刊登在IEEE的一篇细粒度分类的文章。
论文地址(下载需要校园网)
源码地址
整体结构
1、主要改进
1)Attention Pyramid(注意金字塔)
在FPN的基础上,对每一层feature map都使用注意力机制,形成一个自下而上的注意力层级结构,作者给其取名为 注意金字塔(Attention Pyramid),这个结构中每一层又包含两个部分,分别是 空间注意 和 通道注意,生成过程如下图所示:
-
每一层的通道注意由FPN中对应层的Feature map进行一次全局平均池化和两次全连接而成。
公式如下:A k ( c ) = σ ( W 2 ⋅ R e L U ( W 1 ⋅ G A P ( F k ) ) ) A^{(c)}_k=\sigma(W_2\cdot ReLU(W_1\cdot GAP(F_k))) Ak(c)=σ(W2⋅ReLU(W1⋅GAP(Fk))) -
空间注意则由对应的Feature map进行一次3*3的反卷积,再做sigmoid而成。
公式如下:A k ( s ) = σ ( v c ∗ F k ) A^{(s)}_k=\sigma(v_c*F_k) Ak(s)=σ(vc∗Fk)
而空间注意通常的做法是对特征层进行最大池化和平均池化,之后把这俩结果进行堆叠,再做1*1卷积,然后sigmoid,最后和原特征层相乘即可。
这个部分作者没有做消融实验,我认为作者是想要和之前已经存在的CBAM进行区别,所以进行反卷积,魔改了一下😓。
- 想要了解注意力机制原理的读者可以参考:注意力机制的实现
2) ROI引导的细化模块
流程图:
以上述注意金字塔得到的空间注意
A
k
s
A^{s}_{k}
Aks 作为掩膜,在每一层都生成对应数量的ROI(region of interest),效果如下:
之后根据这些生成的ROI做基于ROI的Dropblock和Zoom-in(过程省略,因为非常简单),得到最终的特征map
Z
k
Z_k
Zk.
最后再对 Z k Z_k Zk 做一次分类,将这次的结果和初始FPN经过注意力后得到的分类结果进行平均,得到最终结果。
2、与主流模型比较
3、可视化
首先在训练时加上可视化选项,cd到AP-CNN目录下,激活对应环境,输入:
python -m vindom.server
在本机指定的窗口(官方初始定义为8097)
出现如下提示:
浏览器打开本机对应端口:
然后运行训练文件,输入:
python train.py --visualize
- 记得要带上可视化选项。
如下提示,则开始训练。
此时观察到浏览器端口页面变为训练与测试图像的ROI和三层mask展示:
(顺序被我不小心打乱了😓,我还不会恢复…)
4、总结
- 本文其实没有任何的创新点,作者将空间注意和通道注意在FPN每一层都进行运用,得到了相较于baseline:NTS在CUB-200-2011上0.9个点的精度提升。
- lego的方法值得学习和应用😏