图像检索系统《Deep Learning of Binary Hash Codes for Fast Image Retrieval》

引言

总结2015年CVPR论文《Deep Learning of Binary Hash Codes for Fast Image Retrieval》,论文主要内容是利用卷积神经网络(CNN)来构建图像相似度检测的深度学习方法。主要思想是讲卷积神经网络来提取图像特征,并将特征转化为二值量,根据二值向量来计算图像的相似度。

传统方法

图像检索的基础便是提取图像的特征信息,提取的特征信息越丰富,在进行检索时有更多的选择和更好的准确性,相比于传统的特征提取算法,如sift,CNN提取的信息会更丰富,在调整卷积kernel的大小时,得到的特征也会有变化。便有更多选择和变化,且网络一旦训练完成,检索的速度也不会慢。另外近似最近邻(Approximate Nearest Neighbor)算法也用来进行图像检索。如局部敏感度哈希locality-sensitive hashing,最优节点优先best bin first和Balanced box-decomposition tree等。

网络结构

由于CNN提取出的图像特征往往比较多,例如AlexNet提取的维度降达到4096维,如果直接用这4096维特征去做检索,必然会导致效率低下,运算量过高,这正是局部敏感哈希(LSH)所要解决的问题(LSH请参考以前的文章)。自然而然,我们可以讲CNN提取的特征按照LSH算法来进行检索,而进行二值映射的这一步,作者很巧妙的在CNN中完成了。允许我先贴上论文中的一副图

这里写图片描述
Module1 是传统的CNN结构, Module2 是论文所采用的结构, Module3 是整个检索过程的示意图。

Module1 Module2 可以看出,本文提到的图像检索系统相比于传统CNN(这里用的是ImageNet网络结构)多了一个 HiddenLayer (全连接)隐藏单元的数目一般不会很多,整个网络的过程就是在进行网络训练进行图像分类时,会将 F7 得到的特征映射成为01向量,再通过01向量与 F8 全连接进行最后的分类, F7 H 的、H F8 weight 也会将学习到,由于隐射成01的向量,所以可以选用 Sigmoid 作为激活函数,大于0.5的为1,小于0.5的是0,最后的损失函数和ImageNet并无任何区别,这里依然选用的交叉熵作为Loss function。

检索

在检索时,依然要对query image进行二值特征转换,利用转换后的二值向量进行选取相似的图像。再对这些图像进行进一步的相似度判别,获得更高质量的结果。文中提到了两中检索衡量方式:粗检索( CoarselevelSearch )和精细检索( FinelevelSearch )。

粗检索

粗检索的定义方式是计算query image和图的Hamming Distance,当计算结果小于提前设置的阈值时,则将图像作为最后检索的结果集中。不难看出,这种检索方式与设置的阈值有很大关系,当阈值设置过大,会引入一些相差很大的结果,而设置过小,又会忽略一些相差不大的结果。不过优势在于检索速度很快,因为只涉及到求取两个01向量对应位置不相同的值的个数问题,利用位运算即可完成。

精细检索

精细检测则是按照欧氏距离来计算图像之间的相似度的,首先计算出query image和桶内每张候选图像特征向量的欧式距离,然后进行排序,便能挑选出top k 张相似的图片.注意,这里不再是对01向量进行欧式距离的计算,而是用F7计算出的特征向量来进行计算。道理很明显,如果是对01向量求欧式距离,就相当去在求汉明距离的平方根,这就和粗检索没多大区别。自然也就谈不上什么精细了。

最后的总结

论文中的网络结构和ImageNet相差之处是在之前的网络的两个全连接层之间加入了一个隐含全连接层,这一层的作用就是将 F7 提取的特征向量进行到01的转换,然后使用01向量再和 F8 全连接进行最后的分类。Loss Function依然使用交叉熵损失。两个全连接层的初始化是采用随机初始化的。效率很高,据@寒小阳老师说,250w图片下,对于给定图片,检索top 1000相似时间约为1s。

参考文献

[1] http://www.iis.sinica.edu.tw/~kevinlin311.tw/cvprw15.pdf(原论文)
[2] http://blog.csdn.net/han_xiaoyang

"Deep Hashing for Compact Binary Codes Learning" 是一篇关于深度哈希学习的论文。该论文提出了一种用于学习紧凑二进制码的深度哈希算法。以下是该论文中深度哈希算法的公式推导过程: 1. 首先,给定一个训练集 $\{x_i\}_{i=1}^n$ 和它们的标签 $\{y_i\}_{i=1}^n$,其中 $x_i$ 是输入数据,$y_i$ 是输出标签。 2. 然后,利用神经网络学习一个将输入数据映射到二进制码的哈希函数 $h(x_i)$,其中 $h(x_i)$ 是一个 $k$ 位的二进制向量,$k$ 是哈希码的长度。 3. 在深度哈希学习中,我们使用多个哈希函数来生成多个二进制码。因此,我们学习 $m$ 个哈希函数,每个哈希函数对应一个二进制码 $B_j$。 4. 对于每个输入数据 $x_i$,我们得到 $m$ 个哈希码 $B_j^i$,其中 $j=1,2,...,m$。 5. 然后,我们将这些哈希码组合成一个紧凑的二进制码 $b_i$,即 $b_i = [B_1^i, B_2^i, ..., B_m^i]$。 6. 确定损失函数,使得学习到的二进制码可以最大程度地保留数据之间的相似度。 7. 定义损失函数 $L$,其中 $L$ 由两部分组成:量化损失和分类损失。 8. 量化损失用于衡量哈希码的质量,分类损失用于保留数据之间的相似度。 9. 量化损失可以表示为:$L_{quan} = \sum_{i=1}^n\sum_{j=1}^m\frac{1}{2}(B_j^i - h_j(x_i))^2$,其中 $h_j(x_i)$ 是第 $j$ 个哈希函数的输出。 10. 分类损失可以表示为:$L_{cls} = -\sum_{i=1}^n\sum_{j=1}^n w_{ij}y_iy_j\log\sigma(b_i^Tb_j)$,其中 $w_{ij}$ 是样本 $i$ 和 $j$ 之间的相似度权重,$\sigma$ 是 sigmoid 函数。 11. 最终的损失函数可以表示为:$L = \lambda L_{quan} + L_{cls}$,其中 $\lambda$ 是量化损失的权重。 12. 在训练过程中,我们使用反向传播算法来优化损失函数,学习到最优的哈希函数和二进制码。 这就是 "Deep Hashing for Compact Binary Codes Learning" 论文中深度哈希算法的公式推导过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值