基于deep learning的快速图像检索

引用:Deep Learning of Binary Hash Codes for Fast Image Retrieval

1.引言

本系统是基于CVPR2015的论文《Deep Learning of Binary Hash Codes for Fast Image Retrieval》实现的海量数据下的基于内容图片检索系统,250w图片下,对于给定图片,检索top 1000类似时间约为1s,其基本背景和原理会在下文提到。算法

2.基本问题与技术

你们都知道,基于内容的图像检索系统是根据图像的内容,在已有图像集中找到最『相近』的图片。而这类系统的效果(精准度和速度)和两个东西直接相关:数据库

  • 图片特征的表达能力
  • 近似最近邻的查找

根据咱们这个简单系统里的状况粗浅地谈谈这两个点。网络

首先说图像特征的表达能力,这一直是基于内容的图像检索最核心却又困难的点之一,计算机所『看到』的图片像素层面表达的低层次信息与人所理解的图像多维度高层次信息内容之间有很大的差距,所以咱们须要一个尽量丰富地表达图像层次信息的特征。咱们前面的博客也提到了,deep learning是一个对于图像这种层次信息很是丰富的数据,有更好表达能力的框架,其中每一层的中间数据都能表达图像某些维度的信息,相对于传统的Hist,Sift和Gist,表达的信息可能会丰富一下,所以这里咱们用deep learning产出的特征来替代传统图像特征,但愿能对图像有更精准的描绘程度。架构

再说『近似最近邻』,ANN(Approximate Nearest Neighbor)/近似最近邻一直是一个很热的研究领域。由于在海量样本的状况下,遍历全部样本,计算距离,精确地找出最接近的Top K个样本是一个很是耗时的过程,尤为有时候样本向量的维度也至关高,所以有时候咱们会牺牲掉一小部分精度,来完成在很短的时间内找到近似的top K个最近邻,也就是ANN,最多见的ANN算法包括局部敏感度哈希/locality-sensitive hashing最优节点优先/best bin firstBalanced box-decomposition tree等,咱们系统中将采用LSH/局部敏感度哈希来完成这个过程。有一些很是专业的ANN库,好比FLANN,有兴趣的同窗能够了解一下。框架

3. 本检索系统原理

图像检索系统和关键环节以下图所示: 函数


基于内容的图像检索 

 

图像检索过程简单说来就是对图片数据库的每张图片抽取特征(通常形式为特征向量),存储于数据库中,对于待检索图片,抽取一样的特征向量,而后并对该向量和数据库中向量的距离,找出最接近的一些特征向量,其对应的图片即为检索结果。学习

基于内容的图像检索系统最大的难点在上节已经说过了,其一为大部分神经网络产出的中间层特征维度很是高,好比Krizhevsky等的在2012的ImageNet比赛中用到的AlexNet神经网,第7层的输出包含丰富的图像信息,可是维度高达4096维。4096维的浮点数向量与4096维的浮点数向量之间求类似度,运算量较大,所以Babenko等人在论文Neural codes for image retrieval中提出用PCA对4096维的特征进行PCA降维压缩,而后用于基于内容的图像检索,此场景中效果优于大部分传统图像特征。同时由于高维度的特征之间类似度运算会消耗必定的时间,所以线性地逐个比对数据库中特征向量是显然不可取的。大部分的ANN技术都是将高维特征向量压缩到低维度空间,而且以01二值的方式表达,由于在低维空间中计算两个二值向量的汉明距离速度很是快,所以能够在必定程度上缓解时效问题。ANN的这部分hash映射是在拿到特征以外作的,本系统框架试图让卷积神经网在训练过程当中学习出对应的『二值检索向量』,或者咱们能够理解成对所有图先作了一个分桶操做,每次检索的时候只取本桶和临近桶的图片做比对,而不是在全域作比对,以提升检索速度。spa

论文是这样实现『二值检索向量』的:在Krizhevsky等2012年用于ImageNet中的卷积神经网络结构基础上,在第7层(4096个神经元)和output层之间多加了一个隐层(全链接层)。隐层的神经元激励函数,能够选用sigmoid,这样输出值在0-1之间值,能够设定阈值(好比说0.5)以后,将这一层输出变换为01二值向量做为『二值检索向量』,这样在使用卷积神经网作图像分类训练的过程当中,会『学到』和结果类别最接近的01二值串,也能够理解成,咱们把第7层4096维的输出特征向量,经过神经元关联压缩成一个低维度的01向量,但不一样于其余的降维和二值操做,这是在一个神经网络里完成的,每对图片作一次完整的前向运算拿到类别,就产出了表征图像丰富信息的第7层output(4096维)和表明图片分桶的第8层output(神经元个数本身指定,通常都不会不少,所以维度不会很高)。引用论文中的图例解释就是以下的结构:.net

 


图像检索系统的卷积神经网络架构

 

上方图为ImageNet比赛中使用的卷积神经网络;中间图为调整后,在第7层和output层之间添加隐层(假设为128个神经元)后的卷积神经网络,咱们将复用ImageNet中获得最终模型的前7层权重作fine-tuning,获得第7层、8层和output层之间的权重。下方图为实际检索过程,对于全部的图片作卷积神经网络前向运算获得第7层4096维特征向量和第8层128维输出(设定阈值0.5以后能够转成01二值检索向量),对于待检索的图片,一样获得4096维特征向量和128维01二值检索向量,在数据库中查找二值检索向量对应『桶』内图片,比对4096维特征向量之间距离,作重拍即获得最终结果。图上的检索例子比较直观,对于待检索的”鹰”图像,算得二值检索向量为101010,取出桶内图片(能够看到基本也都为鹰),比对4096维特征向量之间距离,从新排序拿获得最后的检索结果。rest

4. 预训练好的模型

通常说来,在本身的图片训练集上,针对特定的场景进行图像类别训练,获得的神经网络,中间层特征的表达能力会更有针对性一些。具体训练的过程能够第3节中的说明。对于不想本身从新费时训练,或者想快速搭建一个基于内容的图片检索系统的同窗,这里也提供了100w图片上训练获得的卷积神经网络模型供你们使用。

这里提供了2个预先训练好的模型,供你们提取『图像特征』和『二值检索串』用。2个模型训练的数据集一致,卷积神经网络搭建略有不一样。对于几万到十几万级别的小量级图片创建检索系统,请使用模型Image_Retrieval_20_hash_code.caffemodel,对于百万以上的图片创建检索系统,请使用模型Image_Retrieval_128_hash_code.caffemodel。

对于同一张图片,二者产出的特征均为4096维度,但用做分桶的『二值检索向量』长度,前者为20,后者为128。

引用:http://blog.csdn.net/han_xiaoyang/article/details/50856583 

相关文章
相关标签/搜索