强答一波,接触多标签图像分类研究的时间并不算太久,我主要介绍一下我对于发表在CVPR2019和ICCV2019上的两篇论文的核心思想的见解,以及我个人对于这个领域的理解。这两篇论文涉及到图神经网络家族中图卷积网络和门控图神经网络,以及Attention机制,双线性池化等技术,在本回答中不会涉及到这些技术的细节,仅仅是为了说明最直观的思路,需要了解这两种网络细节的朋友请参考其他文献。
背景1:
经过几年来的发展,多标签图像分类问题研究方向主要集中于:如何利用标签之间的复杂关系来提升分类的准确度。举个栗子说明一下,比如在一张图片中,我们已经正确分类出某些食物对象,由于食物需要容器存放,需要被人食用,那么这张图片中存在盘子,碗筷等餐具对象的可能性应该也很大。这就展现出了利用了标签之间的关系进行分类的过程。
背景2:
得益于图神经网络(GNN)强大的关系建模能力,图神经网络在近两年大火,在很多应用上都取得了SOTA的效果。
标签之间的关系是复杂多样的,比如食物与餐盘,它们之间的关系是食物放在餐盘中,再比如人和背包,它们之间的关系是人背着背包,除此之外,其他的标签之间还存在各种各样的关系,这些关系都可以作为我们的分类依据。然而,对于这些复杂关系,我们应该如何利用起来呢?
这时,图神经网络(GNN)出现了,图神经网络可以依据图中节点(node)本身的特征与图的结构(节点之间的连接关系,也就是边edge),为图中每一个节点生成一个新的嵌入表示(embedding),这个embedding实际上不仅蕴含了node本身的特征,同时也蕴含了node之间的相互依赖关系。
既然图神经网络这么强大,那么,我们是不是可以使用图神经网络来建模标签之间的复杂关系呢?答案当然是可以。首先,我们希望能够提取到标签之间的复杂关系,而图神经网络能够建模node之间的复杂关系,那么,我们直接把标签和图神经网络中的node对应起来,做一个"Label Graph",基于这个“Label Graph”就可以了学习标签之间的关系了。上文提到,GNN提取node的embedding需要两部分信息:1.node本身的特征。2.图的结构。
首先对于第一点,node本身的特征,在不同任务中,node本身特征具有不同的表示,比如,对于我们的Label Graph,node即为标签,我们可以用标签的Word Embedding来作为node本身特征,也可以用其他形式的特征向量作为node本身的特征。这个因任务而异,在下文介绍论文时,我们就可以看到node特征的不同设置。
对于第二点,图的结构,我们就要好好思考一番了。而一般的GNN中,node之间的edge,通常中代表一种或者几种关系,比如社交网络图中,node为用户,而edge代表用户之间的好友关系。而我们的标签关系,是多种多样的。无法用单一的edge来表征多种关系。那怎么办呢?我们退而求其次,对这些复杂的关系做进一步的抽象,将它们都归结为一种关系,这样就可以用GNN对这种关系进行建模。对于多标签图像分类问题,我们可以观察到,对于那些具有复杂依赖关系的标签,标识同一张图片的概率比较大,换句话说,那些具有复杂的依赖关系的标签对象(例如食物和餐具),出现在同一张图片中的概率比较大,而不需要管它们到底具有什么样的关系。所以,我们把标签之间的复杂关系,都抽象为一种关系,就是“共现”(co-occurence)关系,当两个标签对象经常一同出现时,我们认为它们具有复杂的依赖关系。一般我们通过条件概率来度量共现关系,概率P(Label2 | Label1),代表在Label1出现的条件下,Label2出现的概率,当这个概率大于一个特定的阈值时,我们认为Label1和Label2存在共现关系,而P(Label2 | Label1)一般可以通过在数据集上进行统计来做估计。
有了核心思想,剩下的事情,就是把思想落实到具体模型中。
首先,多标签图像分类可以算是传统图像分类问题的一个延伸,那么在这里我们首先来回顾一下传统图像分类模型的一般框架。首先,传统分类模型通常由两部分组成,分别为卷积神经网络部分(CNN)和分类器,通常,分类器为一个全联接层。CNN部分用于对图片进行特征提取,获取一个feature map,一般会对这个feature map进行Pooling,将其压缩成一个单独向量,输入给分类器,而分类器,可以看作是由各个标签的特征向量组成的,图像特征向量与每一个标签特征向量做内积,度量相似度,以获取最终的类别。
多标签图像分类模型一般为上述框架的改进或扩展。下面,我们对2019年发表的两篇论文进行分析。
论文名称:Multi-Label Image Recognition with Graph Convolutional Networks
来源:CVPR 2019
可以看到,这篇论文提出的模型本质上与传统多分类模型差异并不大,规规矩矩的对图像使用CNN进行特征提取,获取feature map,然后对这个feature map进行Global Max Pooling,压缩为一个单独的向量D,但是接下来的一步,就与传统多分类模型有区别了。
传统的多分类模型中,分类器是参数就是一个矩阵W,维度为C * d,C是类别数量,d是特征向量维数,这个矩阵中的每一行,都可以看成是某一个类别的特征向量,假设图像特征向量D是维数为d的列向量,那么使用这个列向量与分类器参数矩阵的每一行做内积,就可以得到图像特征向量与每一个类别的特征向量的相似度,进而获取每一个类别的概率。
在这个过程中,我们可以发现,在前向传播中,分类器参数矩阵中的行与行之间,并无任何交互,它们是随机初始化并进行训练的,在前向传播中互不影响,换句话说,我们认为各个标签的特征向量之间相互独立,对彼此没有影响。然而,在多标签图像分类中,由于标签之间本身就有复杂的相互依赖关系,“标签的特征向量相互独立”是不成立的,既然这样,传统的分类器用在这里就不合适啦,所以,这篇论文考虑对分类器做一个改进:我们不再使用互不相关的分类器了,而是使用GNN为我们输出一个蕴含了标签之间复杂依赖关系的分类器!
该论文使用的是GNN家族中的图卷积神经网络(GCN),输出分类器参数。核心思想中曾经介绍过,GNN需要两部分内容作为输入,一部分是node本身的特征,另一部分是图结构。对于图结构,我们在核心思想中已经介绍过如何构造,这里不再赘述,而对于node本身特征,这里使用的是标签内容的GloVe词向量,词向量本身携带了一些关于标签的信息,相当于引入了先验。在此基础上,基于先验标签信息,使用GCN进行复杂依赖关系建模,输出分类器参数矩阵W。
这篇论文中还使用了一些技巧用来克服GCN容易出现的Over smoothing问题,想了解细节的朋友可以去查阅原文,在此只介绍核心创新点。
论文名称:Learning Semantic-Specifific Graph Representation for Multi-Label Image Recognition
来源:ICCV 2019
分析这篇论文之前,让我们先来思考这样的一个问题。传统的多分类模型中,我们都是通过Pooling操作将一个feature map压缩成一个单独的向量,这个向量表征了图像所属的类别,它将会和分类器中各个类别的特征向量进行计算相似度。但是在多标签图像分类问题中,一个图像中存在多个标签对象,这时候我们仍然使用一个单独的向量表示存在多个标签对象的图像,这合适吗?是不是有更好的方法呢?
我们都知道,CNN具有位置不变性,原始图像中,不同的标签对象分布在不同位置上,那么feature map也会保留这种特性,也就是说,不同标签对象的信息分布在feature map的不同空间位置上,既然这样,我们就可以想办法从图像的feature map中,提取不同标签对象的特征,这样的话,就可以保证在识别不同的标签时,使用的是feature map中与这个标签相关程度最高的那一部分特征,这样就避免了由Pooling操作带来的信息损失。
那么,如何从feature map中提取与标签相关的特征呢?一个很直觉的方法就是Attention,利用Attention机制可以让我们在提取不同标签的特征向量的时候,关注于feature map中的不同空间位置,进而从与这个标签强相关的空间位置中提取特征向量。
通过Attention机制从feature map中提取特征向量之后,对于每一个标签,我们都有一个从feature map抽取出来的特征向量。利用这个特征向量与分类器中的标签特征向量进行相似度度量,看起来就是一个完整的pipeline了,但是我们总感觉缺点什么呀?说好的用GNN对标签之间的复杂依赖关系进行建模的这个环节,并没有出现在这个pipeline中啊。
既然这样,那我们就把这个环节加进去,那怎么加呢?我们知道,利用Attention机制提取的与标签相关的特征向量,是从feature map中抽取出来的,feature map则是由CNN对原始图像进行特征提取得到的,CNN从图像中提取feature map的过程中,并未对不同标签对象之间的复杂依赖关系进行建模,它只是单纯的从原始图像的像素信息中,提取标签对象的特征,换句话说,这个特征主要反映了标签对象在原始图像上的像素信息,却不能反映它们之间的关系。
那我们干脆对这些只能够反映图像像素信息的特征向量再进行一次深度加工,让它蕴含标签对象之间的复杂依赖关系,然后再输入给分类器,不就OK了?这里的深度加工所要达到的目的就是让特征向量蕴含标签对象之间的复杂依赖关系,那么使用GNN不就是正好能够达到这个目的吗?
至此,整个pipeline就完整了。它的过程就是:CNN提取feature map -> 利用Attention机制从feature map中提取与标签相关的特征向量(仅反应像素信息) -> 使用GNN对像素特征向量进行深度加工,使其蕴含标签对象之间的复杂依赖关系 -> 输入分类器进行分类。
那么SSGRL恰好就是遵循这个pipeline设计的,整体架构如下:
可以看到,模型本身仍然是基于传统多分类模型进行改进得到的。从总体上来说,这个模型相当于在传统的多分类模型中的两大部分之间,也就是CNN与分类器之间,增加了Attention计算和门控图神经网络(GGNN)。
首先,CNN从图像中提取feature map,紧接着使用Attention机制获取与标签相关的特征向量,Attention机制使用标签内容的GloVe词向量作为query,一定程度上引入了对于标签对象的先验知识,Attention分数的计算使用的是双线性池化,具体细节请朋友们参考原文。获取标签相关的特征向量后,输入给GGNN进行标签对象复杂依赖关系的建模,最终输出给分类器进行进行预测。
相比于ML-GCN直接对分类器下手,SSGRL通过从图像中对不同标签对象提取不同特征向量,进而带动了分类器特征向量朝着具有区分度的方向学习,有一种殊途同归的感觉。
使用GNN建模标签之间的复杂依赖关系真的合理吗?使用“共现”关系抽象所有复杂依赖关系真的合适吗?使用这种方式究竟能够带来多大的性能提升?我们将在这一部分讨论。
未完待更。