写在前面

多标签图像识别是一项具有挑战性的计算机视觉任务。然而,目前解决这一任务的方法复杂、计算量大、缺乏直观解释 。为了能够有效地感知不同类别物体所占据的空间区域,作者提出了一个非常简单的模块,Class-Specific Residual Attention(CSRA)。首先计算一个根据特征的空间Attention Score,然后将其与类别无关的平均池化特征相结合,CSRA能够为每个类别生成 class-specific的特征。

CSRA在多标签识别任务中取得了SOTA的性能,同时也比其他方法简单得多。最重要的是CSRA实现起来非常简单,只有4行代码,就可以在没有任何额外数据训练的情况下,在许多不同的预训练模型和数据集上实现比较大的性能提升。因此,相比于以前的方法,SCRA具有易于实现、计算量小、解释直观、良好的可视化 等优点。

什么是多标签图像分类?

From:https://blog.csdn.net/xiaosongshine/article/details/98172805)

1)传统单标签分类

city(person)

2)多标签分类

city , river, person,  European style

3)人的认知

两个人在河道边走路

欧洲式建筑,可猜测他们在旅游

天很蓝,应该是晴天但不是很晒

相比较而言,单标签 分类需要得到的信息量最少人的认知 得到的信息量最多多标签 分类在它们两者之间

 1. 论文和代码地址

Residual Attention: A Simple but Effective Method for Multi-Label Recognition

论文地址:https://arxiv.org/abs/2108.02456
代码地址:官方尚未开源
核心代码(第三方):https://github.com/xmu-xiaoma666/External-Attention-pytorch#23-Residual-Attention-Usage

 2. Motivation

卷积神经网络(CNN)在许多计算机视觉任务中成为了主流结构,特别是在图像分类中。然而,尽管已经有许多用于单标签分类的网络结构被提出,如VGG、ResNet、EfficientNet和VIT,但多标签识别的进展仍然有限。在多标签任务中,对象的位置和大小变化很大,很难学习一个适合所有对象的单一特征表示。

近年来对多标签识别的研究主要集中在标签间的语义关系对象proposal注意力机制 三个方面。基于标签间的语义关系方法,计算成本较高而且存在手工定义邻接矩阵的问题;基于对象 proposal的方法,在处理对象proposal上花费太多时间;尽管注意力模型是一种端到端的,相对比较简单的方法,但对于多标签分类,这些模型往往过于复杂,导致难以优化、实现或解释。

基于以上的问题,作者出了一个简单而容易的类特定残差注意力(class-specific residual attention,CSRA)模块,通过充分利用每个对象类别单独的空间Attention,取得了较高的准确性。

上图为CSRA的Pytorch代码,在没有任何额外的训练的情况下,只用4行代码,CSRA在许多不同的预训练模型和数据集上,可以改进多标签识别的performance(结果如下表所示)。

在本文中,作者们证明了CSRA这个操作,实际上是一个class-specific的Attention操作。基于CSRA,作者在VOC2007、VOC2012、MSCOCO和WIDER-Attribute四个多标签数据集取得了SOTA的性能。此外,作者提出的CSRA对空间注意力如何融入其中,还做了一个直观的解释。

 3. 方法

3.1. 为什么max pooling会有用?

上表展示了对于不同的模型和数据集,CSRA都能提升性能(其中是一个超参数)。对于多标签任务,作者使用mAP作为评价指标,而ImageNet(单标签任务)使用Accuracy。

这些结果表明,简单地增加一个max-pooling可以提高多标签识别的精度,特别是当baseline模型的mAP不高时。从上面的代码中可以看出,CSRA就是多了一行max-pooling,那么,为什么这个max-pooling是有用的呢?

1)首先,y_max获取了每个类别的所有空间位置中的最大值。因此,它可以被看作是一种class-specific的注意力机制。

2)另外,作者推测CSRA能够让模型关注不同物体类别在不同位置的分类得分,因此相比于传统的分类网络,CSRA更加适用于多标签分类的任务。

3.2. Residual attention

对于一张图片,首先通过一个CNN网络来提取特征,其中是一个的特征矩阵:

在实验中,特征的维度通常是,因此在空间维度打平之后就可以表示成。然后通过一个FC分类器得到分类的结果,其中为第i类分类器的参数。

然后就可以定义第i个类第j个位置上的class-specific attention scores(在空间维度进行softmax,使得每个类所有空间上概率之和为1,以此来得到每个类别的空间attention map):

其中是用来控制score的 temperature,是一个超参数。代表了第i类在第j个位置上出现的概率。

得到第i类在第j个位置上出现的概率之后,我们就可以把这个概率和特征进行相乘求和,得到class-specific的特征向量了:

全局的class-agnostic特征可以通过将所有位置的特征进行求平均得到:

由于在多分类任务中能够达到比较好的效果,所以作者依旧将作为主特征。这里个人其实有一点疑问,既然作者想证明class-specific的特征是非常有用的,但是为什么作者又用了一个比较小的权重来减少class-specific特征的影响?

如上图所示,最终的特征有class-specific特征和class-agnostic特征相加得到:

最终分类的结果就是用特征用分类器进行分类的结果:

其中为数据集中类别的数量

3.3.  CSRA 的解释

在本节中,作者将会证明代码中的max pooling的实现方式就是CSRA的一种特殊情况。首先将分类的结果重新展开可以得到:

公式第一行的第一项的是第i个类的base logit,也可以用下面的公式表示:

第二项的是第k个位置的分类分数,然后再用来进行加权。

当T趋向于正无穷时,softmax的输出结果就变成了一个Dirac delta函数:

因此就可以用最大项来代替,这也就得到代码中max pooling的由来:

另外,f可以被表示成:

在这个式子中常数可以直接被忽略,因此CSRA的特征就是特征被加权之后的结果。

3.4. Multi-head attention

在上面的代码和式子中,我们可以看到有一个 temperature超参数需要去调,不同的类可能需要不同的超参数。为了避免这个调参的过程,作者引入了一个mul-head attention的方式来避免这个调参的过程。

如上图所示,作者将CSRA改成了一个多分支的结构(每一个分支就代表是一个head),每个分支使用相同的,但是使用不同的。当只有一个head时,固定为1;随着head的增加,不同head的也不断增大,如下所示:

通过将不同的结果进行融合,就能够避免了调参的过程。

 4.实验

4.1. Comparison with state-of-the-arts

4.1.1. VOC2007

可以看出在ResNet上加入CSRA,就能够超过以前的SOTA模型。

4.1.2. VOC2012

如上表所示,当仅使用ResNet-101的ImageNet预训练模型时,CSRA已经超越了以往的方法。通过用额外数据(MS-COCO)进行预训练,可以进一步提高CSRA的性能,达到新的SOTA性能。

4.1.3. MS-COCO

MS-COCO上的实验结果表明,CSRA模块不仅适用于ResNet结构,而且也适合Vision Transformer结构。

4.2.  Effects of various components in CSRA

4.2.1. Class-agnostic vs. class-specific

class-specific的特征比 class-agnostic的特征更有效。通过合并两者,CSRA的performance明显优于前两者。

4.2.2. Visualizing the attention

可以看出,CSRA的attention map能够精确定位来自不同类别的对象。

4.2.3. Effect of λ

如上图所示,VIL-L16的性能在λ < 1.0时稳定上升;在λ = 1.0达到峰值,而ResNet-cut在λ = 0.1处得分最高。

4.2.4. Number of attention heads

从上表可以看出,当H增加到较大的数值(6或8)之前,mAP值稳定增加,说明了multi-head CSRA的有效性。

4.2.3. Normalization

上表显示了Normalization的影响,可以看出Normalization对精度影响不大,但是在训练的时候使用能够加快收敛的速度。

 5. 总结

在本文中,作者提出了一个新的多标签分类框架CSRA,仅通过四行代码,就能够提高多标签分类任务的准确率。该算法不仅提高了识别精度,而且消除了对超参数的依赖。CSRA在4个基准数据集上的表现优于现有的SOTA方法,不仅简单,而且可解释性更强。

▊ 作者简介

厦门大学人工智能系20级硕士

研究领域:FightingCV公众号运营者,研究方向为多模态内容理解,专注于解决视觉模态和语言模态相结合的任务,促进Vision-Language模型的实地应用。

知乎/公众号:FightingCV

备注:分类

图像分类交流群

扫码备注拉你入群。

在看,让更多人看到  

大道至简,仅需4行代码提升多标签分类性能!ICCV21 南大提出Residual Attention相关推荐

  1. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  2. python加密敏感信息_仅需10行代码,使用python加密用户敏感数据

    原标题:仅需10行代码,使用python加密用户敏感数据 数据分析师必须要遵守的一个规则就是数据保密,但在跨部门沟通的时候,难免会有数据泄露的情况,所以,对于用户的姓名.手机号.地址等敏感信息,一般需 ...

  3. 最简单的爬虫代码 python_最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  4. python简单爬虫代码-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  5. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    OpenCV-Python实战(14)--人脸检测详解(仅需6行代码学会4种人脸检测方法) 0. 前言 1. 人脸处理简介 2. 安装人脸处理相关库 2.1 安装 dlib 2.2 安装 face_r ...

  6. 神经网络 c++ 源码 可以直接复制运行,提供数据集,操作简单,最少仅需4行代码

    神经网络 c++ 源码 可以直接复制运行,提供数据集,操作简单,最少仅需4行代码 本文的神经网络,让你省去Python那些花里胡哨的变量名,最少仅需4行代码即可完成自己的神经网络** 本文章采用c++ ...

  7. [Unity实战]仅需25行代码 安卓/ios打包跳过Unity启动Logo动画...[新手开箱可用][全平台支持]

    [Unity实战]仅需25行代码 安卓/ios打包跳过Unity启动Logo动画 参考文章 接上一篇文章-unity隐私协议包通过审查 1.直接上代码: 2.打包后使用效果展示: 3.源码地址: 参考 ...

  8. 网传梅姨照片竟然是电脑合成的!仅需 100 行代码,你也能做到!

    近日,有关人贩子"梅姨"的图片在朋友圈以及网络平台热传,所有人都以为这是一张官方发布的照片,于是纷纷在朋友圈转发. 但是当天下午,公安部儿童失踪信息紧急发布平台曾发布消息称,&qu ...

  9. python房子代码_基于python的链家小区房价爬取——仅需60行代码!

    简介 首先打开相关网页(北京链家小区信息). 注意本博客的代码适用于爬取某个城市的小区二手房房价信息. 如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多. 效果展示 因为只需要60行 ...

最新文章

  1. mysql中FIND_IN_SET的使用方法
  2. 知识图谱的皇冠:知识图谱推理的前世今生
  3. ffmpeg+mencoder环境搭建和视频处理总结
  4. java awt button_AWT Button类
  5. GaussianBlur函数
  6. Position定位
  7. IOS 学习笔记(3) 视图UITabbarController
  8. 贺利坚老师汇编课程36笔记:[BX+SI+IDATA]和[BX+DI+IDATA]寻址
  9. STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码 提供配套CUBE工程
  10. 【安装配置】SAS9.4安装
  11. Virtualbox源码分析6_VMM虚拟化实现源码分析3 HMVMXR0.cpp
  12. 小米node2红外_蓝牙,移动侦测,环境光,小米人体传感器2
  13. 【多线程】多线程到底是个甚——多线程初阶(复习自用)
  14. Kafka 概念、单机搭建与使用
  15. 既然心动,那就赶快行动吧!
  16. python怎么读汉字翻译拼音_Python 返回汉字的汉语拼音
  17. 免费AI标注工具-音频查重工具
  18. pygame开发2048游戏(附源代码)
  19. 手机ZTE中兴U802 U807手机解锁图案忘了 如何处理
  20. 机器视觉工程师前景如何,计算机视觉工程师薪资

热门文章

  1. IPC--进程间通信七 (socket)
  2. Golang笔记——go使用Redis
  3. 一个简单的PHP邮件列表管理器
  4. php中mysqli用法举例
  5. [gstreamer][001] Seek issues and so on
  6. python爬去朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
  7. python消费kafka逻辑处理导致cpu升高_大数据技术之一次KAFKA消费者异常引起的思考...
  8. java信号灯_java 信号灯 Semaphore
  9. mysql update多条件批量更新_Mybatis中进行批量更新(updateBatch)
  10. android cm 老罗,Android之父打造了一款全面屏旗舰 罗永浩如此评价