作者:Adrian Rosebrock
翻译:张一然
校对:wwl
本文约3700字,建议阅读8分钟。
在本文中,您将学习如何使用孪生网络和深度学习库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)比较图像的相似度,以及(