文中源码可在微信公众号「01二进制」后台回复「图像检索」获取。

前言

在上一篇文章《图像检索系列——利用 Python 检测图像相似度》中,我们介绍了一个在图像检索领域非常常用的算法——感知哈希算法。这是一个很简单且快速的算法,其原理在于针对每一张图片都生成一个特定的“指纹”,然后采取一种相似度的度量方式得出两张图片的近似程度。

然而随着深度学习的崛起,极大的推动了图像领域的发展,在提取特征这方面而言,神经网络目前有着不可替代的优势。在上一篇文章中我们也介绍了图像检索往往是基于图像的特征比较,看特征匹配的程度有多少,从而检索出相似度高的图片。而检测图像特征,VGG16具有得天独厚的优势。

接下来本文将会通过一个简单的案例来实现一个基于深度学习的图像检索小工具。

准备工作

老样子,先来准备好我们此次需要使用到的工具:IDE:Pycharm

Python:3.7

Packages:Keras + TensorFlow + Pillow + Numpy

keras

Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。简单来说,keras就是对TF等框架的再一次封装,使得使用起来更加方便。

基于vgg16网络提取图像特征 我们都知道,vgg网络在图像领域有着广泛的应用,后续许多层次更深,网络更宽的模型都是基于此扩展的,vgg网络能很好的提取到图片的有用特征,本次实现是基于Keras实现的,提取的是最后一层卷积特征。

思路

主要思路是基于CVPR2015的论文《Deep Learning of Binary Hash Codes for Fast Image Retrieval》实现的海量数据下的基于内容图片检索系统。简单说来就是对图片数据库的每张图片抽取特征(一般形式为特征向量),存储于数据库中,对于待检索图片,抽取同样的特征向量,然后并对该向量和数据库中向量的距离(相似度计算),找出最接近的一些特征向量,其对应的图片即为检索结果。如下图所示:

用户请求和预处理部分主要是Web服务端应该做的,这里不加以讨论,接下来我们主要进行红线标注部分的实现。

实操

提取图片特征

keras在其中文文档中提供了一个利用VGG16提取特征的demo

from keras.applications.vgg16 import VGG16

from keras.preprocessing import image

from keras.applications.vgg16 import preprocess_input

import numpy as np

model = VGG16(weights='imagenet', include_top=False)

img_path = 'elephant.jpg'

img = image.load_img(img_path, target_size=(224, 224))

x = image.img_to_array(img)

x = np.expand_dims(x, axis=0)

x = preprocess_input(x)

features = model.predict(x)

这里我们需要对其进行简单修改,封装成一个类以便后期调用。如下图所示:

考虑到篇幅,文中代码图片已删除较多注释,如需了解详细注释信息,可在微信公众号「01二进制」后台回复「图像检索」获取源代码。下同

将特征以及对应的文件名保存为h5文件

什么是 h5 文件

h5文件是层次数据格式第5代的版本(Hierarchical Data Format,HDF5),用以存储和组织大规模数据。

H5将文件结构简化成两个主要的对象类型:数据集dataset,就是同一类型数据的多维数组

组group,是一种容器结构,可以包含数据集和其他组,若一个文件中存放了不同种类的数据集,这些数据集的管理就用到了group

直观的理解,可以参考我们的文件系统,不同的文件存放在不同的目录下:

目录就是 hdf5 文件中的 group,描述了数据集 DataSet 的分类信息,通过 group 有效的将多种 dataset 进行管理和划分。文件就是 hdf5 文件中的 dataset,表示具体的数据

下图就是数据集和组的关系:

在 Python 中,我们通常使用 h5py 库对 .h5 文件进行操作,具体的读写方法自行百度,这里不在演示。

抽取数据集中的图像特征保存到 h5 文件中

我们在项目根目录下命名一个database文件夹作为数据集,然后编写一个获取文件夹内图片的方法:

def get_imlist(path):

return [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.jpg')]

随后我们便可以依次读取数据然后,一一提取其特征保存到文件中了。如下图:

至此,我们就已经算是完成了模型的训练了。

选一张测试图片测试检索效果

经过上述操作,我们已经将数据集中的所有图片的特征保存到模型中了,剩下的就是抽取待测图片的特征,然后和特征集中的特征一一比较向量间的相似度(余弦相似度),然后按照相似度排序返回给用户即可。Tips:各种相似度的 Python 表示可以参考Python Numpy计算各类距离

以某一个包包为测试图片,输出结果如下所示:

在PyCharm中可以很方便的查看matplotlib生成的图片,第一张为测试图片,后面三张为检索图片,可以看出效果相当好了。

Tips:如果想用Resnet或者Densenet提取特征,只需针对上述代码做出相应的修改,去掉注释修改部分代码即可。详见源码。

最后

至此我们已经利用深度学习实现了一个图片检索的小工具了,如何将其和web/app结合到一起就不在本文的讨论范围了,有兴趣可以下载本文源码自行更改,也可扫描下方二维码关注微信公众号「01二进制」与我取得联系。

参考

图像检索代码python_图像检索系列——利用深度学习实现以图搜图相关推荐

  1. 读《基于深度学习的以图搜图技术在照片档案管理中的应用研究_赵学敏》

    论文名称:<基于深度学习的以图搜图技术在照片档案管理中的应用研究_赵学敏> 发表时间:2020年4月 发表期刊:档案学研究(北大核心.CSSCI) 发表单位:云南大学档案馆 愚见 是一个叙 ...

  2. 基于深度学习实现以图搜图功能

    前记: 深度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图像检索这一块儿,目前有谷歌的以图搜图,百度的以图搜图,而百度以图搜图的关键技术叫做"感 ...

  3. 「构建企业级推荐系统系列」深度学习在推荐系统中的应用

    点击上方"数据与智能","星标或置顶公众号" 第一时间获取好内容 作者 | gongyouliu 编辑 | auroral-L 2016年DeepMind开发的 ...

  4. 利用深度学习(Keras)进行癫痫分类-Python案例

    目录 癫痫介绍 数据集 Keras深度学习案例 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 QQ交流群:903290195 癫痫介绍 癫痫,即俗称"羊癫风",是由多种 ...

  5. AI安全初探——利用深度学习检测DNS隐蔽通道

    AI安全初探--利用深度学习检测DNS隐蔽通道 目录 AI安全初探--利用深度学习检测DNS隐蔽通道 1.DNS 隐蔽通道简介 2. 算法前的准备工作--数据采集 3. 利用深度学习进行DNS隐蔽通道 ...

  6. 深度学习系列:深度学习在腾讯的平台化和应用实践

    深度学习系列:深度学习在腾讯的平台化和应用实践(一) 莫扎特 2015-01-04 6:05:13 大数据技术 评论(0) 深度学习是近年机器学习领域的重大突破,有着广泛的应用前景.随着Google公 ...

  7. 系列笔记 | 深度学习连载(2):梯度下降

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 我们回忆深度学习"三板斧": 1. 选择神经网络 2. 定义神经网络的好坏 ...

  8. 深度学习数据驱动_利用深度学习实现手绘数据可视化的生成

    前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 Sketchify) 那么问题来了,很多的chart是以Canvas ...

  9. 利用深度学习识别滑动验证码缺口位置

    做爬虫的同学肯定或多或少会为验证码苦恼过,在最初的时候,大部分验证码都是图形验证码.但是前几年「极验」验证码横空出世,行为验证码变得越来越流行,其中之一的形式便是滑块验证码. 滑块验证码是怎样的呢?如 ...

  10. 【自动驾驶】如何利用深度学习搭建一个最简单的无人驾驶系统

                                                 新智驾按:本文为新智驾独家专栏,作者系佐思产研研究总监周彦武,新智驾经授权发布. 国内最牛的无人驾驶厂家的运算 ...

最新文章

  1. 程序员面试系列——大小端
  2. 【网易云信获奖啦】2020 年值得再读一遍的技术干货 | 下篇
  3. 解决IIS SMTP无法发信的故障
  4. PowerDesigner12对SQL2005反向工程问题.
  5. ssh 框架搭建出现错误
  6. Linux内核中增加一个新的驱动模块
  7. DenseNet 浅析
  8. OPPO R9S线刷
  9. 湖北省大数据发展行动计划(2016-2020年)
  10. 豆瓣读书数据分析实战
  11. 三相桥式全控整流电路simulink仿真_变频器为什么要整流然后再逆变?
  12. combin14_使用SwiftUI,Combin和Swift Package Manager(SPM)构建复杂的模块化架构
  13. 急先锋开宝箱问题(Java实现)
  14. matlab 双馈,基于Matlab的双馈调速系统研究
  15. 【Unity3D实战项目:疯狂杀戮】角色模型的行走控制(一)
  16. Linux学习日志-01
  17. smarty模板使用详细教程
  18. 修改淘宝标题是否会重新发布宝贝?2014.8.23
  19. Creator3D:shader7_尽然还有双pass这波操作
  20. 30行Python代码实现自动收发邮件

热门文章

  1. SpringMVC工作原理详细讲解
  2. SpringBoot使用银联支付
  3. WTK6900H语音识别单芯片实现智能语音识别蓝牙耳机方案设计
  4. win10配置JDK环境变量
  5. 2019新版《龙果学院Elasticsearch顶尖高手系列(高手进阶篇教程)》
  6. 用 Python 分析某医院药品销售案例!
  7. python爬取上海链家网二手房数据
  8. 蓝牙技术|伦茨科技带你了解蓝牙音频
  9. 达梦数据库-Dmpython+xlrd实现excel表数据一键入库代码分享
  10. HTML 字体 大小 颜色对照表