图像识别快速实现

news2024/9/24 1:26:07

文本的跑通了,接下来玩玩图片场景

1. 引入模型

再另起类test_qdrant_img.py,转化图片用到的模型和文本不太一样,我们这里使用ResNet-50模型

import unittest
from qdrant_client.http.models import Distance, VectorParams
from qdrant_client import QdrantClient
import torch
import torchvision.transforms as transforms
from PIL import Image

class TestQDrantImg(unittest.TestCase):

    def setUp(self):
        self.collection_name = "img_collection"
        self.client = QdrantClient("localhost", port=6333)
        # 加载ResNet-50模型
        self.model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
        self.model.eval()
        # 图像预处理
        self.preprocess = transforms.Compose([
            # 图像调整为256*256
            transforms.Resize(256), 
            # 中心裁剪为224*224
            transforms.CenterCrop(224), 
            # 转换为张量,像素值从范围[0,255]缩放到范围[0,1],RGB(红绿蓝)转换为通道顺序(即 RGB 顺序)
            transforms.ToTensor(), 
            # 应用归一化,减去均值(mean)并除以标准差(std)
            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
        ])

2. 添加图片向量

我们先创建一个新集合

def test_create_collection(self):
    self.client.create_collection(
        collection_name=self.collection_name,
        vectors_config=VectorParams(size=1000, distance=Distance.EUCLID),
    )

往集合里分别添加1个猫的图片和1个狗的图片

    def test_img_vector(self):
        # 加载并预处理图像
        id = 1
        image_path = './img/cat1.png'
        # id = 2
        # image_path = './img/dog1.png'
        image = Image.open(image_path)
        image_tensor = self.preprocess(image)
        # 在第0维度上添加一个维度,将图像张量转换为形状为 (1, C, H, W) 的张量,其中 C 是通道数,H 是高度,W 是宽度
        image_tensor = torch.unsqueeze(image_tensor, 0)
        with torch.no_grad():
            # 去除维度为1的维度,将特征向量的形状从 (1, D) 转换为 (D,)
            feature_vector = self.model(image_tensor).squeeze().tolist()

        operation_info = self.client.upsert(
            collection_name=self.collection_name,
            points=[{'id': id, 'vector': feature_vector, 'payload': {"image_path": image_path}}]
        )

        print(operation_info)

3. 匹配图片向量

然后用其他猫狗的图片来做搜索匹配

    def test_search(self):
        # 加载并预处理图像
        image_path = './img/cat2.png'
        # image_path = './img/dog2.png'
        # image_path = './img/cat3.png'
        image = Image.open(image_path)
        image_tensor = self.preprocess(image)
        image_tensor = torch.unsqueeze(image_tensor, 0)
        with torch.no_grad():
            feature_vector = self.model(image_tensor).squeeze().tolist()

        search_result = self.client.search(
            collection_name=self.collection_name, query_vector=feature_vector, limit=3
            , with_vectors=True, with_payload=True
        )

        print(search_result)

结果:

[ScoredPoint(id = 1, version = 0, score = 68.21013, payload = {

'image_path': './img/cat1.png'

}, vector = [...]),

ScoredPoint(id = 2, version = 1, score = 85.10757, payload = {

'image_path': './img/dog1.png'

}, vector = [...])]

当使用猫2猫3作为查询条件时,跟猫1记录的score(向量距离)较小;

同理,使用狗2作为查询条件时,跟狗1记录的score(向量距离)较小

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

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

相关文章

im6ull学习总结(三-2)文字显示中文字符

承接上篇文章 中文字符的点阵显示 使用点阵字库时,中文字符的显示原理跟 ASCII 字符是一样的。要注意的地方在于中文的编码:在 C 源文件中它的编码方式是 GB2312 还是 UTF-8?编译出的可执行程序,其中的汉字编码方式是 GB2312 还…

Java 第23章 反射 本章作业

文章目录 反射修改私有成员变量反射和File 反射修改私有成员变量 public class Homework01 {public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {/***…

c盘扩容时,d盘无法删除卷问题

C盘扩容时,磁盘管理中D盘右键无法删除卷的原因 首先,D盘下文件夹为空,但是显示可用空间不是100%,经过排查,发现是虚拟内存设置在了D盘导致无法删除卷,这里只需要将虚拟内存放到其他盘,如E盘即可…

bootstrap5实现的在线商城网站Parlo

一、需求分析 在线商城网站是指基于互联网技术搭建的电子商务平台,通过网站提供商品和服务的展示、销售和交易功能。它的主要作用包括以下几个方面: 商品展示和销售:在线商城网站是商家展示商品的平台,可以通过图片、文字、视频等…

阿里巴巴开源异构数据源离线/全量/增量同步工具 - DataX

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

web component - 使用HTML Templates和Shadow DOM构建现代UI组件

Web Component是一种用于构建可重用的UI组件的技术。它使用标准化的浏览器API,包括Custom Elements、Shadow DOM和HTML Templates来实现组件化开发方式。这些API都是现代浏览器原生支持的,因此不需要引入第三方库或框架即可使用。 在这篇博客中&#xf…

如何学习TS?

文章目录 一. 8种内置基础类型.ts二. void、never、any、unknown类型void类型never类型any类型unknown类型总结:void和any在项目中是比较常见的,never和unknown不常用。 三. 数组和函数类型定义.ts四. 元组与交叉类型使用元组数组一般有同类型的值组成&a…

页面间动画之放大缩小视图

目录 1、Exchange类型的共享元素转场 2、Static类型的共享元素转场 3、场景示例 在不同页面间,有使用相同的元素(例如同一幅图)的场景,可以使用共享元素转场动画衔接。为了突出不同页面间相同元素的关联性,可为它们…

管理文件传输的工具CopyQueue mac功能特点

CopyQueue for mac是用于管理文件传输的工具,可以有效地复制多个文件,并且比OS X的速度更快,暂停和恢复文件传输,日程任务和更多,使用和管理起来都非常的简单方便。如果你要复制很多文件,CopyQueue更快更高…

pytest conftest定义一个fixtrue获取测试环境地址

方便全局切换地址 pytest.fixture() def config():data {测试环境: {A环境: 127.0.0.1,B环境: 127.0.0.2,C环境: 127.0.0.3,D环境: 127.0.0.4},}return data.get(测试环境, {}).get(A环境)import pytestdef test_case001(config):url http://str(config):8080/api/user/logi…

从零开始了解大数据(七):总结

系列文章目录 从零开始了解大数据(一):数据分析入门篇-CSDN博客 从零开始了解大数据(二):Hadoop篇-CSDN博客 从零开始了解大数据(三):HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四):MapReduce篇-CSDN博客 从零开始了解大…

基于rk3568 Android H265推流SRS低延迟网页播放方案

在音视频领域,融合推流,低码流,低延迟,浏览器H5化是一个降低成本,提升用户体验的重要手段。同时适配现有直播的生态也是一个必要条件。 在满足上述要求的情况下,我做了以下实践,取得了良好的效果…

每天五分钟计算机视觉:揭秘迁移学习

本文重点 随着人工智能的迅速发展,深度学习已经成为了许多领域的关键技术。然而,深度学习模型的训练需要大量的标注数据,这在很多情况下是不现实的。迁移学习作为一种有效的方法,可以在已有的数据和模型上进行训练,然后将其应用于新的任务。这种方法大大降低了对新任务的…

opencv期末练习题(2)附带解析

图像插值与缩放 %matplotlib inline import cv2 import matplotlib.pyplot as plt def imshow(img,grayFalse,bgr_modeFalse):if gray:img cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)plt.imshow(img,cmap"gray")else:if not bgr_mode:img cv2.cvtColor(img,cv2.COLOR_B…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结: 1.Chatgpt引爆了通用人工智能,最大的受益者或是机器人,2023年最热门的创业赛道便是人形机器人,优必选更是成为人形机器人上市第一股, 可以说2023年是机器人开启智能化的元年,而2024则将成为机器…

Java网络编程之IP,端口号,通信协议(UDP,TCP)

目录 1.软件架构2.网络编程三要素3.IP1.IPV42.IPV6 4.端口号5.协议1.UDP协议1.单播2.组播3.广播 2.TCP协议1.三次握手2.四次挥手 1.软件架构 ①C/S:客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美…

三千多个厂商默认帐号、默认密码(建议收藏)

晚上好,我的网工朋友。 做网工这行,多少都会遇上各种各样的厂商设备,遇上一些新设备,虽然没有更改密码,但不知道初始默认账号和密码是啥。 今天就给你整理了一波,三千多个厂商默认帐号、默认密码&#xf…

Java学习,一文掌握Java之SpringBoot框架学习文集(2)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

LLVM(简介)

历史 LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目,目前已经发展成一个集编译器和工具链为一体的商业开源项目,因此其英文名称的含义被扩大,不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许…

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…