【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

文章目录

  • 前言
  • 安装
  • 小试牛刀
  • 用repVgg抽取向量
  • 构建Faiss索引
  • 进行相似性搜索
  • 本项目延伸
  • 其它项目拓展
  • 总结


前言

Faiss的全称是Facebook AI Similarity Search。

这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法。
暴力检索耗时巨大,对于一个要求实时人脸识别的应用来说是不可取的。
而Faiss则为这种场景提供了一套解决方案。
Faiss从两个方面改善了暴力搜索算法存在的问题:降低空间占用加快检索速度首先,
Faiss中提供了若干种方法实现数据压缩,包括PCA、Product-Quantization等
ref:https://zhuanlan.zhihu.com/p/133210698,https://zhuanlan.zhihu.com/p/357414033
代码仓库:https://github.com/facebookresearch/faiss
faiss的用法在这里:https://github.com/facebookresearch/faiss/wiki/Getting-started
ref:https://github.com/ChunelFeng/caiss 据说这个也不错,我还没试,从名字也可以看出来是类似 faiss的东西
ref:https://blog.csdn.net/yaozaiyuanfang/article/details/116608345
ref: https://blog.csdn.net/yaozaiyuanfang/article/details/116608375?spm=1001.2014.3001.5502 —这个总结的也不错


安装

ref:https://anaconda.org/pytorch/faiss-gpu
用的gpu版本,貌似cpu版本也可以使用
安装命令:

conda install -c pytorch faiss-gpu

因为我看着有 -c pytorch, 为了不污染我原来的pytorch环境,所以新建了一个环境:

conda create -n faiss python==3.8
conda install -c pytorch faiss-gpu

其实是我多虑了, -c 是指通道,-c pytorch表示要从名为pytorch的channel中安装faiss-gpu软件包。
所以我又在常用的环境,运行了一下这个命令.

小试牛刀

faiss 是一个快速检索向量的应用,此时我们还需要一个提取特征向量的神经网络。
我选用的是:RepVGG
代码在16仓库的这里:/home/jianming_ge/workplace/zhongwaiyun/Faiss-ytst

import timm
import os
from timm.models.efficientnet import _cfg
# 查看vgg相关的模型
vgg_models = timm.list_models("*vgg*")
# ['repvgg_a2', 'repvgg_b0', 'repvgg_b1', 'repvgg_b1g4', 'repvgg_b2', 'repvgg_b2g4', 'repvgg_b3', 'repvgg_b3g4', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', 'vgg19', 'vgg19_bn']  repvgg_b3g4 是网络结构最复杂的模型,抽取特征也最好# weights_path=  os.path.join(os.path.dirname(os.path.abspath(__file__)),"weights","repvgg_b3g4-73c370bf.pth")
weights_path=  "/home/jianming_ge/workplace/zhongwaiyun/Faiss-ytst/weights/repvgg_b3g4-73c370bf.pth"
config = _cfg(url='', file=weights_path)# 
model = timm.create_model('repvgg_b3g4',pretrained=True,features_only=True,pretrained_cfg=config)
model

在这里插入图片描述
---------------------------20230727------回来继续----------

用repVgg抽取向量

from PIL import Image
# 用repvgg抽取特征
img_path = "/home/jianming_ge/workplace/zhongwaiyun/Faiss-ytst/images/reflective_clothing/reflective_db/8.jpg"
image = Image.open(img_path)
image

在这里插入图片描述
转成tensor,并且转成Pytorch 所需要的格式

import torch
import numpy as npimage1 = torch.as_tensor(np.array(image, dtype=np.float32)).transpose(2,0)
image1.shape

torch.Size([3, 1920, 1920])
需要增加一个batchsize的纬度

#增加一个None 是为了增加一个纬度
image = torch.as_tensor(np.array(image, dtype=np.float32)).transpose(2,0)[None]
image.shape

torch.Size([1, 3, 1920, 1920])

# 可以看到这些图片的大小都不相等,所以要resize成大小相等的图片,在做特征抽取
tensor_list = []
for img_path in img_path_list:image = Image.open(img_path)image = torch.as_tensor(np.array(image, dtype=np.float32)).transpose(2,0)[None]feature_output = model.forward(image)print(feature_output[0].shape)tensor_list.append(feature_output[0])

torch.Size([1, 64, 155, 150])
torch.Size([1, 64, 1125, 2000])
torch.Size([1, 64, 1125, 2000])
torch.Size([1, 64, 960, 960])
torch.Size([1, 64, 400, 513])
torch.Size([1, 64, 960, 1294])
torch.Size([1, 64, 750, 1161])
torch.Size([1, 64, 540, 540])
torch.Size([1, 64, 1632, 1224])
torch.Size([1, 64, 188, 250])
torch.Size([1, 64, 204, 250])
torch.Size([1, 64, 188, 250])

因为图片大小不一样,所以需要resize相同的大小,数据对齐一下:

import torch
import torchvision.transforms as transforms
from PIL import Imagedef image_to_tensor(image_path_list, resize_dim=(224, 224)):# 定义转换操作transform = transforms.Compose([transforms.Resize(resize_dim),transforms.ToTensor()])# 创建空列表存储张量tensor_list = []for image_path in image_path_list:# 打开图片image = Image.open(image_path)# resize和转换为张量image_tensor = transform(image)# 添加到张量列表tensor_list.append(image_tensor)# 将张量列表堆叠为一个张量tensor_stack = torch.stack(tensor_list)return tensor_stack# 将图片路径列表转换为张量
tensor = image_to_tensor(img_path_list,resize_dim=(640, 640))tensor.shape

torch.Size([12, 3, 640, 640])

到此已经有个12个特征向量, 123640*640, 其实也不一定是要640,我是受yolov的影响写的640.

构建Faiss索引

import faiss
features = tensor.numpy()
N, _, H, W = tensor.shape
features_reshaped = features.reshape(N, -1).astype('float32')# 构建Faiss索引
dimension = features_reshaped.shape[1]  # 特征向量的维度
index = faiss.IndexFlatL2(dimension)  # 使用L2距离度量的平面索引# 添加特征向量到索引
index.add(features_reshaped)
features_reshaped.shape

(12, 1228800)
我理解faiss是把空间特征给展平放了,不知道这样是否对匹配精度影响多少,因为这样的话,就把空间信息丢了。

进行相似性搜索

# 3.进行相似性搜索:
test_img_path = "/home/jianming_ge/workplace/zhongwaiyun/Faiss-ytst/images/reflective_clothing/test_imgs/24.jpg"
query_vector_list = image_to_tensor([test_img_path], resize_dim=(640, 640))
query_vector = query_vector_list[0].reshape(1,dimension).numpy()
query_vector.shape

(1, 1228800)
返回top k=10 个相似的图片


distances, indices = index.search(query_vector, k)# 输出结果
print("最相似的图像索引:", indices)
print("最相似的图像距离:", distances)

最相似的图像索引: [[10 5 9 8 6 4 2 1 7 11]]
最相似的图像距离: [[ 98840.35 105621.3 126307.59 131995.1 162313.53 162977.97 183604.77
184193.06 191399.08 215673.9 ]]

print("我是模板:")
Image.open(img_path_list[indices[0][0]])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原始图片是这个:
在这里插入图片描述

本项目延伸

应该需要用目标监测把每个人都框出来,然后送入faiss,出来top5,看是否穿有反光衣。
这就是基本思路了,阈值要设定好,因为不清楚阈值在多大的时候合适。

其它项目拓展

脑洞稍微打开一点,把特征提取器换成face++的,把特征向量存到faiss上(或者milvus上,据说milvus的底层是faiss),那不就可以容纳N多人脸的1:N 或者M:N的人脸搜索模型了么。

总结

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

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

相关文章

最全的3D动画软件介绍来了!良心总结9款3D动画制作必备软件

现在,市面上流行着的3D动画软件如此之多,以至于很难敲定到底哪一款更适合自己或自己的团队。本篇文章带来了一些热门的、被视为行业标准的3D动画软件的介绍,帮助您更好地做出选择。 不仅如此,您还能从文章中了解到在数字内容创建…

费舍尔线性分辩分析(Fisher‘s Linear Discriminant Analysis, FLDA)

费舍尔线性分辩分析(Fisher’s Linear Discriminant Analysis, FLDA) 目录 费舍尔线性分辩分析(Fishers Linear Discriminant Analysis, FLDA)1. 问题描述2. 二分类情况3. 多分类情况4. 代码实现4.1 二分类情况4.2 多分类情况 5. 参考资料 1. 问题描述 为解决两个或多个类别的…

PS - Photoshop 抠图与剪贴蒙版功能与 Stable Diffusion 重绘

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131978632 Photoshop 的剪贴蒙版是一种将上层图层的内容限制在下层图层的形状范围内的方法,也就是说,上层图层只能在下层图…

32.选择器

选择器 html部分 <div class"toggle-container"><input type"checkbox" id"good" class"toggle"><label for"good" class"label"><div class"ball"></div></label&…

uni-app云打包(android)(自有证书、云端证书、公共测试证书)

一、进入云打包入口 发行->原生App-云打包 二、证书选择 1、使用自有证书 ①进入香蕉云编&#xff08;这里采用的证书从香蕉云编进行生成&#xff09; 香蕉云编-app打包上架工具类平台 ②进入页面选择“生成签名证书”->"立即创建证书" ③选择“安卓证书生…

数字人会成为文旅行业的新增量吗?写实数字人定制包含哪些技术?

近年来&#xff0c;各大文旅机构均在围绕数字人展开了文旅营销创作&#xff0c;凭借着写实数字人定制技术&#xff0c;将数字人的人设、功能以及才艺得到创新&#xff0c;并由此在文旅形态上展开了诸多尝试。 比如会唱山歌多才多艺的数字人刘三姐&#xff0c;使用多种语言推介…

windows环境下adb 下载和配置,连接手机。

ADB下载地址&#xff1a; https://adbdownload.com/ 选择下载windows系统的。 下载后解压&#xff0c;查看adb.exe所在的目录&#xff0c;如下 这里将路径复制下来&#xff1a;D:\ADB 配置到系统环境变量中。 然后再打开cmd&#xff0c;输入adb version查看版本。 出现…

ThinkPHP8知识详解:ThinkPHP8是什么?

欢迎你来到PHP服务网学习最新的ThinkPHP8开发教程&#xff0c;本文介绍一下ThinkPHP8是什么&#xff1f; 1、ThinkPHP8是ThinkPHP框架的最新版本&#xff0c;它在之前版本的基础上进行了改进和优化。它采用了现代化的设计理念和架构&#xff0c;提供了更好的性能和更丰富的功能…

【机器学习】Linear Regression

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…

41. linux通过yum安装postgresql

文章目录 1.下载安装包2.关闭内置PostgreSQL模块:3.安装postgresql服务:4.初始化postgresql数据库:5.设置开机自启动:6.启动postgresql数据库7.查看postgresql进程8.通过netstat命令或者lsof 监听默认端口54329.使用find命令查找了一下postgresql.conf的配置位置10.修改postgre…

基于Java+SpringBoot制作一个学生公寓管理小程序

制作一个学生公寓管理小程序,旨在优化和简化学生公寓的日常管理工作。该系统涵盖了各种功能模块,以满足学生住宿的需求,同时提供方便、高效的管理方式,该系统包含用户管理、卫生评比、来访登记、宿舍报修等模块。 一、小程序1.1 项目创建1.2 首页轮播图快捷导航iconfont图标…

修改若依框架为自己的项目并上传到git

第一步: 打开后台若依项目,把全局替换打开,搜索ruoyi 和 RuoYi 和 若依 分别换成自己公司的名称( 记住要把区分大小写打开 ) 第二步: 关闭idea中的项目,然后在文件夹中打开这个项目,然后搜索target( 缓冲 ) 删除,部分人的电脑上面还有imp文件切记也要删除 第三步: 接着把项目…

重要通知|关于JumpServer开源堡垒机V2版本产品生命周期的相关说明

JumpServer&#xff08;https://github.com/jumpserver&#xff09;开源项目创立于2014年6月&#xff0c;已经走过了九年的发展历程。经过长期的产品迭代&#xff0c;JumpServer已经成为广受欢迎的开源堡垒机。 JumpServer堡垒机遵循GPL v3开源许可协议&#xff0c;是符合4A&a…

无线蓝牙耳机有什么推荐?怎么选择适合自己的耳机?七款蓝牙耳机分享

随着信息技术的不断发展&#xff0c;蓝牙耳机的不断发展也是必然的&#xff0c;可以说蓝牙耳机在大部分人们的生活中是不可缺少的一部分。那么我们该怎么去挑选出适合我们自己的需求的“蓝”朋友呢&#xff1f; 第一款&#xff1a;南卡小音舱lite2蓝牙耳机 推荐指数&#xff…

使用Anaconda3创建pytorch虚拟环境

一、Conda配置Pytorch环境 1.conda安装Pytorch环境 打开Anaconda Prompt&#xff0c;输入命令行&#xff1a; conda create -n pytorch python3.6 ​ 输入y&#xff0c;再回车。 稍等&#xff0c;便完成了Pytorch的环境安装。我们可以利用以下命令激活pytorch环境。 conda…

JVM源码剖析之JIT工作流程

版本信息&#xff1a; jdk版本&#xff1a;jdk8u40思想至上 Hotspot中执行引擎分为解释器、JIT及时编译器&#xff0c;上篇文章描述到解释器过度到JIT的条件。JVM源码剖析之达到什么条件进行JIT优化 这篇文章大致讲述JIT的编译过程。在JDK中javac和JIT两部分跟编译原理挂钩&a…

使用Kmeans算法完成聚类任务

聚类任务 聚类任务是一种无监督学习任务&#xff0c;其目的是将一组数据点划分成若干个类别或簇&#xff0c;使得同一个簇内的数据点之间的相似度尽可能高&#xff0c;而不同簇之间的相似度尽可能低。聚类算法可以帮助我们发现数据中的内在结构和模式&#xff0c;发现异常点和离…

小研究 - 一种复杂微服务系统异常行为分析与定位算法(一)

针对极端学生化偏差&#xff08;&#xff25;&#xff58;&#xff54;&#xff52;&#xff45;&#xff4d;&#xff45; &#xff33;&#xff54;&#xff55;&#xff44;&#xff45;&#xff4e;&#xff54;&#xff49;&#xff5a;&#xff45;&#xff44; &#…

3、Winform表单控件

在学习了布局控件之后,我们就该学习表单控件了。表单控件可以设置默认值,使用属性窗口或使用代码都是可以的。属性窗口最终也很转化成代码。 程序的本质=输入+处理+输出。在Winform程序角度,这里的输入输出就可以用我们的表单控件来实现。 表单控件大致可分为两类,文本控…

Python爬取IP归属地信息及各个地区天气信息

一、实现样式 二、核心点 1、语言&#xff1a;Python、HTML&#xff0c;CSS 2、python web框架 Flask 3、三方库&#xff1a;requests、xpath 4、爬取网站&#xff1a;https://ip138.com/ 5、文档结构 三、代码 ipquery.py import requests from lxml import etree # 请求…