基于深度学习的以图搜图

  • 使用预训练的卷积神经网络提取图片中的特征,生成特征向量。
  • 利用图片库中所有图片数据构建 <id, feature vector> 数据。
  • 使用 Faiss 创建 Index ,利用 <id, feature vector> 数据生成索引。
  • 针对待检索图片,使用模型提取图片特征向量,然后使用 Index 检索 TopK 相似图片的 id。
  • 可视化检索结果

1. 导包

import os
import time
import torch
import faiss
import numpy as np
import matplotlib.pyplot as pltfrom PIL import Image
from torchvision import models, transforms
from torch.utils.data import DataLoader, Dataset%matplotlib inline

GPU 加速

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
# cuda

2.自定义数据集

transform = transforms.Compose([transforms.Resize((256, 256)),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])class MyDataset(Dataset):def __init__(self, data_path, transform=None):super().__init__()self.transform = transformself.data_path = data_pathself.data = []img_path = os.path.join(data_path, 'img.txt')with open(img_path, 'r', encoding='utf-8') as f:for line in f.readlines():line = line.strip()img_name = os.path.join(data_path, line)img = Image.open(img_name)if img.mode == 'RGB':self.data.append(line)def __getitem__(self, idx):# take the data sample by it's indeximg_path = os.path.join(self.data_path, self.data[idx])# read imageimg = Image.open(img_path)# apply the transformif self.transform:img = self.transform(img)# return the image and indexdict_data = {'index': idx,'img': img}return dict_datadef __len__(self):return len(self.data)
img_folder = 'JPEGImages'
val_dataset = MyDataset(img_folder, transform=transform)
batch_size = 64
val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=4)
print('Val_dataset: ', val_dataset.__len__())
print('iter: ', int(val_dataset.__len__()/batch_size)+1)
Val_dataset:  17125
iter:  268

3.预训练模型+自定义特征值提取器

# 加载预训练模型
def load_model():model = models.resnet18(pretrained=True)model.to(device)model.eval()return model# 定义 特征提取器
def feature_extract(model, x):x = model.conv1(x)x = model.bn1(x)x = model.relu(x)x = model.maxpool(x)x = model.layer1(x)x = model.layer2(x)x = model.layer3(x)x = model.layer4(x)x = model.avgpool(x)x = torch.flatten(x, 1)return x
model = load_model()for idx, batch in enumerate(val_dataloader):img = batch['img']  # 图片数据表示 --> 图片特征index = batch['index']img = img.to(device)feature = feature_extract(model, img)feature = feature.data.cpu().numpy()imgs_path = [os.path.join(img_folder, val_dataset.data[i] + '.txt') for i in index]assert len(feature) == len(imgs_path)for i in range(len(imgs_path)):feature_list = [str(f) for f in feature[i]]img_path = imgs_path[i]with open(img_path, 'w', encoding='utf-8') as f:f.write(" ".join(feature_list))print('*' * 60)print(idx * batch_size)

4.图片向量化

# 获取图片特征¶
def img2feat(pic_file):feat = []with open(pic_file, 'r', encoding='utf-8') as f:lines = f.readlines()feat = [float(f) for f in lines[0].split()]return feat
ids = []
data = []img_folder = 'VOC2012'#'VOC2012_small/'
img_path = os.path.join(img_folder,'img.txt')
with open(img_path,'r',encoding='utf-8') as f:for line in f.readlines():img_name = line.strip()img_id = img_name.split('.')[0]pic_txt_file = os.path.join( img_folder,"{}.txt".format(img_name) )if not os.path.exists(pic_txt_file):continuefeat = img2feat(pic_txt_file)ids.append(int(img_id))data.append(np.array(feat))# 构建数据<id,data> 
ids = np.array(ids)
data = np.array(data).astype('float32')
d = 512 # feature 特征长度(模型的结果) 
print(" 特征向量记录数: ",data.shape)
print(" 特征向量ID的记录数:",ids.shape)特征向量记录数:  (17125, 512)特征向量ID的记录数: (17125,)

5.创建 Faiss 索引 Index

# 创建图片特征索引 - 方案1
# index = faiss.index_factory(d,"IDMap,Flat")
# index.add_with_ids(data,ids)# 创建图片特征索引-方案2(  资源有限,效果更好 )
###IDMap 支持add_with_ids 
###如果很在意,使用”PCARx,...,SQ8“ 如果保存全部原始数据的开销太大,可以用这个索引方式。包含三个部分,
# 1.降维
# 2.聚类
# 3.scalar 量化,每个向量编码为8bit 不支持GPU
index = faiss.index_factory(d, "IDMap,PCAR16,IVF50,SQ8") 
index.train(data)
index.add_with_ids(data, ids)# 索引文件保存磁盘
faiss.write_index(index,'index_file.index') # 讲index保存index_file.index 的文件
# index = faiss.read_index("index_file.index")
# print(index.ntotal) # 查看索引库大小

加载 Faiss Index 索引文件

index = faiss.read_index('index_file.index')
print('索引记录数:', index.ntotal)
# 索引记录数: 17125

6.Faiss 相似 TopK 检索

def index_search(feat,topK ):"""feat: 检索的图片特征topK: 返回最高topK相似的图片"""feat = np.expand_dims( np.array(feat),axis=0 )feat = feat.astype('float32')start_time = time.time()dis,ind = index.search( feat,topK )end_time = time.time()print( 'index_search consume time:{}ms'.format(  int(end_time - start_time) * 1000  ) )return dis,ind # 距离,相似图片id

7.可视化检索结果

def visual_plot(ind,dis,topK,query_img = None):       # 相似照片cols = 4rows = int(topK / cols)idx = 0fig,axes = plt.subplots(rows,cols,figsize=(20 ,5*rows),tight_layout=True)#axes[0,0].imshow(query_img)for row in range(rows):for col in range(cols):_id = ind[0][idx]_dis = dis[0][idx]img_path = os.path.join(img_folder,'{}.jpg'.format(_id))#print(img_path)if query_img is not None and idx == 0:axes[row,col].imshow(query_img)axes[row,col].set_title( 'query',fontsize = 20  )else:img = plt.imread(  img_path   )axes[row,col].imshow(img)axes[row,col].set_title( 'matched_-{}_{}'.format(_id,int(_dis)) ,fontsize = 20  )idx+=1plt.savefig('pic')
img_folder = 'VOC2012/'
# img_id = '100211.jpg'
img_id = '100002.jpg'
topK = 20
img_path = os.path.join( img_folder,img_id)
print(img_path) # 查看  这个img_path 的相似图片img = Image.open(img_path)
img = transform(img) # torch.Size([3, 224, 224])
img = img.unsqueeze(0) # torch.Size([1, 3, 224, 224])
img = img.to(device)# 对我们的图片进行预测
with torch.no_grad():# 图片-> 图片特征print('1.图片特征提取')feature = feature_extract( model,img )# 特征-> 检索feature_list = feature.data.cpu().tolist()[0]print('2.基于特征的检索,从faiss获取相似度图片')# 相似图片可视化dis,ind = index_search( feature_list,topK=topK )print('ind = ',ind)print('3.图片可视化展示')# 当前图片query_img = plt.imread( img_path )visual_plot( ind,dis,topK,query_img)
VOC2012/100002.jpg
1.图片特征提取
2.基于特征的检索,从faiss获取相似度图片
index_search consume time:0ms
ind =  [[100002 101430 116500 101585 116528 100507 104768 107651 112514 102820112416 116458 106167 111781 116247 103299 103154 106012 115086 111156]]
3.图片可视化展示

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

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

相关文章

搜索技术之--以图搜图

以图搜图&#xff0c;是通过搜索图像文本或者视觉特征&#xff0c;为用户提供互联网上相关图形图像资料检索服务的专业搜索引擎系统&#xff0c;是搜索引擎的一种细分。通过输入与图片名称或内容相似的关键字来进行检索&#xff0c;另一种通过上传与搜索结果相似的图片或图片UR…

二箱:比谷歌识图更全面,多引擎以图搜图工具

NooBox 二箱 在主流搜索引擎上&#xff0c;如今都已增加了以图搜图功能&#xff0c;大大提高了图片搜索的效率。 以谷歌为例&#xff0c;在谷歌图片的搜索栏中点击图片标识&#xff0c;就可以选择粘贴图片网址或上传本地图片来进行识图。 但一个搜索引擎的图库往往难以满足用户…

以图搜图在线网站汇总(共7个)

文章目录 写在前面测试样例以图搜图GoogleBaiduYandexTineyeBingSougou360 写在前面 今天给大家分享7个以图搜图的在线网站&#xff0c;上传图片即可搜索图片来源、详情信息或相似图片。 测试样例 测试图片出自番剧《干支魂》第10话3分07秒 以图搜图 Google https://www.goo…

揭开提示工程的奥秘!免费!吴恩达+OpenAI

太强了&#xff0c;居然完全免费&#xff0c;AI发展史上的重量级人物&#xff0c;就是那个发明深度学习算法的。他联合OpenAI开课了。 课程链接&#xff1a;https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/ 课程一共9节课&#xff0c;共…

开源社拍了拍 SegmentFault 思否,6 月杭州见

5 月 19 日&#xff0c;OpenAI 突然官宣 ChatGPT 正式推出 iOS APP&#xff0c;迎来真 iPhone 时刻。同日&#xff0c;国家超算天津中心发布国产中文语言大模型天河天元&#xff0c;并在此基础上启动了深度训练面向医疗、工业、法律等领域的专业模型。一天之内&#xff0c;AI …

Stuart Russell专访:关于ChatGPT,更多数据和更多算力不能带来真正的智能

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 《人工智能&#xff1a;现代方法》&#xff08;Artificial Intelligence: A Modern Approach&#…

你不知道的Bing聊天机器人:7个惊人的用途!

导读&#xff1a;以下是我总结的有用的方法&#xff0c;可以利用AI聊天机器人让您的生活更轻松。 本文字数&#xff1a;1600&#xff0c;阅读时长大约&#xff1a;10分钟 生成式AI工具可以用非常多的方式使你的日常生活更轻松。 AI聊天机器人在编程、写作等方面表现出色&#…

微软开放Bing机器人,无需等待即可访问!

整理 | 陈静琳 责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 5月5日消息&#xff0c;微软向所有用户开放了必应聊天机器人&#xff0c;宣布 Bing 现已正式进入开放预览&#xff08;Open Preview&#xff09;模式&#xff0c;任何人都可以使用。…

小威老师脚手架解析系列一

小威老师的Spring boot脚手架讲解 登录流程图

2019科学突破奖揭晓 庄小威陈志坚许晨阳上榜

来源&#xff1a;科学网 10月17日&#xff0c;科学突破奖&#xff08;Breakthrough Prize&#xff09;名单揭晓。总计2200万美元的奖金分别给了婴儿死亡主要遗传因素治疗、超分辨率成像、发现一种新型电子材料以及其他重大突破。 华裔科学家庄小威、陈志坚、C. Frank Bennett 、…

试用码云gitee上开源项目“小威架构 / boot-backend“的代码生成器遇到的坑

** 试用码云gitee上开源项目"小威架构 / boot-backend"的代码生成器遇到的坑 ** 源码地址: https://gitee.com/zhang.w/boot-backend 该项目的代码生成器,只需要项目跑起来时对应的数据库里有对应的表就可以生成Controller,DAO,Model,用的MyBatis,还生成了对应的.…

.net6 EFcore连接Msql实现反向工程

一、反向工程是在有数据库已经有表的情况下&#xff0c;生成数据库entity模型所以要下载的依赖要多一点 二、这时候输入命令 Scaffold-DbContext -Connection "DatabasehotelDb;Data Source127.0.0.1;User Idroot;PasswordWW623025;SslModenone" Pomelo.EntityFrame…

智百威收银系统服务器连接不上,收银系统进入不了收银系统怎么办 – 手机爱问...

2012-08-17 系统进不去&#xff0c;提示要按R修复怎么处 这是系统损坏了。一般原因是系统文件因突然停电及操作失误删除了系统文件&#xff0c;驱动加载出错&#xff0c;病毒修改系统文件等造成的。大多数情况下你放入系统光盘按R修复也是没有用的。单纯个把系统文件损坏的可能…

个人PC连接服务器同时上网

文章目录 操作步骤原理解释参考资料 操作步骤 用管理员权限打开cmd 上面的 网关 填写方式由连接服务器wifi后&#xff0c;使用ipconfig查看。 在下图中是192.168.31.1 之后就可以用wifi无线连接服务器&#xff0c;用有线网络正常上网了。 原理解释 route add命令的主要作用…

服务器安装Redis并远程连接

文章目录 安装远程连接修改配置文件使用命令修改密码远程连接 参考资料 安装 参考http://dblab.xmu.edu.cn/blog/1513/ 远程连接 修改配置文件 修改redis服务器的配置文件。 vim redis.conf将 bind: 127.0.0.1 修改为bind: 0.0.0.0 同时增加 protected-mode no 使用命令修…

相机标定及点云拼接

文章目录 前言一、相机标定原理二、关键代码2.1 相机标定代码12.2 相机标定代码22.3 点云拼接代码 三、结果展示总结 前言 在上一篇中已经完成了从图像到点云的转换&#xff0c;但是只针对单个相机&#xff0c;在这一篇中将再进一步&#xff0c;从两个相机拍摄图像&#xff0c…

企业微信获取corpid,Secret,Agentid

企业微信获取CORPID&#xff0c;AGENTID&#xff0c;CORPSECRET 在我们对接企业微信时&#xff0c;需要用到以上corpid&#xff0c;Secret 和 Agentid&#xff0c;这些参数的获取方式如下&#xff1a; 1、登录企业微信 https://work.weixin.qq.com/ 2、查询corpid 3、查询agen…

华为消息推送服务(HMS Agent套件)一

出处 1 注册成为开发者 步骤 1 访问华为开发者联盟网站&#xff0c;如图1-1所示。 中文&#xff1a;http://developer.huawei.com/consumer/cn 图1-1 注册入口 步骤 2 点击“注册”按钮&#xff0c;注册成为开发者 &#xff08;要实名认证&#xff0c;上传身份证和人脸…

Android项目中集成华为账号登录、支付

最近项目中集成了华为账号登录与支付的功能&#xff0c;把踩过的坑和过程记录下来。 先看下支付效果图&#xff1a; 支付价格0.01请忽略&#xff0c;因为这是为了测试用的。 刚开始接到这个项目的时候我很奇怪&#xff0c;为什么要集成华为支付呢&#xff0c;原有的微信和支付…