[深度学习]图片相似度计算 您所在的位置:网站首页 Ai对比两张图片 [深度学习]图片相似度计算

[深度学习]图片相似度计算

2024-07-01 15:23| 来源: 网络整理| 查看: 265

理论铺垫:VGG16及其在图片对比中的应用

VGG16是一种深度学习模型,它属于卷积神经网络(Convolutional Neural Networks, CNNs)的一种,由牛津大学的视觉几何组(Visual Geometry Group)开发。这个模型在图像识别领域表现出色,尤其是在2014年的ImageNet挑战赛中。

模型结构:

VGG16模型包含了16个隐藏层,其中13个卷积层和3个全连接层。这些卷积层和全连接层之间还穿插着激活函数(ReLU)和池化层(MaxPooling)。VGG16特别之处在于它仅使用了很小的卷积核(3x3),叠加多层卷积层来增加网络的深度,从而捕获更高级的图像特征。

底层逻辑与原理: 特征提取:当我们将一张图片输入VGG16模型时,图片首先会通过一系列卷积层。这些卷积层可以看作是一个复杂的特征提取器,每一层都会从图片中提取不同级别的特征。前面的层可能提取简单的特征,如边缘和颜色;而更深的层则能够捕捉到更复杂的特征,如物体的部分和整体结构。降维表示:随着信息的向前传播,原始图片被转换为越来越抽象的特征表示。最后几个全连接层进一步压缩这些特征,形成了一个高度抽象化的、固定大小的特征向量。这个特征向量可以代表输入图片的“本质”内容。相似度计算:将两张图片通过VGG16模型处理后,可以得到两个特征向量。通过计算这两个特征向量之间的相似度(例如,使用余弦相似度),我们可以衡量原始图片的相似程度。特征向量越相似,意味着原始图片在视觉和内容上也越相似。 例子:

假设我们有两张猫的图片,一张是黑白的,另一张是彩色的。

预处理:首先,对这两张图片进行大小调整(通常是224x224像素),并进行其他必要的预处理操作。特征提取:然后,将它们各自输入到VGG16模型中。在经过一系列的卷积和池化操作后,模型会输出这两张图片对应的特征向量。相似度计算:接着,通过计算这两个特征向量之间的相似度(例如,使用余弦相似度公式),我们得到一个数值,该数值表示两张图片的相似度。

尽管这两张猫的图片在颜色上有所不同,但如果它们在结构和内容上相似,那么经过VGG16模型提取的特征向量也将会是相似的,因此我们可以判断这两张图片在视觉上是相似的。

总的来说,利用VGG16等深度学习模型进行图片对比的基础在于模型能够从图像中提取出高层次、抽象的特征,并将这些特征用于计算图片之间的相似度。

实际应用:用VGG16对比两张图片 步骤1:加载预训练的VGG16模型 from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input from tensorflow.keras.preprocessing import image from tensorflow.keras.models import Model import numpy as np # 加载预训练的VGG16模型,不包括最后的全连接层 base_model = VGG16(weights='imagenet', include_top=False) # 定义新的模型,将原VGG16模型的输出直接作为新模型的输出 model = Model(inputs=base_model.input, outputs=base_model.output) 步骤2:定义图像处理和特征提取的函数 def extract_features(img_path, model): """从指定路径的图像中提取特征""" # 加载图像,调整大小为224x224,VGG16模型要求的输入大小 img = image.load_img(img_path, target_size=(224, 224)) # 将PIL图像转换为numpy数组,并添加一个维度表示批大小 img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) # 预处理图像 img_array = preprocess_input(img_array) # 通过模型获取图像的特征 features = model.predict(img_array) # 扁平化特征使其成为一维数组 flatten_features = features.flatten() # 归一化特征向量以比较它们的相似性 normalized_features = flatten_features / np.linalg.norm(flatten_features) return normalized_features 步骤3:计算两张图片的相似度 def calculate_similarity(features1, features2): """计算两组特征之间的相似度""" similarity = np.dot(features1, features2) return similarity 步骤4:例子 - 比较两张图片 # 图片路径 img_path1 = 'C:/Users/Administrator/Desktop/temp/img1.jpg' img_path2 = 'C:/Users/Administrator/Desktop/temp/img2.jpg' # 提取特征 features1 = extract_features(img_path1, model) features2 = extract_features(img_path2, model) # 计算相似度 similarity = calculate_similarity(features1, features2) print(f"Similarity: {similarity}")


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有