Pytorch基于VGG cosine similarity实现简单的以图搜图(图像检索)

news2024/11/27 8:47:01

代码如下:

from PIL import Image
from torchvision import transforms
import os
import torch
import torchvision
import torch.nn.functional as F

class VGGSim(torch.nn.Module):
    def __init__(self):
        super(VGGSim, self).__init__()
        blocks = []
        blocks.append(torchvision.models.vgg16(pretrained=True).features[:4].eval())
        blocks.append(torchvision.models.vgg16(pretrained=True).features[4:9].eval())
        blocks.append(torchvision.models.vgg16(pretrained=True).features[9:16].eval())
        blocks.append(torchvision.models.vgg16(pretrained=True).features[16:23].eval())
        for bl in blocks:
            for p in bl:
                p.requires_grad = False
        self.blocks = torch.nn.ModuleList(blocks)
        self.transform = torch.nn.functional.interpolate
        self.mean = torch.nn.Parameter(torch.tensor([0.485, 0.456, 0.406]).view(1,3,1,1))
        self.std = torch.nn.Parameter(torch.tensor([0.229, 0.224, 0.225]).view(1,3,1,1))

    def forward(self, input, target):
        if input.shape[1] != 3:
            input = input.repeat(1, 3, 1, 1)
            target = target.repeat(1, 3, 1, 1)
        input = (input-self.mean) / self.std
        target = (target-self.mean) / self.std
        x = input
        y = target

        res = []
        for block in self.blocks:
            x = block(x)
            y = block(y)
            x_flat = torch.flatten(x, start_dim=1)
            y_flat = torch.flatten(y, start_dim=1)
            similarity = torch.nn.functional.cosine_similarity(x_flat, y_flat)
            res.append(similarity.cpu().item())
        # 仅利用VGG最后一层的全局(分类)特征计算余弦相似度
        # return res[-1]
        # 或者,利用VGG各Block的特征计算余弦相似度
        return sum(res)

def load_image(path):
    image = Image.open(path).convert('RGB')
    image = transforms.Resize([224,224])(image)
    image = transforms.ToTensor()(image)
    image = image.unsqueeze(0)
    return image.cuda()

query_image_path = "query.jpeg"  # 想要查找的图像
query_image = load_image(query_image_path) 
target_image_dir = "cat_images/" # 待搜索的相册
target_images = [os.path.join(target_image_dir, name) for name in os.listdir(target_image_dir)]
vgg_sim = VGGSim().cuda()
scores = []
for path in target_images:
    target_image = load_image(path)
    score = vgg_sim(query_image, target_image)
    scores.append([path, score])
scores.sort(key=lambda x: -x[1])
for i in range(5):
    print("Top", (i + 1), "similiar =>", scores[i][0].split("/")[-1])

上述代码的核心思想类似于感知损失(Perceptual Loss),利用VGG提取图像的多级特征,从而比较两张图像之间的相似性。区别在于Perceptual Loss中一般使用MAE,MSE比较特征的距离,而这里的代码使用余弦相似度。

一个例子如下,给定一张狸花的图像(query)如下:
在这里插入图片描述
我们希望找到相册中其他狸花的图像:
在这里插入图片描述
上述数据集中,编号01到10的为奶牛猫,编号11到20的则为狸花猫。运行代码,结果如下:

Top 1 similiar => 04.jpeg
Top 2 similiar => 20.jpeg
Top 3 similiar => 14.jpeg
Top 4 similiar => 12.jpeg
Top 5 similiar => 15.jpeg

可以看到,检索基本是正确的,20,14,12,15均为狸花猫。04得到最高相似度的原因是其与query的姿势十分相似,且环境也差不多(地板),这也是另一种层面上的两图像相似。

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

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

相关文章

怎样做接口测试:从入门到精通的指南

怎样做接口测试:从入门到精通的指南 为什么接口测试如此重要? 接口测试在软件开发过程中扮演着关键的角色。它确保不同系统、组件或服务之间的无缝集成和通信。 接口测试的基本概念 接口测试是一种验证软件系统组件之间相互连接的过程。它主要关注数据…

盘点HTTP爬虫ip使用中的误区

嗨!网络冒险家们,你们是否曾经尝试使用HTTP爬虫ip,并遇到了一些问题?别担心!今天,我将与你们分享使用HTTP爬虫ip过程中的一些常见误区,帮助你们更好地理解和应用爬虫ip。让我们一起来揭开这些误…

正确的 Java 异常处理

我们来谈谈痛点吧。由于我的职责,我必须使用许多不同的服务(进行编辑、进行代码审查......);不同的团队通常会编写所有这些服务,每当涉及到处理错误并从服务转发错误时,有时我的眼睛就会开始流泪。让我尝试…

elasticsearch-head可视化安装

一、前言 elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。 elasticsearch是通过API方式进行管理的,因此也可以使用postman等工具操作elasticsearch。 二、安装 lasticsearch-head插件是使用Jav…

供应链云仓系统的源码解析

1. 什么是供应链云仓系统 供应链云仓系统是一种基于云计算和大数据技术的物流管理系统,旨在提高供应链的效率和运作能力。该系统通过集成各环节的物流信息,实现实时数据共享和流程连接,从而优化物流运营、提升客户满意度。 2. 源码解析&#…

机器学习深度学习——常见循环神经网络结构(RNN、LSTM、GRU)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——RNN的从零开始实现与简洁实现 📚订阅专栏:机器学习&&深度学习 希望文章…

SD-MTSP:杨氏双缝实验优化算法YDSE求解单仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、杨氏双缝实验优化算法YDSE 杨氏双缝实验优化算法(Young’s double-slit experiment optimizer,YDSE)由Mohamed Abdel-Basset等人于2023年提出。 参考文献: [1]Mohamed Abdel-Basset, Doaa El-Shahat, Mohammed Jameel, Moha…

阿里云轻量应用服务器_2核2G3M_108元/年_性能测评

阿里云轻量应用服务器2核2G3M带宽108元一年,系统盘为50GB高效云盘;轻量服务器2核4G4M带宽,60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动,阿里云百科分享阿里云轻量应用服务器入口: 目录 阿…

【Mybatis】调试查看执行的 SQL 语句

1. 问题场景: 记录日常开发过程中 Mybatis 调试 SQL 语句,想要查看Mybatis 中执行的 SQL语句,导致定位问题困难 2. 解决方式 双击shift找到mybatis源码中的 MappedStatement的getBoundSql()方法 public BoundSql getBoundSql(Object para…

贝锐蒲公英:快速搭建连锁门店监控体系,赋能企业高效管理

随着国民生活水平的提高和零售场景的变革,消费者对于餐饮类目的消费支出不断增加,线下社区生鲜商超作为下沉市场最主要的消费场景之一,蕴藏着巨大价值机会。 对于线下连锁生鲜超市而言,连锁门店多、员工多,门店管理时会…

大学生课设实训|基于springboot的在线拍卖系统

目录 项目描述 主要技术栈 功能效果 数据库设计 开发顺序 业务功能 大家好!我是龍弟-idea!需要源码资料信息可私聊我【HWL__666666】! 项目描述 本系统是一个网上商品竞拍系统,为拍卖者和竞买者提供一个在线交流平台。本项…

【一口气 Ping 1000 个 IP 地址,会发生什么事情?】

ping命令是我们检查网络中最常用的命令,作为网络人员,基本上每天都会用到,可以很好地帮助我们分析和判定网络故障,对吧? 一般来说,网工们用 ping查看网络情况,主要是检查两个指标: …

css3 实现文字横幅无缝滚动

css3 实现文字横幅无缝滚动 使用 css3 关键帧 keyframes 和 animation 属性实现文字横幅无缝滚动。 <template><div class"skiHallBanner"><div class"skiHallBanner-text"><span>{{ text }}</span></div></div>…

嵌入式开发:高薪与广阔前景

嵌入式开发是高薪且前景广阔的领域。随着物联网和智能化的快速发展&#xff0c;嵌入式开发人才需求不断增加&#xff0c;市场供应相对不足&#xff0c;导致竞争激烈&#xff0c;推动了薪资水平的提升。 嵌入式开发的复杂性和技术要求使得企业为了吸引优秀人才&#xff0c;普遍…

并发——ThreadPoolExecutor 使用示例

文章目录 1 示例代码:RunnableThreadPoolExecutor2 线程池原理分析3 几个常见的对比3.1 Runnable vs Callable3.2 execute() vs submit()3.3 shutdown()VSshutdownNow()3.2 isTerminated() VS isShutdown() 4 加餐:CallableThreadPoolExecutor示例代码 我们上面讲解了 Executor…

数据结构——时间复杂度和空间复杂度

1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数的计算 long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); }我们看到…

如何提高商城系统的稳定性?

电商行业的飞速发展&#xff0c;越来越多的企业开始关注电商建设。其中&#xff0c;商城系统的稳定性是企业最为关心的问题之一。 商城系统的稳定性不仅影响用户体验&#xff0c;还关系到企业的声誉和利益。因此&#xff0c;如何提高商城系统的稳定性是每一个电商企业必须要面对…

高忆管理:股票集合竞价?

股票集合竞价&#xff08;英文缩写为“SPAC”&#xff09;是股票商场开市前最终一个阶段&#xff0c;也被称为“开盘竞价”。在这个阶段&#xff0c;买卖双方能够提交订单&#xff0c;而且体系将会平衡对买卖盘进行撮合&#xff0c;以确认股票开盘价。这个阶段通常会在上午九点…

AnyCase4.0全球贸易集成平台震撼上线,免费试用赢取精美好礼!

全球贸易行业一直以来都面临着各种挑战和复杂的操作流程。然而&#xff0c;随着科技的不断进步和跨境贸易的日益发展&#xff0c;一个集物流服务、外贸服务、供应商管理和企业风控管理于一体的全新跨境贸易集成平台AnyCase4.0应运而生。经过多年的沉淀和精心打磨&#xff0c;An…

树结构转换

思路&#xff1a; 先把数组转化成一个对象&#xff08;map&#xff09;&#xff0c;对象的key值是对象的id 遍历对象&#xff1b;map[map[k].pid].children.push(map[k]),【k代表索引】&#xff0c;pid等于0代表是根节点 // 数结构转换let arr [{id: 1,pid: 0,name: "b…