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

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

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

模型结构

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

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

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

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

尽管这两张猫的图片在颜色上有所不同,但如果它们在结构和内容上相似,那么经过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}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据安全治理实践路线(上)

基于以上数据安全治理实践理念,可以按照自顶向下和自底向上相结合的思路推进实践过程。一方面,组织自顶向下,以数据安全战略规划为指导,以规划、建设、运营、优化为主线,围绕构建数据安全治理体系这一核心,从组织架构、制度流程、…

React setState同步还是异步

React18 setState是同步还是异步?_react18 同步-CSDN博客 React18之前或者React18使用了ReactDOM.render,setState在React调度流程中是异步更新,在原生事件和setTimeout中是同步更新。React18使用ReactDOM.createRoot,那么默认都是…

“从根到叶:深入理解排序数据结构“

一.排序的概念及引用 1.1排序的概念 排序是指将一组数据按照一定的规则重新排列的过程。排序的目的是为了使数据具有有序性,便于查找、插入、删除等操作,提高数据的组织和管理效率。 稳定性是指如果序列中存在相等元素,在排序完成后&#…

LINUX中用C获得当前执行应用的全路径

之前有博文: LINUX中用C获得当前执行应用的所在路径_linux c语言 直接使用.\获取的路径是程序所在路径 还是命令执行路径-CSDN博客 这个代码也没问题。现实中有时取的路径并不对。比如说,我是../work/test,这个路径就不对了。简单的说&#…

nginx中的location

在 nginx 中,location 是用来匹配请求 URI 的指令,它告诉 NGINX 如何处理特定的请求。location 指令通常用于配置不同 URI 的访问规则,例如重定向、反向代理、设置缓存等。 以下是 location 指令的一般格式: location [ | ~ | …

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN(Local Area Network) 广域网WAN(Wide Area Network) 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

Dart:谷歌的现代化编程语言之旅

内容概览 引言:一、Dart语言简介二、Dart的特点三、Dart在Flutter中的应用四、Dart的未来展望五 与JavaScript代码对比结语: 引言: 在Web和移动应用开发领域,JavaScript一直是最流行的编程语言之一。然而,随着技术的不…

2024年开发者的最好选择!!没有之一

中国银河证券1月23日明确指出:鸿蒙应用将在2024年迎来爆发。 2024年Q2推出开发者Beta版,2024年Q4推出商用版。今年年终将有 5000 款应用完成原生鸿蒙开发,未来支持 50 万款应用。覆盖便捷生活、出行文旅、金融便利、社交资讯、生产力工具、影…

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024)

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024) 会议简介 能源动力、机械自动化和航空航天技术国际学术会议(ICEPMAT2024)将于2024年在北京举行。会议将探讨能源动力、机械自动化、航空航天技术领域的新研究热点、核心技术和发展趋…

【Git】:远程仓库操作

远程仓库操作 一.理解版本控制系统二.远程仓库1.克隆2.Push操作3.fetch操作4. .gitnore文件 一.理解版本控制系统 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计…

Camtasia Studio2024破解版屏幕录像和视频编辑软件

Camtasia Studio是一款专业的屏幕录像和视频编辑软件,它可以用来进行多种工作: 屏幕录制:Camtasia Studio可以录制电脑屏幕上的任何活动,如软件操作、演示、游戏过程等,非常适合制作教学视频、软件教程、游戏解说等。…

京东前端笔试(附答案解答)

引言 我目前本科大四,正在春招找前端,有大厂内推的友友可以聊一聊,球球给孩子的机会吧。 我整理了一份10w字的前端技术文档:https://qx8wba2yxsl.feishu.cn/docx/Vb5Zdq7CGoPAsZxMLztc53E1n0k?fromfrom_copylink ,对…

什么是汽车抛负载Load dump

1.什么是抛负载 抛负载,英文为Load dump,是指断开电源与负载的瞬间,由于负载突变而引起电源电压急剧变化。在汽车电子领域,抛负载是指在蓄电池充电时,断开发电机与蓄电池的连接而引起发电机输出大电压尖峰&#xff0c…

用户请求到响应可能存在的五级缓存

用户请求到响应可能存在的五级缓存 当用户在浏览器中输入URL进行访问时,请求并不是直接达到服务器,而是会经历多级缓存,以提高网络效率。本文将详细介绍用户请求到响应可能会经历的五个缓存级别:浏览器缓存,代理缓存&…

【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Java…

EventStream获得数据流,前端配置获得推送的流

如上图所示,请求一个接口,接口以数据流的方式向客户端推送数据,默认需要消息收集一条,在原来的基础上追加,在create-react-app生成的工程中,如果代理使用了中间件http-proxy-middleware,同时dev…

数据库面试题汇总,助你轻松应对面试!

考虑到最近有些小伙伴准备跳槽,所以更新一些数据库相关的面试题,希望能帮到大家! 一 请写出创建表的基本语法结构? 创建表的基本语法结构如下: CREATE TABLE IF NOT EXISTS 表名(字段名1 字段类型,字段名2 字段类型 …

在springboot中调用openai Api并实现流式响应

之前在《在springboot项目中调用openai API及我遇到的问题》这篇博客中,我实现了在springboot中调用openai接口,但是在这里的返回的信息是一次性全部返回的,如果返回的文字比较多,我们可能需要等很久。 所以需要考虑将请求接口响应…

QT_day4

1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…

nginx 配置文件详细介绍

一, nginx 配置文件架构 上一篇 已对 main 全局配置做了详细介绍 本章对剩下的配置文件部分做介绍 二,event 设置 (一)event 相关的配置文件为 配置工作模式以及连接数 (二)具体表现 1&#xff…