挑战杯 python图像检索系统设计与实现

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 python图像检索系统设计与实现

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题简介

图像检索:是从一堆图片中找到与待匹配的图像相似的图片,就是以图找图。
网络时代,随着各种社交网络的兴起,网络中图片,视频数据每天都以惊人的速度增长,逐渐形成强大的图像检索数据库。针对这些具有丰富信息的海量图片,如何有效地从巨大的图像数据库中检索出用户需要的图片,成为信息检索领域研究者感兴趣的一个研究方向。


2 图像检索介绍

给定一个包含特定实例(例如特定目标、场景、建筑等)的查询图像,图像检索旨在从数据库图像中找到包含相同实例的图像。但由于不同图像的拍摄视角、光照、或遮挡情况不同,如何设计出能应对这些类内差异的有效且高效的图像检索算法仍是一项研究难题。

在这里插入图片描述

图像检索的典型流程
首先,设法从图像中提取一个合适的图像的表示向量。其次,对这些表示向量用欧式距离或余弦距离进行最近邻搜索以找到相似的图像。最后,可以使用一些后处理技术对检索结果进行微调。可以看出,决定一个图像检索算法性能的关键在于提取的图像表示的好坏。

(1) 无监督图像检索

无监督图像检索旨在不借助其他监督信息,只利用ImageNet预训练模型作为固定的特征提取器来提取图像表示。

直觉思路
由于深度全连接特征提供了对图像内容高层级的描述,且是“天然”的向量形式,一个直觉的思路是直接提取深度全连接特征作为图像的表示向量。但是,由于全连接特征旨在进行图像分类,缺乏对图像细节的描述,该思路的检索准确率一般。

利用深度卷积特征 由于深度卷积特征具有更好的细节信息,并且可以处理任

CroW
深度卷积特征是一个分布式的表示。虽然一个神经元的响应值对判断对应区域是否包含目标用处不大,但如果多个神经元同时有很大的响应值,那么该区域很有可能包含该目标。因此,CroW把特征图沿通道方向相加,得到一张二维聚合图,并将其归一化并根号规范化的结果作为空间权重。CroW的通道权重根据特征图的稀疏性定义,其类似于自然语言处理中TF-
IDF特征中的IDF特征,用于提升不常出现但具有判别能力的特征。

Class weighted features
该方法试图结合网络的类别预测信息来使空间权重更具判别能力。具体来说,其利用CAM来获取预训练网络中对应各类别的最具代表性区域的语义信息,进而将归一化的CAM结果作为空间权重。

PWA
PWA发现,深度卷积特征的不同通道对应于目标不同部位的响应。因此,PWA选取一系列有判别能力的特征图,将其归一化之后的结果作为空间权重进行汇合,并将其结果级联起来作为最终图像表示。

在这里插入图片描述

(2) 有监督图像检索

在这里插入图片描述

有监督图像检索首先将ImageNet预训练模型在一个额外的训练数据集上进行微调,之后再从这个微调过的模型中提取图像表示。为了取得更好的效果,用于微调的训练数据集通常和要用于检索的数据集比较相似。此外,可以用候选区域网络提取图像中可能包含目标的前景区域。

孪生网络(siamese network)
和人脸识别的思路类似,使用二元或三元(+±)输入,训练模型使相似样本之间的距离尽可能小,而不相似样本之间的距离尽可能大。

3 图像检索步骤

图像检索技术主要包含几个步骤,分别为:

  • 输入图片

  • 特征提取

  • 度量学习

  • 重排序

  • 特征提取:即将图片数据进行降维,提取数据的判别性信息,一般将一张图片降维为一个向量;

  • 度量学习:一般利用度量函数,计算图片特征之间的距离,作为loss,训练特征提取网络,使得相似图片提取的特征相似,不同类的图片提取的特征差异性较大。

  • 重排序:利用数据间的流形关系,对度量结果进行重新排序,从而得到更好的检索结果。

在这里插入图片描述

4 应用实例

学长在这做了个图像检索器的demo,效果如下

工程代码:
在这里插入图片描述

关键代码:

# _*_ coding=utf-8 _*_from math import sqrt
​    import cv2
​    import time
​    import os
​    import numpy as np
​    from scipy.stats.stats import  pearsonr
​    #配置项文件import  pymysql
​    from config import *from mysql_config import *from utils import getColorVec, Bdistance
​    db = pymysql.connect(DB_addr, DB_user, DB_passwod, DB_name )def query(filename):if filename=="":fileToProcess=input("输入子文件夹中图片的文件名")else:fileToProcess=filename#fileToProcess="45.jpg"if(not os.path.exists(FOLDER+fileToProcess)):raise RuntimeError("文件不存在")start_time=time.time()img=cv2.imread(FOLDER+fileToProcess)colorVec1=getColorVec(img)#流式游标处理conn = pymysql.connect(host=DB_addr, user=DB_user, passwd=DB_passwod, db=DB_name, port=3306,charset='utf8', cursorclass = pymysql.cursors.SSCursor)leastNearRInFive=0Rlist=[]namelist=[]init_str="k"for one in range(0, MATCH_ITEM_NUM):Rlist.append(0)namelist.append(init_str)with conn.cursor() as cursor:cursor.execute("select name, featureValue from "+TABLE_NAME+" order by name")row=cursor.fetchone()count=1while row is not None:if row[0] == fileToProcess:row=cursor.fetchone()continuecolorVec2=row[1].split(',')colorVec2=list(map(eval, colorVec2))R2=pearsonr(colorVec1, colorVec2)rela=R2[0]#R2=Bdistance(colorVec1, colorVec2)#rela=R2#忽略正负性#if abs(rela)>abs(leastNearRInFive):#考虑正负if rela>leastNearRInFive:index=0for one in Rlist:if rela >one:Rlist.insert(index, rela)Rlist.pop(MATCH_ITEM_NUM)namelist.insert(index, row[0])namelist.pop(MATCH_ITEM_NUM)leastNearRInFive=Rlist[MATCH_ITEM_NUM-1]breakindex+=1count+=1row=cursor.fetchone()end_time=time.time()time_cost=end_time-start_timeprint("spend ", time_cost, ' s')for one in range(0, MATCH_ITEM_NUM):print(namelist[one]+"\t\t"+str(float(Rlist[one])))​    
​    if __name__ == '__main__':#WriteDb()#exit()
​        query("")

效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

第20讲投票帖子排行实现

后端: /*** 投票选型Controller控制器* author java1234_小锋 (公众号:java1234)* site www.java1234.vip* company 南通小锋网络科技有限公司*/ RestController RequestMapping("/voteItem") public class VoteItemCo…

【Go语言】Go项目工程管理

GO 项目工程管理(Go Modules) Go 1.11 版本开始,官方提供了 Go Modules 进行项目管理,Go 1.13开始,Go项目默认使用 Go Modules 进行项目管理。 使用 Go Modules的好处是不再需要依赖 GOPATH,可以在任意位…

Spring Boot 笔记 019 创建接口_文件上传

1.1 创建阿里OSS bucket OSS Java SDK 兼容性和示例代码_对象存储(OSS)-阿里云帮助中心 (aliyun.com) 1.2 编写工具类 package com.geji.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun…

线段树总结

线段树的定义 线段树(Segment Tree)是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速地查找某一个节点在若干条线段中出现的次数&#xff0c…

代码随想录 Leetcode406. 根据身高重建队列

题目&#xff1a; 代码(首刷看解析 2024年2月15日&#xff09;&#xff1a; class Solution { static bool cmp(const vector<int>& A, const vector<int>& B) {if(A[0] B[0]) return A[1] < B[1];return A[0] > B[0]; } public:vector<vector&…

HTML5+CSS3+JS小实例:锥形渐变彩虹按钮

实例:锥形渐变彩虹按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /…

(01)Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

pytorch tensor维度变换

目录 1. view/reshape2. squeeze/unsqueeze3. expand 扩展4. repeat5 .t转置6. transpose7. permute 1. view/reshape view(*shape) → Tensor 作用&#xff1a;类似于reshape&#xff0c;将tensor转换为指定的shape&#xff0c;原始的data不改变。返回的tensor与原始的tensor…

P1010 [NOIP1998 普及组] 幂次方题解

题目 任何一个正整数都可以用2的幂次方表示。例如137。 同时约定次方用括号来表示&#xff0c;即ab可表示为a(b)。 由此可知&#xff0c;137可表示为2(7)2(3)2(0)&#xff0c;进一步&#xff1a;72 ( 用2表示)&#xff0c;并且32。 所以137可表示为2(2(2)22(0))2(22(0))2(0…

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)

算法沉淀——队列宽度优先搜索&#xff08;BFS&#xff09; 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法&#xff08;Queue BFS&#xff09;是一种常用于图的遍历的算法&#xff0c;特别适用于求解最短路径…

【AI视野·今日CV 计算机视觉论文速览 第298期】Fri, 26 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 26 Jan 2024 Totally 71 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities Authors Yiyuan Zhang, Xiaohan …

学习笔记19:牛客寒假训练营(DFHJK)

D 数组长度为2*1e5 ,我们知道如果超过30个非&#xff08;-1&#xff0c;1&#xff09;的数字相乘一定是大于查询的值域的 所以如果超过60&#xff08;30*2&#xff09;个数字&#xff0c;那么一定不能构成查询的数&#xff0c;而如果小于60个则可以暴力预处理一下&#xff0c…