Article / 文章中心

利用孪生网络,Keras,Tensorflow比较图片相似度

发布时间:2022-12-08 点击数:2792

作者:Adrian Rosebrock

翻译:张一然

在本文中,您将学习如何使用孪生网络和深度学习库Keras / TensorFlow比较两个图像的相似性(以及它们是否属于相同或不同的类)。

这篇博客文章是我们有关孪生网络基础的三部曲系列的第三部分:

第1部分:使用Python为孪生网络构建图片二元组(两周前的帖子)(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)

第2部分:使用Keras,TensorFlow和深度学习训练孪生网络(上周的教程)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

第3部分:使用孪生网络比较图像(本教程)

上周我们学习了如何训练孪生网络。我们的模型在测试集上表现良好,可以正确地检验两张图像是否属于同一类别。训练完成后,我们将模型序列化到磁盘。

在上周的教程发布后不久,我收到了PyImageSearch读者Scott的电子邮件,他问:

 

“嗨, Adrian -感谢您提供有关孪生网络的指南。我在深度学习领域听说过他们,但老实说,我不知道他们如何起作用或他们能做什么。这个系列确实帮助我消除了疑虑,甚至在我的一个工作项目中帮到了我。

我的问题是:

我们如何利用训练好的孪生网络在训练和测试集以外的图像上进行预测?

那可能吗?”

当然,Scott。这正是我们今天要讨论的内容。

要了解如何使用孪生网络比较图像的相似性,请继续阅读。

利用孪生网络,Keras, Tensorflow比较图片相似度

在本文第一部分,我们将讨论使用训练好的孪生网络去预测两张图片相似度的基本过程,更具体地说,预测两张输入图片是否属于同一类。

然后,您将学习如何使用Keras和TensorFlow为孪生网络配置开发环境。

配置完您的开发环境后,我们将回顾项目目录结构,然后实现一个使用孪生网络比较图像的相似性的Python脚本。

最后,我们将在本教程中总结讨论结果。

孪生网络如何预测两张图片的相似度

图1:使用孪生网络比较两张图像的相似度会得出相似度分数。分数越接近“ 1”,图像越相似(因此更可能属于同一类别)。相反,分数越接近“ 0”,两个图像就越不相似。

在上周的教程中,您学习了如何训练孪生网络以验证两对数字是属于同一类别还是不同类别。并将训练后的孪生模型序列化到磁盘。

然后问题变成:

“我们如何使用我们训练好的孪生网络来预测两个图像之间的相似性?”

答案是我们利用孪生网络中最后一层,即Sigmoid激活函数。

 

Sigmoid激活函数的输出范围为[0,1],这意味着当我们向孪生网络输入图像对时,模型的输出值在0到1之间。

 

值0表示两个图像完全不同,而值1表示两个图像非常相似。

 

这种相似性的一个示例可以在本节前边部分的图1中看到:

  • 将“ 7”与“ 0”进行比较,相似度得分仅为0.02。

  • 但是,将“ 0”与另一个“ 0”进行比较会得出非常高的相似度得分0.93。

  • 通常使用相似性截断值0.5(50%)作为阈值:

  • 如果两个图像的图像相似度小于等于0.5,则它们属于不同的类别。

  • 相反,如果图片二元组的预测相似度大于0.5,则它们属于同一类。

通过这种方式,您可以使用孪生网络来(1)比较图像的相似度,以及(2)确定图像是否属于同一类别。

使用孪生网络的实际用例包括:

  • 人脸识别:给定两张包含人脸的独立图像,确定两张照片中的人是否为同一人。

  • 签名验证:当出现两个签名时,请确定其中一个是否为伪造。

  • 处方药识别:给定两个处方药,确定它们是相同药物还是不同药物。

配置您的开发环境

本系列有关孪生网络的教程利用Keras和TensorFlow。如果打算继续学习本教程或本系列的前两部分,建议您花些时间配置深度学习开发环境。

您可以参考如下任意一种方法在您的系统上安装Tensorflow和Keras

  • 如何在Ubuntu上安装Tensorflow2.0(https://www.pyimagesearch.com/2019/12/09/how-to-install-tensorflow-2-0-on-ubuntu/)

  • 如何在macOS上安装Tensorflow2.0(https://www.pyimagesearch.com/2019/12/09/how-to-install-tensorflow-2-0-on-macos/)

这两篇教程都可以帮助您在便捷的python虚拟环境中为系统配置本篇博客所必须的软件

 

配置开发坏境遇到困难?

图2: 在配置开发环境时遇到问题?想要访问在Google Colab上预配置的Jupyter notebook?请务必加入PyImageSearch Plus,这样的话,您将在几分钟之内启动并运行本教程。

 

  • 如果你时间有限?

  • 在你作为雇员的公司,使用加域的电脑学习?想跳过命令行、包管理器、虚拟环境的麻烦?

  • 准备好当下就在你windows,macos,linux系统上运行代码了吗?

那么,今天就加入PyImageSearch Plus吧!(https://www.pyimagesearch.com/pyimagesearch-plus/)

在您的web浏览器中即可访问本教程的Jupyter Notebook和其他预定义的PyImageSearch指南,这些文件可直接运行在Google Colab的生态系统中!无需安装。

最重要的是,这些Jupyter Notebook将在Windows,macOS和Linux上运行!

项目结构

在深入了解本教程之前,让我们先花点时间检查一下我们的项目目录结构。

 

首先,请确保使用本教程的“下载”部分下载源代码和示例图像。

 

让我们看一下该项目:

在examples目录下我们有许多示例数字

图3:示例数字,我们将使用通过Keras和TensorFlow实现的孪生网络来比较数字的相似性。

我们将采样这些数字对,然后使用我们的孪生网络比较它们的相似性。

ouput输出目录包含训练历史记录图(plot.png)和我们的训练完的/序列化的孪生网络模型(siamese_model /)。这两个文件都是在上周有关训练自定义孪生网络模型的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)中生成的-请确保您在继续之前阅读了该教程,因为它是今天所必需的!

pyimagesearch模块包含三个Python文件:

1. Config.py 配置文件存储重要的变量,例如输出文件路径和训练配置(包括图像输入尺寸,批处理大小,训练次数等)

2. Siamese_network.py:我们对孪生网络架构的实现

3. Utils.py 包含辅助配置函数以生成图像二元组,计算欧几里得距离并绘制训练历史路径

train_siamese_network.py脚本包含:

1. 导入配置, 孪生网络实现和功能函数

2. 从磁盘加载MNIST数据集

3. 生成图片二元组

4. 创建训练/测试数据集

5. 训练孪生网络

6. 把训练好的孪生网络序列化到磁盘

今天,我将不再介绍这四个脚本,因为上周有关如何训练孪生网络的教程已经介绍了这四个脚本。为了完整起见,我已经将这些文件包含在今天教程的项目目录结构中,但是再次重申一下,要想全面回顾这些文件,他们做的什么以及他们如何做,请参考上周的教程。

最后,我们将重点放在今天的教程test_siamese_network.py上。

该脚本将:

1. 从磁盘加载我们训练好的孪生网络模型

2. 在examples目录中获取样本数字图像的路径

3. 从这些样本中随机构造成图像二元组

4. 使用孪生网络比较图像二元组的相似性

开始工作吧!

实现我们的孪生网络图像相似性脚本

现在,我们已经准备好了使用Keras和TensorFlow实现孪生网络来获得图片相似性。

首先,请确保使用本教程的“下载”部分下载源代码,示例图像和预先训练的孪生网络模型。

打开test_siamese_network.py,然后按照以下步骤操作:

我们首先导入所需的Python包(第2-9行)。值得注意的导入包括:

  • config:包含重要的配置,包括位于磁盘上的经过训练/序列化的孪生网络模型的路径

  • utils:包含在孪生网络Lambda层中使用的euclidean_distance函数-我们需要导入此包以禁止有关从磁盘加载Lambda层的任何用户警告

  • load_model:Keras / TensorFlow函数用于从磁盘加载训练好的孪生网络

  • list_images:在examples目录中获取所有图像的路径

让我们继续分析语句的参数:

我们在这里只需要一个参数--input,它是我们要比较相似性的图像目录在磁盘上的地址。运行此脚本时,我们将把 examples目录的路径作为此处的输入。

解析了命令行参数后,我们现在可以在--input目录中获取所有testImagePaths:

第20行获取了我们所有示例图像的路径,这些图像包含要比较相似性的数字。第22行从这些testImagePaths中随机生成总共10对图像。

第26行使用load_model函数从磁盘加载我们的孪生网络。

利用从磁盘加载的孪生网络,我们现在可以比较图像的相似性:

29行循环所有的图片二元组, 对于每一对图片我们

1. 从磁盘加载两张图片载(31,32行)

2. 复制两张图片以便后序画图/可视化(35, 36行)

3. 沿着batch维度添加一个通道的维度(43, 44行)

4. 将像素值由[0, 255]缩放到[0, 1], 就像我们上周训练孪生网络那样(47, 48行)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

一旦imageA和imageB处理完, 我们调用孪生网络模型(52行)的.predict()方法比较他们的相似度, 得到两张图片的概率/相似度分数(53行)

最后一步是在屏幕上展示两张图片以及相应的相似度分数

第56行和第57行为该图像对创建一个matplotlib图形,并以相似性得分作为图形标题。

第60-67行绘制两张图像,而第70行则将输出显示到屏幕上。

恭喜您实现孪生网络用来比较图像和计算相似度!在下一节中,我们将看到我们辛勤工作的结果。

使用Keras和TensorFlow的孪生网络的图像相似性结果

现在,我们准备使用我们的孪生网络比较图像的相似性!

在我们检查结果之前,请确保您:

1. 阅读了我们之前有关训练孪生网络的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/),以便您了解如何训练和生成我们的孪生网络模型

2. 使用本教程的“下载”部分下载源代码,预训练的孪生网络和示例图片

打开终端,然后执行以下命令:

图4:使用孪生网络和Keras / TensorFlow深度学习库比较图像相似性的结果。

注意:是否收到与TypeError相关的错误:('Keyword argument not understood:', 'groups')?如果是这样,请记住,本教程“下载”部分中包含的预训练模型是使用TensorFlow 2.3训练的。因此,在运行test_siamese_network.py时,您应该使用TensorFlow 2.3。如果您更喜欢使用其他版本的TensorFlow,只需运行train_siamese_network.py来训练模型, 生成新的孪生网络模型并序列化到磁盘。然后您将可以运行test_siamese_network.py且不会出现错误。

上面的图4显示了我们的图像相似性结果。

对于第一个图像对,一个包含“ 7”,而另一个包含“ 1”-显然,它们不是同一幅图像,相似度得分很低,只有42%。我们的孪生网络已正确将这些图像标记为属于不同类别。

下一个图像对由两个“ 0”数字组成。我们的孪生网络预测出非常高的相似度,97%,表明这两个图像属于同一类别。

您可以在图4中看到所有其他图像对的相同模式。相似性得分高的图像属于同一类别,而相似性得分低的图像对属于不同的类别。

由于在我们的孪生网络中使用了sigmoid激活层作为最终层(其输出值在[0,1]范围内),所以通常是使用相似性截断值0.5(50%)作为阈值:

  • 如果两个图像对的图像相似度小于等于0.5,则它们属于不同的类别。

  • 相反,如果对的预测相似度小于0.5,则它们属于同一类。

使用孪生网络计算图像相似度时,可以在自己的项目中使用此经验。

下一步

图片5:如果你想成为神经网络的专家,使用特定的数据集构建你的深度学习模型,浏览用python实现计算机视觉的深度学习(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/),并开始行动吧!此资料的学习,你可以得到PyImageSearch团队的支持。

孪生网络是先进的深度学习技术,因此,要真正掌握,您需要深入了解神经网络和深度学习基础知识。

如果此博客文章引起了您的兴趣,并且您想了解更多信息,那么最好是从我的书《 Python的计算机视觉深度学习》(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)开始。

在这本书中,您将深入探讨神经网络和深度学习的基础知识,这些基础知识对于使用孪生网络以及更复杂的模型和体系结构至关重要。

本书将理论与代码实现相结合,因此您将很快掌握:

  • 深度学习基础知识的理论和基础,即使不具备高级数学学位,也能快速理解和实现。我为您提供了基本方程式,并用代码做了实现,以便您可以掌握概念并在自己的工作中使用它们。

  • 实现您自己的自定义神经网络体系结构。您将学习如何实现最新的架构,例如ResNet,SqueezeNet等,以及如何创建自己的自定义CNN。

  • 如何在自己的数据集上训练CNN。与大多数深度学习教程不同,我的课程教您如何使用自己的自定义数据集。在完成本书之前,您将在自己的数据集中训练CNN。

  • 目标检测(Faster R-CNN,SSD 和RetinaNet)和实例分割(MaskR-CNN)。您将学习如何创建自己的自定义目标检测器和分割网络。

  • 您还将找到答案和经过验证的代码配方,以:

  • 创建并准备自己自定义的图像数据集以进行图像分类,目标检测和分割

  • 通过阅读手把手教程(包含大量代码),更好地了解用于计算机视觉的深度学习背后的算法以及如何实现它们

  • 将我的提示,建议和最佳练习付诸实践,以最大程度地提高模型的准确性

使用Python进行计算机视觉的深度学习(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)这本书充满了PyImageSearch惯用的高质量内容和毫无废话的教学风格。

如果您准备开始使用,请在此处获取副本。(https://pyimagesearch.dpdcart.com/cart/add?product_id=144623&method_id=154481&_ga=2.2294384.1585655171.1604272926-1981724077.1597366431)

如果您仍然不确定下一步是否要进行深度学习,请查看这些学生成功案例(https://www.pyimagesearch.com/pyimagesearch-reviews-testimonials/)。就像您一样,读者能够在自己的职业生涯中脱颖而出,进行突破性的研究,并钻研令人难以置信的有益的爱好-您也可以!

 

如果您在尝试之前需要更多信息,我很乐意将完整的目录和示例章节发送给您-只需单击此处(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)。

您还可以浏览我的其他书籍和课程产品库(https://www.pyimagesearch.com/books-and-courses/)

总结

在本教程中,您学习了如何比较两个图像的相似性,更具体地说,是比较两个图像属于相同类别还是不同类别。我们使用孪生网络以及Keras和TensorFlow深度学习库来完成此任务。

这篇文章是我们介绍孪生网络的三部分系列的最后一部分。为了便于参考,以下是该系列中每个指南的链接:

第1部分:使用Python为孪生网络构建图片二元组(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)

第2部分:使用Keras,TensorFlow和深度学习训练孪生网络

(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

第3部分:使用孪生网络,Keras和TensorFlow比较图像的相似性(本教程)

在不久的将来,我将介绍有关孪生网络的更多高级系列,其中包括:

  • 图像三元组

  • 对比损失

  • 三元损失

  • 孪生人脸识别

  • 利用孪生网络的单样本学习

请继续关注这些教程;你一定不想错过他们!

原文链接:

https://www.pyimagesearch.com/2020/12/07/comparing-images-for-similarity-using-siamese-networks-keras-and-tensorflow/

原文标题:

Comparing images for similarity using siamese networks, Keras, and TensorFlow