雷锋网按:本文作者邓启力,哈尔滨工业大学深圳研究生院计算机系硕士研究生二年级,导师为“鹏城学者”徐勇教授。研究兴趣为深度学习与计算机视觉。曾获2015年首届阿里巴巴大规模图像搜索大赛二等奖,总排名第三名。
摘要
近些年,深度学习在各种计算机视觉任务上都取得了重大的突破,其中一个重要因素就是其强大的非线性表示能力,能够理解图像更深层次的信息。本文对基于深度学习的视觉实例搜索方法做了简单的总结和概括,希望能给读者们带来启发。
前言
给定一张包含某个物体的查询图片,视觉实例搜索的任务就是从候选的图片库中找到那些与查询图片包含相同物体的图片。与一般的图像搜索相比,实例搜索的搜索条件更为苛刻——是否包含相同的物体,如同一款衣服,同一辆车等等。该问题具有非常广泛的应用前景,如商品搜索,车辆搜索和基于图像的地理位置识别等。举个例子,移动商品图像搜索就是通过分析利用手机相机拍摄的商品照片,从商品库中找到相同或相似的商品。
然而在实际场景中,由于姿态,光照和背景等干扰因素,所以两张包含相同物体的图像往往在外观上差异很大。从这个角度来看,视觉实例搜索的本质问题就是应该学习什么样的图像特征从而使得包含相同物体的图像在特征空间上是相似的。
近些年,深度学习在各种计算机视觉任务上都取得了重大的突破,其中就包括视觉实例搜索任务。本文主要对基于深度学习的实例搜索算法(下面简称为“深度实例搜索算法”)进行剖析和总结,文章分为四个部分:第一部分总结了经典视觉实例搜索算法的一般流程;第二部分和第三部分分别从两个方面去介绍近些年主要的深度实例搜索算法;端到端的特征学习方法和基于CNN特征的特征编码方法;第四部分将通过总结在2015年首届阿里巴巴大规模图像大赛(Alibaba Large-scale Image Search Challenge, ALISC)中出现的相关方法,介绍一些实践中可以提高实例搜索性能的技巧和方法。
经典视觉实例搜索算法的一般流程
在深度学习流行之前,典型的实例搜索算法一般分为三个阶段:首先在给定的图像密集地提取局部不变特征,然后将这些局部不变特征进一步地编码为一个紧凑的图像表示,最后将查询图像与候选图像库中的图像进行相似度计算(基于第二步得到的图像表示),找到那些属于同一实例的图片。
1.局部不变特征。局部不变特征的特点就是提取图像局部区域的细节信息,不关心全局信息,并对该局部区域内的光线变化、几何变换具有一定的不变性。这对实例搜索非常有意义,因为目标物体可以伴随着几何变换出现图像中的任何区域。在早期的工作中,很多实例搜索方法采用的是SIFT特征。
2. 特征编码。对局部特征进一步地编码有两方面的意义:挖掘这些局部特征之间的相关信息,增强可判别能力;单一紧凑的特征向量更易于实现索引,提高搜索速度。目前常见的方法有VLAD(vector of locally aggregated descriptors),Fisher Vectors,triangular embedding等。在这里,本文简单地介绍下VLAD方法(在本文后面多次出现):a)VLAD方法首先利用k-means得到包含k个中心的码本,然后每个局部特征被指派给离它最近的中心点(我们将这一步称为hard-assignment,之后会相关文章对此进行改进),最后将这些局部特征与其指派的中心点之间的残差累和作为最终的图像表示。从上面可以看出,VLAD方法有无序的特性——不关心局部特征的空间位置,因此可以进一步解耦全局空间信息,对几何变换具有很好的鲁棒性。
3. 相似度计算。一种直接的做法是根据距离函数计算特征之间的距离,例如欧式距离,余弦距离等。另一种是学习相应的距离函数,例如LMNN、ITML等度量学习方法。
总结:经典视觉实例搜索算法的性能往往受限于hand-crafted特征的表示能力。当深度学习应用在实例搜索任务时,主要就是从特征表示入手,即如何提取更加具有判别性的图像特征
端到端的特征学习方法
NetVLAD: CNN architecture for weakly supervised place recognition (CVPR 2016)
这篇文章是来自于INRIA 的Relja Arandjelović等人的工作。该文章关注实例搜索的一个具体应用——位置识别。在位置识别问题中,给定一张查询图片,通过查询一个大规模的位置标记数据集,然后使用那些相似的图片的位置去估计查询图片的位置。作者首先使用Google Street View Time Machine建立了大规模的位置标记数据集,随后提出了一种卷积神经网络架构,NetVLAD——将VLAD方法嵌入到CNN网络中,并实现“end-to-end”的学习。该方法如下图所示:
原始的VLAD方法中的hard-assignment操作是不可微的(将每个局部特征指派给离它最近的中心点),因此不可以直接嵌入到CNN网络里,并参与误差反向传播。这篇文章的解决方法就是使用softmax函数将此hard-assignment操作转化为soft-assignment操作——使用1x1卷积和softmax函数得到该局部特征属于每个中心点的概率/权重,然后将其指派给具有最大的概率/权重的中心点。因此NetVLAD包含了三个可以被学习参数,,其中是上面1x1卷积的参数,用于预测soft-assignment,表示为每个簇的中心点。并在上图的VLAD core层中完成相应的累积残差操作。作者通过下图给我们说明NetVLAD相比于原始的VLAD的优势:(更大的灵活性——学习更好的簇中心点)
这篇文章的另一个改进工作就是Weakly supervised triplet ranking loss。该方法为了解决训练数据可能包含噪声的问题,将triplet ranking loss中正负样本分别替换为潜在的正样本集(至少包含一张正样本,但不确定哪张)和明确的负样本集。并且在训练时,约束查询图片和正样本集中最可能是正样本的图片之间的特征距离比查询图片与所有负样本集内的图片之间的特征距离要小。
Deep Relative Distance Learning: Tell the Difference Between Similar Vehicles (CVPR 2016)
接下来的这篇文章关注的是车辆识别/搜索问题,来自于北京大学Hongye Liu等人的工作。如下图所示,这个问题同样可以被看成实例搜索任务。
和很多有监督的深度实例搜索方法一样,这篇文章旨在将原始的图片映射到一个欧式特征空间中,并使得在该空间里,相同车辆的图片更加聚集,而非同类的车辆图片则更加远离。为了实现该效果,常用的方法是通过优化triplet ranking loss,去训练CNN网络。但是,作者发现原始的triplet ranking loss存在一些问题,如下图所示:
对于同样的样本,左边的三元组会被损失函数调整,而右边的三元组则会被忽视。两者之间的区别在于anchor的选择不一样,这导致了训练时的不稳定。为了克服该问题,作者用coupled clusters loss(CCL)去替代triplet ranking loss。该损失函数的特点就是将三元组变成了一个正样本集和一个负样本集,并使得正样本内的样本相互聚集,而负样本集内的样本与那些正样本更加疏远,从而避免了随机选择anchor样本所带来的负面影响。该损失函数的具体效果如下图所示:
最后这篇文章针对车辆问题的特殊性,并结合上面所设计的coupled clusters loss,设计了一种混合的网络架构,并构建了相关的车辆数据库去提供所需的训练样本。
DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations (CVPR 2016)
最后的这篇文章同样是发表在CVPR 2016上,介绍了衣服识别和搜索,同样是与实例搜索相关的任务,来自于香港中文大学Ziwei Liu等人的工作。首先,本篇文章介绍了一个名为DeepFashion的衣服数据库。该数据库包含超过800K张的衣服图片,50个细粒度类别和1000个属性,并还额外提供衣服的关键点和跨姿态/跨领域的衣服对关系(cross-pose/cross-domain pair correspondences),一些具体例子如下图所示:
然后为了说明该数据库的效果,作者提出了一种新颖的深度学习网络,FashionNet——通过联合预测衣服的关键点和属性,学习得到更具区分性的特征。该网络的总体框架如下所示:
FashionNet的前向计算过程总共分为三个阶段:第一个阶段,将一张衣服图片输入到网络中的蓝色分支,去预测衣服的关键点是否可见和位置。第二个阶段,根据在上一步预测的关键点位置,关键点池化层(landmark pooling layer)得到衣服的局部特征。第三个阶段,将“fc6 global”层的全局特征和“fc6 local”的局部特征拼接在一起组成“fc7_fusion”,作为最终的图像特征。FashionNet引入了四种损失函数,并采用一种迭代训练的方式去优化。这些损失分别为:回归损失对应于关键点定位,softmax损失对应于关键点是否可见和衣服类别,交叉熵损失函数对应属性预测和三元组损失函数对应于衣服之间的相似度学习。作者分别从衣服分类,属性预测和衣服搜索这三个方面,将FashionNet与其他方法相比较,都取得了明显更好的效果。
总结:当有足够多的有标注数据时,深度学习可以同时学习图像特征和度量函数。其背后的思想就是根据给定的度量函数,学习特征使得特征在该度量空间下具有最好的判别性。因此端到端的特征学习方法的主要研究方向就是如何构建更好的特征表示形式和损失函数形式。
基于CNN特征的特征编码方法
本文在上面部分介绍的深度实例搜索算法,主要关注数据驱动的端到端特征学习方法及相对应的图像搜索数据集。接下来,本文关注于另一个问题:当没有这些相关的搜索数据集时,如何提取有效的图像特征。为了克服领域数据的不足,一种可行的策略就是在CNN预训练模型(训练在其他任务数据集上的CNN模型,比如ImageNet图像分类数据集)的基础上,提取其中某一层的特征图谱(feature map),对其进行编码得到适用于实例搜索任务的图像特征。本部分将根据近些年相关的论文,介绍一些主要的方法(特别的,本部分中所有的CNN模型都是基于ImageNet分类数据集的预训练模型)。
Multi-Scale Orderless Pooling of Deep Convolutional Activation Features (ECCV 2014)
这篇文章发表在ECCV 2014上,是来自于北卡罗来纳大学教堂山分校Yunchao *伊利诺伊大学香槟分校Liwei Wang等人的工作。 由于全局的CNN特征缺少几何不变性,限制了对可变场景的分类和匹配。作者将该问题归因于全局的CNN特征包含了太多的空间信息,因此提出了multi-scale orderless pooling (MOP-CNN)——将CNN特征与无序的VLAD编码方法相结合。
MOP-CNN的主要步骤为,首先将CNN网络看作为“局部特征”提取器,然后在多个尺度上提取图像的“局部特征”,并采用VLAD将这些每个尺度的“局部特征”编码为该尺度上的图像特征,最后将所有尺度的图像特征连接在一起构成最终的图像特征。提取特征的框架如下所示:
作者分别在分类和实例搜索两个任务上进行测试,如下图所示,证明了MOP-CNN相比于一般的CNN全局特征有更好的分类和搜索效果。
Exploiting Local Features from Deep Networks for Image Retrieval (CVPR 2015 workshop)
这篇文章发表在CVPR 2015 workshop上,是来自于马里兰大学帕克学院Joe Yue-Hei Ng等人的工作。近期的很多研究工作表明,相比于全相连层的输出,卷积层的特征图谱(feature map)更适用于实例搜索。本篇文章介绍了如何将卷积层的特征图谱转化为“局部特征”,并使用VLAD将其编码为图像特征。另外,作者还进行了一系列的相关试验去观察不同卷积层的特征图谱对实例搜索准确率的影响。
Aggregating Deep Convolutional Features for Image Retrieval(ICCV 2015)
接下来这篇文章发表在ICCV 2015上,是来自于莫斯科物理与技术学院Artem Babenko和斯科尔科沃科技学院Victor Lempitsky的工作。从上面两篇文章可以看出,很多深度实例搜索方法都采用了无序的编码方法。但包括VLAD,Fisher Vector在内的这些编码方法的计算量通常比较大。为了克服该问题,这篇文章设计了一种更加简单,并且更加有效的编码方法——Sum pooing。Sum pooling的具体定义如下所示:
其中就是在卷积层在空间位置上的局部特征(这里提取局部特征的方法,与上篇文章一致)。在使用sum pooling后,对全局特征进一步地执行PCA和L2归一化得到最终的特征。作者分别与Fisher Vector,Triangulation embedding和max pooling这些方法进行比较,论证了sum pooling方法不仅计算简单,并且效果更好。
Where to Focus: Query Adaptive Matching for Instance Retrieval Using Convolutional Feature Maps (arXiv 1606.6811)
最后这篇文章目前发在arXiv上,是来自于澳大利亚昆士兰大学Jiewei Cao等人的工作。正如本文在开头部分所提到的,杂乱的背景对实例搜索影响非常大。为了克服该问题,这篇文章在上篇文章所提出的sum-pooling方法的基础上,提出了一种被称为query adaptive matching (QAM)的方法去计算图像之间的相似度。该方法的核心在于对图像的多个区域执行池化操作,并创建多份特征去表达图像。然后在匹配时,查询图像将分别与这些区域的特征比较,并将最佳匹配分数作为两张图像之间相似度。那么接下的问题是如何去构建这些区域。
作者首先提出了两种方法——Feature Map Pooling和Overlapped Spatial Pyramid Pooling (OSPP),去得到图像的base region。然后通过对这些base region不断地合并,以找到最好的相似度评分为目标,构建出目标区域。其中最吸引人的地方在于,作者将整个合并的过程,转化为了对一个优化问题的求解。下图显示了QAM方法的部分结果及对应图像的特征映射。
总结:在某些实例搜索任务中,由于缺少足够的训练样本,所以不能直接 “端到端”的去学习图像特征。这时候,如何将现成的CNN特征编码为适合实例搜索的图像表示就成为该领域的一个热门研究方向。
2015年首届阿里巴巴大规模图像搜索大赛总结
在介绍完近些年一些主要的深度实例搜索方法后,在接下来的部分,本文将通过总结在阿里巴巴大规模图像搜索大赛中出现的相关方法,来介绍一些实践中可以提高视觉实例搜索性能的技巧和方法。
阿里巴巴大规模图像搜索大赛由阿里的图像搜索组所主办,要求参赛队伍从海量的图片库中找出那些与查询图片包含相同物体的图片。这次比赛提供了以下两类数据用于训练:约200W张图片的训练集(类别级标签及相对应的属性),1417张验证查询图片及相对应的搜索结果(总共约10W张)。在测试时,给定3567张查询图片,参赛队伍需从约300W张图片的评测集中(无标签),搜索出那些符合要求的图片,评价指标为基于top 20的mAP ( mean Average Precision)。
首先简单介绍我们的方法——Multi-level Image Representation for Instance Retrieval,该方法取得了这次比赛的第三名。很多方法都是用最后一个卷积层或全连接层的特征进行检索,而由于高层的特征已经损失了很多细节信息(对于更深的网络,损失更严重),所以实例搜索时不是很精准,如下图所示,即整体轮廓相似,但细节则差距很大。
为了克服该问题,我们将CNN网络中不同层的特征图谱(feature map)进行融合,这不仅利用了高层特征的语义信息,还考虑了低层特征的细节纹理信息,使得实例搜索更精准。如下图所示,我们的实验主要基于GoogLeNet-22网络,对于最后的8层特征图(从Inception 3b到Inception 5b),首先使用最大池化对这些不同尺度的特征图分别进行子采样(转换为相同尺寸的特征图),并使用的卷积对这些采样结果进一步地处理。然后对这些特征图做线性加权(由的卷积完成),最后在此基础上,使用sum pooling得到最终的图像特征。在训练时,我们根据所提供的训练数据,通过优化基于余弦距离的triplet ranking loss来端到端学习这些特征。因此在测试时,可以直接使用特征之间的余弦距离来衡量图像的相似度。
另外,借鉴于训练SVM分类器时使用了难分样本挖掘的思想,我们的方法首先在前向计算时,计算当前训练批次中所有潜在三元组的损失(从当前训练批次中选取两张相同类别的图片和一张不同类别的图片构成潜在三元组),然后找到那些“困难”的三元组(更大的损失),最后在反向计算时,使用这些“困难”的三元组进行误差传播,从而取得更好的训练效果。
接下来简单总结其他队伍的相关方法。在端到端的特征学习方法中,除了triplet ranking loss,contrastive loss(对应于Siamese network)也是常见的损失函数。除此之外,还有一些方法值得我们关注,可以显著地提高搜索性能:
(一) 同款图挖掘
在有监督的机器学习方法中,更多的数据可能就意味着更高的准确率。因此来自于中科院计算所的团队提出,先根据ImageNet预训练模型的特征,在类别级训练集上聚类,然后通过阀值,挖掘出更多地同款图,最后用这些同款图去训练CNN网络,学习图像特征。该方法实现简单,并且可以显著地提高搜索的性能。
(二) 目标检测
在实例检索中,复杂的背景噪声直接影响了最终的搜索性能。因此很多队伍首先尝试使用目标检测(比如faster-rcnn)定位感兴趣的区域,然后在进一步地学习特征,比较相似度。另外,当没有bounding box训练数据时,弱监督的目标定位也是一种有效的方法。
(三) 一阶池化特征和二阶池化特征融合
二阶池化方法通过捕捉图像二阶统计变量,如协方差等,往往可以取得更好的搜索准确率。来自大连理工的李培华教授所带领的团队在CNN网络的基础上,将一阶池化特征和二阶池化特征融合,取得非常出色的成绩。
(四) 联合特征学习和属性预测
该方法和本文在第三部分所提到的DeepFashion类似,同时学习特征和预测图片的属性(多任务训练),从而得到更具区分性的特征。
本文作者:深度学习大讲堂
本文转自雷锋网禁止二次转载,原文链接