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

这篇具有很好参考价值的文章主要介绍了【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

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

【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1,pytorch,深度学习,深度学习,图搜索算法,faiss
转成tensor,并且转成Pytorch 所需要的格式

import torch
import numpy as np

image1 = 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 Image

def 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]])

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

本项目延伸

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

其它项目拓展

脑洞稍微打开一点,把特征提取器换成face++的,把特征向量存到faiss上(或者milvus上,据说milvus的底层是faiss),那不就可以容纳N多人脸的1:N 或者M:N的人脸搜索模型了么。
另外,faiss 还可以做知识问答,只需要把问题用word2vec 就能找到问题的编码啊。~文章来源地址https://www.toymoban.com/news/detail-609748.html

总结

到了这里,关于【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

    https://github.com/ultralytics/ultralytics 官方教程:https://docs.ultralytics.com/modes/train/ 更建议下载代码后使用 下面指令安装,这样可以更改源码,如果不需要更改源码就直接pip install ultralytics也是可以的。 这样安装后,可以直接修改yolov8源码,并且可以立即生效。此图是命令解释: 安

    2024年02月10日
    浏览(61)
  • 【milvus】向量数据库,用来做以图搜图+人脸识别的特征向量

    ref:https://milvus.io/docs 第一次装东西,要把遇到的问题和成功经验都记录下来。 1.Download the YAML file 看一下下载下来的是什么东西 Start Milvus In the same directory as the docker-compose.yml file, start up Milvus by running: 报错则需要安装docker-compose了 下载最新版的docker-compose 文件 添加可执行权限

    2024年02月16日
    浏览(43)
  • 深度学习实战34-基于paddle关键信息抽取模型训练的全流程

    大家好,我是微学AI,今天我给大家介绍一下深度学习实战34-基于paddle关键信息抽取模型训练的全流程,我们在文档应用场景中,存在抽取关键信息的任务,比如身份证里的姓名和地址,快递单里的姓名和联系方式等等。传统的方法需要设计模板,但是这太繁琐了,也不够强

    2024年02月07日
    浏览(49)
  • 机器学习&&深度学习——向量求导问题

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——图像分类数据集 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 这篇文章的本意还是再一次复盘一下向量求导问题,很多时候的例子都直接推着就过去了,但是重新

    2024年02月15日
    浏览(44)
  • 图片搜索引擎网站大全,以图搜图网站

    当我们需要搜索一些图片的时候使用图片搜索引擎网站可以帮我们更快地找到自己需要的图片,那么有哪些图片搜索引擎网站可以搜索图片呢?下面小编就来和大家分享几个以图搜图的网站。 1.百度图片搜索引擎网站 百度是最大的中文搜索引擎,百度的图片搜索以中文网站的

    2024年02月07日
    浏览(73)
  • 深度学习中标量,向量,矩阵和张量

    1.标量(Scalar) 只有大小没有方向,可用实数表示的一个量 2.向量(Vector) 可以表示大小和方向的量 3.矩阵(Matrix) m行n列,矩阵中的元素可以是数字也可以是符号,在深度学习中一般是二维数组 4.张量(Tensor) 用来表示一些向量、标量和其他张量之间的线性关系的多线性函数,这些线

    2024年02月15日
    浏览(44)
  • 机器学习笔记 - 基于C++的​​深度学习 一、向量运算

            由于它们的可扩展性和灵活性,现在很少找到不使用TensorFlow、PyTorch、Paddle......(这里的省略号是指各种成熟的深度学习库)的项目。          花时间从头开始编写机器学习算法(即在没有任何基础框架的情况下)似乎有些重复造轮子的感觉。然而,事实并非

    2024年02月13日
    浏览(40)
  • 深度学习标量、向量、矩阵、张量之间的区别与联系

    前言 深度学习 的表现之所以能够超过传统的机器学习算法离不开神经网络,然而神经网络最基本的数据结构就是 向量 和 矩阵 , 神经网络 的输入是向量,然后通过每个矩阵对向量进行线性变换,再经过激活函数的非线性变换,通过层层计算最终使得 损失函数的最小化 ,完

    2024年02月16日
    浏览(37)
  • 使用火山云搜索ESCloud服务构建图文检索应用(以文搜图/以图搜图)

    图文检索在生活中具有广泛的应用,常见的图片检索包括基于文本内容搜索和基于图片内容搜索。用户通过输入文字描述或上传图片就可以在海量的图片库中快速找到同款或者相似图片,这种搜索方式被广泛应用于电商、广告、设计以及搜索引擎等热门领域。 本文 基于 火山

    2024年02月14日
    浏览(38)
  • 深度学习图像搜索算法-图像搜索引擎

    深度学习图像搜索算法-图像搜索引擎 文章目录 ✍🏻作者简介: 机器学习,深度学习,卷积神经网络处理,图像处理 🚀B站项目实战:https://space.bilibili.com/364224477 😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 🤵‍♂代码获取:@个人主页 给定一个

    2024年02月03日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包