图像检索系统《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

### 深度学习教程与框架 #### TensorFlow TensorFlow 是由 Google 开发的一个开源机器学习库,支持多种编程语言,包括 Python 和 C++。该平台提供了灵活的架构,可以在各种设备上运行,从小型嵌入式计算到大型分布式系统的服务器集群[^1]。 ```python import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10) ]) predictions = model(x_train[:1]).numpy() loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) ``` #### PyTorch PyTorch 提供了强大的 GPU 加速功能以及动态神经网络构建能力,在研究社区中非常受欢迎。它允许开发者通过定义计算图来创建复杂的模型结构,并且可以轻松实现自动微分机制[^2]。 ```python import torch from torchvision import datasets, transforms transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))]) dataset1 = datasets.MNIST('../data', train=True, download=True, transform=transform) train_kwargs = {'batch_size': 64} train_loader = torch.utils.data.DataLoader(dataset1,**train_kwargs) ``` #### Keras Keras 是一个高级 API 接口,能够快速搭建实验性的深度学习模型。其设计目标是让用户更方便地试验新的想法而不必担心底层细节处理问题。Keras 可以作为独立工具使用也可以与其他主流框架集成在一起工作,比如 TensorFlow 或者 Theano。 ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` #### DeepLearning4j DeepLearning4j 是一款基于 JVM 的商业级解决方案,专为企业环境打造。除了提供常见的前馈神经网路外还实现了卷积神经网络(CNNs),循环神经网络(RNNs)等功能模块;同时具备良好的可扩展性和性能表现,适用于大规模数据集训练场景下的高效运算需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值