图像相似度
正如你可能知道的,反向图像搜索的问题是寻找相似的图像。
但是如何定义图像相似性呢?给出两个样本图像,从视觉上我们可以很容易地确定它们是否相似。我们如何通过编程来做到这一点?
一种非常简单的方法将基于与图像关联的元数据。换句话说,我们可以将图像大小、RGB值、类别标签等元数据信息与每张图像关联起来。
许多web应用程序仍然利用这种方法进行反向图像搜索。此类应用程序通常将此类元数据存储在ElasticSearch¹或Solr²等优化文本搜索平台中。这种方法很简单,但存在许多缺陷。最明显的一个是需要大量的手工工作来标记每个图像。
一种更复杂的、基于计算机视觉的技术是从图像本身提取不同的特征。传统的计算机视觉算法,如SIFT和SURF,在提取特征时具有很强的鲁棒性,可以通过比较特征来识别相似的图像。
SIFT、SURF和其他一些传统方法都擅长从输入图像中提取关键特征。图1描述了如何利用基于SIFT的特征来查找类似的图像。
图1:基于SIFT特征的图像相似性。它非常适用于坚硬或不变的物体。这个例子展示了两张从不同角度拍摄的自由女神像的照片。使用彩色线条显示了两个图像之间的前50个匹配特征。
这个是一个快速和强大的方法,在我们有坚硬对象的场景中非常有用。
例如,用矩形盒子如包装盒或圆形圆盘如表盘等识别图像,用这种方法是非常有效的。另一方面,不那么坚硬的物体很难匹配。例如,两个不同的人体模型以不同的姿势展示同一件衬衫/裙子,这可能会让传统技术难以处理。
你可能知道,可以尝试使用基于元数据的方法或甚至使用传统的基于计算机视觉的技术来识别类似的图像。两者都有各自的优点和缺点。现在让我们从深度学习的角度来探索图像的相似性。
图像特征与迁移学习
迁移学习可以用于特征提取、微调和预训练设置。
回顾cnn的特征提取,我们知道预训练的模型中的初始层可以理解图像。
在迁移学习的帮助下,我们可以训练由预训练好的网络作为特征提取器,然后再训练几个浅层。
反向图像搜索用例巧妙地利用了预训练模型的特征提取特征(迁移学习)。
让我们利用预训练好的ResNet-50将图像转化为特征。这些特征通常是密集的一维向量。将输入转换为向量的过程也称为向量化。
我们首先需要准备一个预训练ResNet-50模型的实例。接下来,我们需要一个实用函数来预处理输入图像并得到向量输出。代码清单1给出了实现。
代码清单1:使用预训练的ResNet-50将图像转换为特征向量
# 获取预训练模型的工具函数
def get_pretrained_model(name):
if (name == 'resnet'):
# keras API轻松使用预训练模型
model = ResNet50(weights='imagenet',
include_top=False,
input_shape=(224, 224, 3),
pooling='max')
else:
print("Specified model not availab