Advertisement

毕业设计:基于深度学习的图像检索系统

阅读量:

目录

前言

课题背景和意义

实现技术思路

一、算法理论基础

1.1 基于树结构的近邻检索

1.2 基于图结构的近邻检索

1.3 基于哈希的近邻检索

二、 数据集

三、实验及结果分析

3.1 实验环境搭建

3.2 模型训练

最后


前言

📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀 对毕设有任何疑问都可以问学长哦!

选题指导:

[ 最新最全计算机专业毕设选题精选推荐汇总]( "        最新最全计算机专业毕设选题精选推荐汇总")

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯基于深度学习的图像检索系统

课题背景和意义

随着数字图像的快速增长和存储技术的不断发展,图像检索系统在各个领域中变得越来越重要。传统的基于文本或手工特征的图像检索方法存在一定的局限性,无法准确地捕捉图像的语义信息。因此,基于深度学习的图像检索系统应运而生。这种系统能够通过学习大量图像数据的特征表示,实现更准确、高效的图像搜索和检索。该课题旨在探索并实现一种基于深度学习的图像检索系统,为用户提供准确、快速的图像检索体验,并在图像处理和人工智能领域中具有重要的应用价值。

实现技术思路

一、算法理论基础

1.1 基于树结构的近邻检索

近似近邻检索是针对高维数据的检索问题提出的一种方法,它通过放松对检索结果精度的要求,以加快检索速度为目标。基于树结构的算法是一种常用的近似近邻检索方法,它通过将数据集划分为多个区域,并使用树形结构进行快速搜索。Kd-tree是一种基于树结构的算法,它在建树阶段通过选择切分维度和切分点来构建二叉树,然后在查询阶段通过比较查询数据与树节点的值,逐步遍历树结构以找到近似的近邻数据。为了提高基于树的方法在高维空间中的检索效果,可以采用一些回溯的方法来提高召回率。这些方法可以在搜索过程中进行回溯,遍历更多的节点以发现可能的近邻数据。此外,还可以结合其他技术和算法,如局部敏感哈希(LSH)和深度学习特征表示,来改善高维空间中的近似近邻检索结果。
毕业设计:基于深度学习的图像检索系统

Ball-tree是一种近似近邻检索算法,其原理与Kd-tree类似。在Ball-tree算法中,首先选择任意一个节点作为根节点,并将其他节点分配给它,形成一个最小覆盖的超球体。然后计算超球体的质心坐标和半径,并作为根节点。接下来选择距离根节点最远的节点作为左区域点,以及超球体中距离左区域点最远的节点作为右区域点,将其他节点根据距离分配给左右区域节点,形成两个较小的超球体。同样地,计算这两个超球体的质心坐标和半径,并作为根节点的左右节点。按照这种规则递归处理,直到达到某个阈值,最终构建一棵二叉树。
毕业设计:基于深度学习的图像检索系统

近似近邻检索算法是K-means树,在FLANN中提到了K-means层次树算法。该算法利用K-means聚类将数据点划分为k个不同的区域,并对每个区域递归地应用相同的方法。当区域内的点数少于特定值时,停止递归,并将这些点作为叶子节点。这样构建的K-means树可以看作是一棵k叉树。通过K-means层次树进行检索时,当遍历到某个父节点时,首先选择子节点中距离查询节点最近的节点,并优先遍历该子节点。通过这种方法对树进行剪枝,可以显著提高检索效率。Ball-tree和K-means树都是针对近似近邻检索问题的算法。Ball-tree通过球状区域的划分减少了无效的相交,而K-means树利用K-means聚类将数据点划分为不同的区域,通过剪枝提高了检索效率。
毕业设计:基于深度学习的图像检索系统

1.2 基于图结构的近邻检索

NSW是一种基于小世界结构的近邻图。NSW图的构建原理相对简单。在构建过程中,通过朴素查找法找到与当前插入点最近的k个点,并将这k个点与新插入的点连接起来。重复这个过程,直到所有数据点都插入到图中。NSW的构建是一个自底向上的过程,随着越来越多的节点被插入图中,之前的短距离连接会逐渐演变为长距离连接,形成所谓的"高速公路"机制。这意味着在进行检索时,可以通过这些长距离连接来避免一些绕路的过程,减少近邻点的计算次数,从而加快检索速度。

NSW图的构建过程中,通过建立长距离连接,可以在图中形成一条或多条"高速公路",这些"高速公路"可以被利用来加速检索过程。在图中的例子中,红色路线表示"高速公路",在构建NSW图时,通过这些"高速公路"可以减少一部分检索过程。
毕业设计:基于深度学习的图像检索系统

HNSW是在NSW图的基础上进行改进的一种图结构。它通过对NSW图进行分层索引来进行优化。主要思路是根据边的长度进行划分,以约束每个点的平均连接数。这种结构类似于跳表和单链表之间的关系。在HNSW中,图被分为多个层级,每个层级都是一个NSW图。最底层是最普通的有序单链表结构(layer0),上一层中的点被平均分成两个部分,形成二层的有序单链表,依此类推,直到最上层的索引只包含两个单链。在检索时,采用二分查找的方式,从最上层开始,根据目标点与当前单链内的数据大小进行比较,选择当前层中最接近目标点的单链,然后跳转到下一层索引进行相同的操作,如此循环直至最底层。最后返回的单链即为目标的近邻。
毕业设计:基于深度学习的图像检索系统

HNSW利用多层图的优势,天然地保证了图的连通性。由于每个新节点都会随机分配到任意一层中,这在一定程度上避免了数据输入顺序改变图分布从而影响搜索路径的情况。检索过程采用了启发式贪婪与二分查找相结合的方式,搜索复杂度仅为O(log n),大大降低了检索时间,具有明显的速度优势。然而,划分的索引层随着节点数量的增加而增加,占用的内存空间较高,因此HNSW是一种以空间换时间的方法。
毕业设计:基于深度学习的图像检索系统

NSG通过改进图的连通性、减少出度、缩短搜索路径和缩减图的大小来提高检索性能。它使用预先建立的k近邻图作为基准,并采用特定的择边策略选择合适的边连接节点。NSG通过近似构建德劳内图来构建近似的k近邻图,并选择近似中心作为导航节点,以保证遍历过程高效。同时,它强制保证每个节点都有一条直接的边连接到其近邻节点,解决绕路问题。通过这些改进,NSG能够有效地减少无效搜索,提高检索性能,并在构建索引时考虑了图的连通性和规模的优化。
毕业设计:基于深度学习的图像检索系统

1.3 基于哈希的近邻检索

局部敏感哈希(LSH)是一种基于哈希的近似近邻算法,用于在高维空间中进行快速检索。LSH的核心思想是将数据点通过哈希函数映射到低维空间,使得相似的数据点在低维空间中有较高的概率被映射到同一个哈希桶中。这样,可以通过比较目标节点与哈希桶的汉明距离来快速定位近邻区域,并在该区域中进一步寻找近似点集。LSH的过程包括设计哈希函数、生成哈希码并索引数据以及在线查询。LSH算法的优点在于可以得到近似的结果,适用于不需要非常高精确度的场景。通过使用LSH,可以在高维空间中加速近似近邻搜索,提高检索效率。
毕业设计:基于深度学习的图像检索系统

谱哈希与局部敏感哈希类似,但基于数据的分布特点进行建模。谱哈希将编码过程转化为求解拉普拉斯矩阵的特征值分解问题。其求解过程包括以下步骤:首先构建一个k近邻图,其中每个顶点表示一个数据点,与其k个最相似的数据点相连,边的权重由数据点之间的相似度确定;然后通过邻接矩阵计算拉普拉斯矩阵,并求解其特征值和特征向量(即图分割算法);最后选择前几个最小特征值对应的特征向量,并对其进行二值化以得到哈希编码。谱哈希通过对数据的分布特点进行建模,能够在保持原始空间向量相似性的条件下进行哈希编码,从而实现高维数据的快速近似近邻检索。

乘积量化是一种经典的矢量量化索引方法,用于降低高维数据的维度并进行快速检索。该方法通过分段和聚类的方式来保留数据之间的相对距离信息。具体步骤包括将数据划分为多个子空间,每个子空间使用K-Means聚类算法得到K个码字。这样,乘积量化可以生成MK个聚类中心,形成一个包含大量码字的码本。在查询时,通过计算查询向量与每个子空间中聚类中心的距离,并排序后得到最终结果。乘积量化方法具有较高的效率和可扩展性,在工业界的向量索引应用中得到广泛应用。乘积量化还有两种优化算法,包括旋转乘积量化(OPQ)和局部旋转乘积量化(LOPQ),它们在乘积量化的基础上引入旋转矩阵来进一步优化量化效果。

二、 数据集

由于网络上没有现有的合适的数据集,我决定自己进行网络爬取,收集图片并制作了一个全新的数据集。这个数据集包含了各种图像检索场景的照片,其中包括不同类别的物体、场景和人物等。通过网络爬取,我能够获取大量真实且多样化的图像数据,这将为我的研究提供更准确、可靠的数据。

三、实验及结果分析

3.1 实验环境搭建

实验时,使用了一台配置如下的服务器进行执行:该服务器配备了AMD EPYC 7K62 48-Core处理器,主频为2.5GHz,并且具有128GB的内存。服务器使用的操作系统是CentOS Linux release 8.4.2105(64位)。

3.2 模型训练

基于图的近似近邻检索方法通常通过裁剪完整图或k近邻图中的近邻边来构建图结构。不同的选边策略会导致不同性质的图索引。目前,基于Navigating Spreading-out Graph(NSG)图的方法是表现最优秀的算法之一。然而,由于NSG的结构性质,这些方法仍然存在一些缺陷。具体而言,在进行库内数据检索时,这些算法表现出色,但在非库内数据检索时表现较差。当从节点p出发,分别检索数据库上的节点和非数据库上的节点q时,会得到两条不同的路径。
毕业设计:基于深度学习的图像检索系统

SSG图通过角度来过滤k近邻图中的边,使得边与边之间按照一定的角度均匀分布在邻域的各个方向上。相对于NSG,SSG具有更短的平均搜索路径。此外,SSG图的出度(即边的数量),也可以通过控制角度来调节,以适应不同的高维数据分布。在合理选择参数的情况下,SSG可以保证在库内和非库内数据检索时都采用全局最优的搜索路径。
毕业设计:基于深度学习的图像检索系统

为了评估不同近似最近邻搜索算法的性能,采用了每秒查询数量和查准率作为评判标准。每秒查询数量是衡量算法搜索效率的指标,表示在单位时间内算法能够处理的查询数量。较高的qps值意味着算法能够更快地响应查询请求,具有更高的搜索效率。查准率是衡量算法搜索准确性的指标,表示算法返回的近似最近邻结果中与实际最近邻的重合度。较高的查准率意味着算法返回的结果更接近实际最近邻,具有更好的搜索准确性。

相关代码示例:

复制代码
 import numpy as np

    
 from sklearn.neighbors import NearestNeighbors
    
  
    
 def construct_ssg_graph(data, k, angle_threshold):
    
     n = data.shape[0]
    
     ssg_graph = [[] for _ in range(n)]  # 初始化SSG图的邻接表
    
  
    
     # 构建k近邻图
    
     nbrs = NearestNeighbors(n_neighbors=k+1, algorithm='ball_tree').fit(data)
    
     knn_graph = nbrs.kneighbors_graph(data).toarray()
    
  
    
     # 遍历每个节点
    
     for i in range(n):
    
     node_angles = []
    
     node_neighbors = []
    
     
    
     # 计算节点i与其邻居节点的角度
    
     for j in range(n):
    
         if knn_graph[i][j] == 1:  # 节点j是节点i的邻居
    
             vector_ij = data[j] - data[i]
    
             node_angles.append(np.arctan2(vector_ij[1], vector_ij[0]))  # 计算角度
    
             node_neighbors.append(j)
    
     
    
     # 根据角度阈值过滤边
    
     sorted_indices = np.argsort(node_angles)
    
     prev_angle = node_angles[sorted_indices[-1]]  # 最后一个角度
    
     prev_index = sorted_indices[-1]  # 最后一个角度对应的邻居索引
    
     
    
     for j in range(len(sorted_indices)):
    
         curr_angle = node_angles[sorted_indices[j]]
    
         curr_index = sorted_indices[j]
    
         
    
         if np.abs(curr_angle - prev_angle) <= angle_threshold:
    
             ssg_graph[i].append(node_neighbors[curr_index])
    
         
    
         prev_angle = curr_angle
    
         prev_index = curr_index
    
     
    
     return ssg_graph
    
    
    
    
    AI写代码

海浪学长项目示例:


最后

我是海浪学长,创作不易,欢迎点赞、关注、收藏。

毕设帮助,疑难解答,欢迎打扰!

全部评论 (0)

还没有任何评论哟~