以下是笔者对这篇论文的粗略理解,不代表文章作者观点。
本文更多是本着学习交流(复现结果)的态度去撰写,所以并非直译,只摘取重要观点。
如果在阅读过程中觉得哪里写得不好,欢迎在下方评论指出或者私信交流。谢谢。
摘要
目前解决多标签图片识别问题的方法大多依赖于额外的处理提取假设的区域(region proposals),导致多余的计算且达不到很好的效果。我们提出的多标签识别模型“记忆--注意”模块使得具有可解释性且符合上下文语境。这个模块包括两个部分:一个空间转换层,从卷积提取后的响应图中定位“注意区域”;另一部分是LSTM子网络,通过捕捉第一部分定位区域的全局依赖关系预测该区域的类别(分数)。
1. 介绍
多标签识别任务可以理解为多个单标签识别任务的集合,需要解决的困难包括:巨大的类间差距、视角、尺度变换、遮挡以及光照。同时,多标签识别任务还需准确预测出图片中存在的所有类别,这就要求模型对图片有更深的了解(如通过结合语义标签和区域去捕捉相互依赖关系)。
目前主流的多标签识别任务算法一般包括两步:
- 产生一系列足够多的假设区域,保证所有的前景目标都在区域内。可以采取“自底向上”的策略,从图片关键特征出发;也可以通过训练一个额外的检测器。
- 通过分类器或者神经网络的方式预测这些假设区域的类别得分
很明显,提取大量的假设区域需要巨大的计算开销,而这些假设区域中大多数又是无效的。同时,过于简单化理解目标间的依赖关系,模型在复杂场景中失效。
Wang等人在论文《A unified framework for mutil-label image classification》中采用CNN-RNN模型共同描述语义类别依赖关系和图片类别关系。然而,他们的模型中忽视了语义标签与图片内容间清晰的对应关系,同时也缺乏挖掘图片深层信息的能力。
对比之下,我们提出来的模型可以清楚地发现“注意区域”的响应是由多语义标签决定,同时基于全局视角捕捉这些区域的语义关系。
我们提出的方法主要有3点贡献:
- 我们提出一个主流的“proposal-free”方法,能通过图片的不同比例自动发现具有语义知识的区域,同时捕捉他们的长期语境依赖关系。
- 我们进一步提出在“空间转换层”加了三个约束(后文会详细介绍),确保学习到更多有意义的、可解释的区域,从而提高多标签分类能力。
- 通过在VOC、COCO数据集上大量实验,证明了我们方法的精度与效率都比其他多标签分类方法要好。
2. 相关工作
目前图片分类任务取得巨大成功是因为大量被标注的数据集以及深度卷积神经网络的快速发展。
2.1 多标签图片识别
人工设计特征时期,大多采用“词袋模型”解决多标签识别任务。但随着复杂场景的出现及手工设计特征过于繁琐且不稳定,深度卷积神经网络提取的深层特征泛化能力强,逐渐取代“词袋模型”。为了更好地考虑标签间的相互关系,不再独立看待每个标签,许多基于深度卷积神经网络的方法还是包含了很多传统的形象化模型,如条件随机场、依赖网络、共生矩阵。
目前大多数方法都对全图提取特征,但缺乏空间转换操作。这样的处理方法,一方面不能清楚地反应区域与类别标签的对应关系;另一方面,极其容易受复杂背景的影响。同时,主流的多标签识别算法的瓶颈在预处理的“建议区域”生成过程。
2.2 可视化注意力模型
Jaderberg等人在论文《Spatial transformer networks》中提出了一个不同空间转换模块用于提取注意力区域,可克服图片比例、旋转、变换、复制等各种问题。此外,这个模型容易集成到神经网络中,基于标准的梯度反向传播算法进行优化,不需要借助强化学习技术。
3. 模型
模型结构:CNN+ST+LSTM
- 图片经过深度卷积神经网络(如VGG-16)提取最后一层特征的响应图(如conv5_3),记为fI
- ST(spatial transformer,空间变换层)在每次循环中定位一个“注意区域”
- LSTM预测该区域的类别分数,同时更新ST的参数
- 集合所有循环产生的类别分数,得到最终的类别分布。
3.1 ST——定位注意力区域
ST(spatial transformer,空间变换层)是一个基于样本差异进行计算的模块,通过给定的尺寸,提取输入响应图的子区域作为变换后的区域。容易集成到神经网络中,通过标准反向转播算法即可实现优化。
在论文《Spatial transformer networks》中,用公式证明了
进行复制、平移、缩放操作,只需要一个映射矩阵M[2,3]
一个有趣的例子:
在本文中,ST层的工作是从特征图fI中提取注意区域(fk),方法是由神经网络学习的映射矩阵M
sx、sy:缩放参数
tx、ty:平移参数
3.2 循环“记忆——注意”模块
这是我们模型的核心模块,包括一个LSTM网络和一个空间变换层。在循环过程中,寻找最具判别力区域,并预测这些区域的类别分布。
对于第K次循环,ST层从fI中利用Mk提取注意力区域的过程如下:
LSTM以fk为输入,更新隐藏状态(hidden state)及记忆单元(memory cell):
其中relu、σ,tanh是三种常见的激活函数,W、b表示需要学习的权重和偏置,ik、gk、ok、mk、ck、hk分别表示输入门、遗忘门、输出门、输入调节、记忆单元和隐藏状态。本模型中采用常用的LSTM结构,不再赘述。有需要了解的读者可以参考链接。在理想状态下,记忆单元ck记录(编码)了前k-1个时刻的有用信息。
-
M的更新:
其中sk表示预测的类别分数(score)分布 -
类别预测
对于第K+1次循环,我们可以得到K个分数向量{s1、s2、s3……sk};而sk={s1k、s2k、s3k、……sCk}
则对于第c类,有
4. 训练过程
4.1 分类损失
根据类别分数sc,利用softmax函数进行归一化操作,可以得到各类别的预测概率:
对于每张图片 xi,Ground-truth yi 是一个one-hot向量,yci=1表示原图 xi 中存在目标c;||yi||1表示求向量元素绝对值之和,对于one-hot向量,即求yi不为0的个数。分类损失函数如下:
4.2 注意力区域约束
通过大量实验,单纯定义分类损失我们的模型也能取得一定效果,但会产生3个问题:
- 冗余:在每次循环中,ST层会倾向于重复提取图片中的最显著区域,这就无法保证我们的模型能够识别出全部的目标
- 忽略微小目标:这跟第一个问题其实是一致的,ST层会倾向于提取最显著区域(大目标)而忽略小目标
- 空间跳跃(Spatial flipping):The selected attentional region may be mirrored vertically or horizontally。(这里没理解过来)
为了解决上诉问题,我们定义了关于ST层中变换矩阵M的约束条件:
- 锚点约束
我们认为,添加锚点约束有利于注意力区域分散到各个语义标签上,避免了只重复提取最显著区域的问题。以图片中心为圆心,1/√2(根号2分之一)为半径画圆,锚点均匀分布,个数由产生的前K-1个注意力区域决定。
锚点约束公式如下:
其中(ckx , cky)是第k个锚点的位置
关于这个约束条件的解释:
所有锚点会平均分布在圆上,所以这个约束条件并不是对第K个锚点进行约束,而是通过第K个锚点的位置使得平移参数(tx,ty)必须改变,从而避免了模型总是选择图片中最显著区域的情况。 -
缩放约束
动机是不希望注意力区域太大。
- 正值约束
此部分也是关于缩放参数的约束,也就是sx、sy:
第2和第3部分讲的是一个约束条件:
则关于定位误差,有:
其中γ=0.1
5. 实验
5.1 设置
------------------------------------------实现细节------------------------------------------------------
- 采用Caffe框架,在ImageNet上预训练深度神经网络
- 新加入的层采用Xavier初始化
- 训练两个模型,所有图片resize到N×N大小,N分别取512,640
- batch_size=16,momentum=0.9、0.999,
- 初始学习速率为1e-5,每训练30个epoch就除于10
- 每过45个epoch,进行test数据集的测试
- 每张resize过后的图片,分别在四个角、中心提取5个(N-64)×(N-64)区域块(patch)来增大数据集。但不应该在原图上直接提取,这样重叠区域会出现计算开销的浪费,技巧是在最后一层卷积响应图上提取对应区域。
- 对每个区域块采用max-pooling作为该区域块的特征,将5个区域块以ave-pooling的方式可以作为原图的特征表达
讨论--来自灵魂的拷问
- 解决了什么问题?
多标签识别问题 - 提出了怎样的方法?
从全局视角提取注意力区域,再对注意力区域进行类别打分 - 为什么会提出这个方法?
现有的多标签识别算法,都需要额外的区域提取层:要么“自底向上”,从图片底层特征出发,提取一堆可能的区域;要么训练一个额外的检测器去检测是否有目标。这样的处理方法低效、计算开销浪费 - 设计了怎样的模型?
CNN+ST+LSTM - 建立在什么样的假设上?
LSTM编码记录了所有有用的历史信息 - 这篇文章的关键点是什么?
ST+LSTM:ST提取区域,LSTM对区域打分并更新ST的参数
LSTM所编码记录的信息需要支撑ST层提取正确的注意力区域 - 贡献是什么?
开启了新的多标签识别思路,采用“自顶而下”的策略,从全局角度提取注意力区域。(不需要总是训练额外的检测器去提取区域) - 如何通过这个模型验证了作者所提出的观点?
我们认为,LSTM记忆单元能使模型从全局视角作出判断(参数更新和区域打分) - 这个模型为什么能work?
所有模块采用标准的反向传播算法就能够进行参数更新