本文源码可在微信后台回复“图片搜索”公众号“01二进制”获取。前言在上篇文章《图像检索系列——利用 Python 检测图像相似度》中,我们介绍了图像检索领域中非常常用的一种算法——感知哈希算法。这是一个非常简单和快速的算法。它的原理是为每张图片生成一个特定的“指纹”,然后通过相似性度量得到两张图片的相似度。然而,随着深度学习的兴起,极大地促进了图像领域的发展。在特征提取方面,神经网络目前具有不可替代的优势。在上一篇文章中我们也介绍过,图片检索往往是基于图片的特征比较,看特征匹配的好坏,从而检索出相似度高的图片。对于检测图像特征,VGG16具有独特的优势。接下来本文将通过一个简单的案例实现一个基于深度学习的图片检索小工具。准备工作是一样的,首先准备好我们这次需要用到的工具:IDE:PycharmPython:3.7Packages:Keras+TensorFlow+Pillow+NumpykerasKeras是一个高级神经网络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提取特征的demofromkeras.applications.vgg16importVGG16fromkeras.preprocessingimportimagefromkeras.applications.vgg16importpreprocess_inputimportnumpyasnpmodel=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文件是层次数据格式(HierarchicalDataFormat,HDF5)的第五代版本,用于存储和组织大规模数据。H5将文件结构简化为两种主要的对象类型:数据集,即同一类型数据的多维数组组组,是一种容器结构,可以包含数据集和其他组。如果在一个文件中存放不同类型的数据数据集,这些数据集的管理使用分组的直观理解,可以参考我们的文件系统,不同的文件存放在不同的目录中:目录就是目录中的分组hdf5文件,描述了数据集DataSet的分类信息,通过分组对各种数据集进行有效的管理和划分。该文件是hdf5文件中的dataset,表示具体的数据。下图是dataset和group的关系:在Python中,我们通常使用h5py库来对.h5文件进行操作。提取数据集中的图像特征,保存在h5文件中。我们在项目根目录下命名一个数据库文件夹作为数据集,然后写一个获取文件夹中图片的方法:defget_imlist(path):return[os.path.join(path,f)forfinos.listdir(path)iff.endswith('.jpg')]那么我们就可以一个一个的读取数据,一个一个的提取特征保存在文件中。如下图所示:至此,我们完成了模型的训练。选择一张测试图片测试检索效果经过以上操作,我们已经将数据集中所有图片的特征保存到模型中,剩下的就是提取待测图片的特征,然后对比向量与特征集中的特征一一对应。相似度(余弦相似度),然后按照相似度的高低顺序返回给用户。Tips:各种相似度的Python表示可以参考PythonNumpy计算各种距离,以某包作为测试图片。输出结果如下:在PyCharm中,可以方便的查看matplotlib生成的图片。第一张是测试图片,后三张是检索图片,可以看出效果还是挺不错的。Tips:如果想使用Resnet或者Densenet来提取特征,只需要对上面的代码做相应的修改,去掉注释,修改部分代码即可。有关详细信息,请参阅源代码。最后,我们实现了一个使用深度学习进行图像检索的小工具。如何将它与web/app结合起来超出了本文的范围。感兴趣的可以下载本文源码自行修改,也可以扫描下方二维码关注微信公众号「01二进制」与我取得联系。参考DeepLearningandComputerVision(11)_FastImageRetrievalSystemBasedonDeepLearningVGG-16-basedMassiveImageRetrievalSystem(UpgradeVersionofSearchingImagesbyImage)基于深度学习实现按图检索功能各种相似度计算Python实现Application,使用PythonNumpy计算各种距离。h5文件介绍
