基于内容的图像web检索系统

题目:基于内容的图像在线检索系统

简介:基于内容的图像在线检索系统(Content Based  Online Image Retrieval , 以下简称 CBOIR),是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统,允许用户在线输入一张图像,在远程图像数据库中查找具有相同或相似内容的其它图片。
要求:本实训完成的系统要求实现基于视觉特征的在线图像检索。
该项目的实训内容主要包括:
1. 搭建一个Web系统,实现图像文件的在线提交、存储和检索结果展示。 
2.系统调用基于特征工程方法的算法进程,算法能够利用颜色特征、纹理特征、形状特征及HOG\LBP\HARR等全局和局部特征实时从图像库中检索出和输入图像相同或相似的图像,结合机器学习的方法,计算图像相似度或直接进行图像类别分类,将结果显示在系统中。 
3.系统调用基于深度学习方法的算法进程,通过搭建深度学习的网络对相似图像进行检索和分类,将结果显示在系统中。
4. 对于以上两类方法,各组(2-3人)分工完成,在线展示方法的横向和纵向比较,要求有丰富的实验设计和实验结果分析。

由于想挑战自己,故本次任务由本人独立完成,故可能有考虑不周的地方。

摘要

基于内容的图像在线检索系统(CBOIR)是一种用于大规模数字图像内容检索的研究分支。本实训旨在实现基于视觉特征的图像检索 Web 平台,要求实现的功能包括基于颜色信息、纹理特征、形状特征的图像检索。本文在以上全局特征、浮点特征的基础上,还使用了深度学习实现图像检索,并对检索方式进行拓广,实现了基于KDTree的数据结构进行高效查找,并对多种特征工程结果进行对比分析、不同神经网络之间的对比分析、特征工程和深度学习方式的结果进行对比分析。此外,系统还能在 Web 平台上进行图像展示。

关键词:CBOIR;颜色;纹理;形状;深度学习;KDTree;web

Abstract

Content Based Online Image Retrieval(CBIR) Web system is a research branch in the field of computer vision that focuses on large-scale digital image content retrieval. The objective of this project is to develop a web platform for image retrieval based on visual features. Specifically, the system aims to support image retrieval based on color information, texture features, and shape features. In addition to the aforementioned global and floating-point features, this paper also incorporates deep learning techniques for image retrieval. The retrieval methods are extended to include efficient search using a KD-Tree data structure. Comparative analysis is performed on the results of various feature engineering techniques, comparison between different neural networks, and the comparison of results between feature engineering and deep learning approaches. Moreover, the system provides image display functionality on the web platform.

Keywords: CBIR, color, texture, shape, deep learning, KD-Tree, web

实训目的与内容

基于内容的图像检索 Web 系统(Content Based Image Retrieval, 以下简称 CBIR),是计算视觉领域中关注大规模数字图像内容检索的研究分支。典型的 CBIR 系统,允许用户输入一张图像, 在图像数据库(或本地机、或网络)中查找具有相同或相似内容的其它图片。本实训的基本功能要求是实现基于视觉特征的图像检索 Web 平台。

具体包括:

  1. 实现基于颜色信息的图像检索,可通过颜色直方图、颜色矩、颜色一致性矢量等方法来实现。
  2. 实现基于纹理特征的图像检索,可从四个方面进行:统计法、结构法、模型法、频谱 法。
  3. 实现基于形状特征的图像检索,可分别从图像的边缘信息和区域信息来实现。
  4. 实现基于综合信息的图像检索。
  5. 实现在 Web 平台上的展示。

 图像检索系统工作流程

  1. 获取数据集:首先需要准备一个包含大量图像的数据集作为检索的目标。可以来源于本地机器存储、网络图像库或者其他数据源。这些图像应该具有多样性并覆盖不同的内容和领域。本次实训我采用的是老师指定的 The CIFAR-10 dataset 数据集,
  2. 特征提取:对于每张图像,需要从中提取相关的视觉特征。常见的特征包括颜色、纹理、形状等。特征提取方法可以根据具体需求选择,我使用的是颜色矩、基于几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算得到的Hu不变矩、灰度共生矩阵等。提取到的特征会被用于后续的相似度计算和检索。
  3. 图像输入:用户通过系统的web界面将一张图像作为检索输入提交给系统。这张图像将作为查询图像,去寻找数据库中与之相似的图像。与此同时,把该图像保存到后端指定文件夹中保存起来。
  4. 相似度计算:系统将查询图像的特征与数据库中的图像特征进行相似度计算。常见的相似度计算方法包括欧氏距离、余弦相似度等。本文采用的是基于KDTree数据结构的搜索算法,实现了对数级时间复杂度内完成任务。根据指定特征的相似度计算结果,将数据库中与查询图像最相似的图像按照相似度排序。
  5. 搜索结果展示:最后,系统将相似度排名靠前的图像作为检索结果显示给用户。这里我们指定显示给前端12个最相似的图片。

图像检索系统框架

  1. 用户界面:提供用户与系统交互的界面,允许用户输入图像、选择搜索方式、浏览检索结果等。
  2. 特征提取模块:负责从输入图像中提取视觉特征。基于颜色信息的特征提取可以使用颜色直方图、颜色矩、颜色一致性矢量等方法,本实验使用的是基于颜色矩的方法;基于纹理特征的提取可以从统计法、结构法、模型法、频谱法等方面进行,本实验用的是基于Hu不变矩的方法;基于形状特征的提取可以从边缘信息、区域信息来实现,本实验使用的是基于灰度共生矩阵的方法。
  3. 相似度计算模块:根据提取的特征计算输入图像与数据库中图像的相似度。不同的相似度计算方法适用于不同类型的特征。常用的方法包括欧氏距离、余弦相似度等。为了提高搜索效率,本实验采用了KDTree数据结构,能实现对数级搜索。
  4. 数据库管理模块:用于管理图像数据库,包括图像的存储、索引和检索操作。数据库可以采用关系型数据库或者基于文件系统的存储方式。本实验两种数据都进行了保存和使用。
  5. 结果呈现模块:将相似度排名靠前的图像以合适的形式展示给用户,本实验指定能在搜索结果界面展示12张最相似的图像。

  • 数据集获取和预处理

2.核心算法描述

  1. 通过处理CIFAR-10数据集的图像数据,并将其保存为JPEG格式的图像文件。代码从数据集中读取图像数据,对每个图像进行处理(还原RGB通道)和保存,以便后续的图像处理和分析。
  2. 根据指定的文件夹和类别名称,获取图像文件的路径,然后将这些路径保存到文本文件中。代码通过遍历文件夹和子文件夹中的文件,获取图像文件的绝对路径,并将路径中的指定前缀去除,生成相对路径,最后将相对路径保存至文件中。这样可以方便后续的路径处理和数据读取操作。
  3. 将从颜色、纹理、形状、深度学习方法中处理获得的特征分别保存在不同的数据库和对应的txt文件中,一式两份,便于后续检索工作。

2.数据存储方式

文件名

存储内容

存储方式

path.txt

图像位置

相对路径

colorjuData.txt

颜色特征

图像路径颜色特征

greymatrixData.txt

纹理特征

图像路径纹理特征

ShapeNchangeData.txt

形状特征

图像路径形状特征

VGGData.txt

深度学习特征

图像路径深度学习特征

2.数据库设计

本次实验有mysql和txt文件两种保存形式。

颜色特征表

颜色特征表Color保存的是数据集图像的颜色特征信息,即图像的一阶矩(均值)、二阶矩(标准差)和三阶矩(斜度)。

纹理特征表

纹理特征表Texture保存的是归一化后的灰度共生矩阵计算得到每个方向上的特征值的平均值和标准差。

形状特征表

形状特征表Shape保存的是 Hu 不变矩特征。

VGG特征表

VGG特征表保存在了txt文件中,保存的是神经网络的倒数第二层全连接层的特征值,一共512维,属于高维特征。文件总大小为132.2MB

章 基于颜色信息的图像检索

3.1 核心算法描述

该算法通过将图像转换到HSI(色调、饱和度、亮度)颜色空间,并计算图像的一阶矩(均值)、二阶矩(标准差)和三阶矩(斜度)。颜色矩表征了图像颜色分布的集中程度和对比度。这些特征可用于图像分类、检索和分析。

3.2 系统架构说明

该算法在图像检索系统中的作用主要是提取图像颜色特征。这些特征可用于描述图像的整体颜色分布。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。

该算法实现了两个核心函数:rgb_to_hsi和color_moments。

rgb_to_hsi函数:

该函数实现了将RGB图像转换为HSI(色相、饱和度、亮度)色彩空间的转换。函数接收一个RGB图像作为输入,并返回转换后的HSI图像。

具体流程:

  • 从RGB图像中分离出R、G和B通道。
  • 根据HSI转换的公式,计算色相(H):根据R、G和B通道计算色相的角度值。
  • 计算饱和度(S):通过计算将最小值和最大值提取为图像的最小色彩饱和度。
  • 计算亮度(I):通过将R、G和B通道的平均值计算为亮度。
  • 将计算得到的H、S和I通道重新组合为HSI图像并返回。

color_moments函数:

该函数实现了计算图像的颜色矩特征。函数接收一个图像文件路径作为输入,并返回一个包含颜色矩特征的列表。

具体流程:

  • 读取图像文件并检查是否读取成功。
  • 调用rgb_to_hsi函数将读取的图像转换为HSI色彩空间。
  • 将HSI图像拆分为H、S和I三个通道。
  • 计算一阶矩(均值):分别计算H、S和I通道的均值,并将其存储到特征列表中。
  • 计算二阶矩(标准差):分别计算H、S和I通道的标准差,并将其存储到特征列表中。
  • 计算三阶矩(斜度):使用绝对值和平均值计算H、S和I通道的斜度,然后将其存储到特征列表中。
  • 返回计算得到的颜色矩特征列表。

3.3 实验结果及分析

  1. 实验结果比较理想。颜色主体没有太大出入。物体或背景颜色均为白色。
  2. 该方法对图像进行了色彩空间转换,从RGB转换到HSI,以提取更具有意义和区分性的颜色特征。通过计算均值、标准差和斜度来捕捉图像的颜色信息。颜色矩特征计算过程相对简单,计算量较小,适用于快速获取图像颜色特征的场景。

优点:

  • 算法使用了HSI颜色空间转换,有效地将RGB图像的颜色信息转换为更具意义的色调、饱和度和亮度信息,提取了更具描述性的颜色特征。
  • 使用NumPy和OpenCV等高效的库和函数,对图像进行处理和计算,提高了算法的执行效率。

缺点:

目前的特征提取过程相对简单,没有考虑不同颜色通道的权重和相关性,可能导致提取的特征不够准确和区分度不够。

章 基于纹理信息的图像检索

4.1 核心算法描述

该方法使用灰度共生矩阵(GLCM)来描述图像的纹理特征。GLCM能够捕捉像素之间的空间关系和灰度级的分布情况,用于描述图像的纹理信息。通过计算GLCM的特征值,如对比度(Con)、能量(Asm)、熵(Eng)和逆差矩(Idm),可以反映图像的纹理特征及其统计属性。提取的纹理特征包括四个方向的特征值,对应0度、45度、90度和135度的灰度共生矩阵。根据归一化后的灰度共生矩阵计算得到每个方向上的特征值的平均值和标准差,并将其作为纹理特征向量。

4.2 系统架构说明

该算法在图像检索系统中的作用主要是提取图像纹理特征。以函数的方式实现了纹理特征的提取。它可以作为图像检索系统中的一个模块,用于提取图像的纹理特征。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。

该算法中实现了两个核心算法函数:feature_computer和glcm。

feature_computer函数:

该函数用于计算给定灰度共生矩阵的四个特征值:对比度(Con)、能量(Asm)、熵(Eng)和逆差矩(Idm)。

具体流程为:

  • 使用两个循环遍历每个灰度级,用于计算每个特征的数值。
  • 对比度:根据公式 (i - j) * (i - j) * p[i][j] 计算对比度的累加和。
  • 能量:根据公式 p[i][j] * p[i][j] 计算能量的累加和。
  • 熵:根据公式 p[i][j] * log(p[i][j]) 计算熵的累加和(注意添加 - 号)。
  • 逆差矩:根据公式 p[i][j] / (1 + (i - j) * (i - j)) 计算逆差矩的累加和。
  • 返回计算得到的四个特征值。

glcm函数:

该函数用于计算给定灰度图像的归一化灰度共生矩阵。

具体流程为:

  • 获取灰度图像的最大灰度级,并确定图像的高度和宽度。
  • 将图像的数据类型转换为 float64 类型,避免数据失真。
  • 通过乘法运算使得图像的灰度级数目限制在 gray_level - 1 范围内。
  • 创建一个大小为 gray_level × gray_level 的零矩阵。
  • 使用两个嵌套循环计算灰度共生矩阵的值,根据给定的偏移量 (d_x, d_y) 更新对应的像素对位置上的计数。
  • 根据偏移量的比较,对灰度共生矩阵进行归一化,得到一个0-1范围内的归一化灰度共生矩阵。
  • 返回计算得到的归一化灰度共生矩阵。

extract_texture_feature函数:

该函数用于提取给定图像的纹理特征,并返回特征向量。

具体流程为:

  • 读取图像,并将其转换为灰度图像。
  • 使用不同的偏移量参数,调用glcm函数计算四个方向(0度、45度、90度和135度)的归一化灰度共生矩阵。
  • 分别调用feature_computer函数计算四个方向上灰度共生矩阵的特征值。
  • 计算每个特征值的平均值和标准差。
  • 将平均值和标准差组成两个特征向量,并将它们连接起来。
  • 返回包含纹理特征的特征向量。

4.3 实验结果及分析

该实验结果效果良好,搜索出来的图片纹理具有很高的相似性。

优点

  • 该算法通过计算灰度共生矩阵(GLCM)以及相关的纹理特征,能够描述图像的纹理信息,对不同纹理类型的图像具有一定的区分能力。
  • 算法简单直观,实现相对容易,计算效率较高。
  • 纹理特征是图像的本质属性之一,这种算法可以用于纹理分析、图像检索和分类等任务。

缺点:

只使用了一个固定的灰度级数,可能无法充分表达不同图像数据集中的灰度范围和纹理细节。可使用可变的灰度级数,根据图像数据集的灰度范围和纹理细节进行自适应的灰度级数设置,以提高纹理特征的表达能力。但是因为时间原因暂时无法实现。

章 基于形状信息的图像检索

5.1 核心算法描述

该函数使用 OpenCV 提供的函数计算图像的形状特征,特别是 Hu 不变矩。Hu 不变矩是一种通过对图像的几何、中心和归一化矩进行计算得到的形状特征,具有旋转、缩放和平移不变性。通过对计算得到的 Hu 不变矩进行对数转换,将其范围映射到可比较的区间。返回以 10 为底的对数化的 Hu 不变矩列表。

5.2 系统架构说明

该算法在图像检索系统中的作用主要是提取图像形状特征。以函数的方式实现了形状特征的提取。可以将该函数作为图像处理系统中的一个模块,用于提取图像的形状特征。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。

该算法实现了一个核心函数 extract_shape_features,用于提取给定图像的形状特征。

extract_shape_features函数:

该函数使用 OpenCV 提供的函数计算给定灰度图像的形状特征。

具体流程如下:

  • 加载图像文件,并将其转换为灰度图像。
  • 使用 cv2.moments 函数计算图像的几何矩和中心矩。
  • 返回的 moments 是一个字典,包括三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)。
  • 使用 cv2.HuMoments 函数基于计算得到的几何矩、中心矩和归一化的矩,计算得到 Hu 不变矩。
  • Hu 不变矩是一系列用于图像形状描述的特征,具有旋转、缩放和平移不变性。
  • 将计算得到的 Hu 不变矩进行对数转换,以 10 为底。
  • 对数转换的目的是将不变矩的值调整到一个可比较的范围,一般为负值,通过加负号将其变为正值。
  • 将转换后的 Hu 不变矩存储到列表 m 中,并返回该列表。

5.3 实验结果及分析

该实验结果虽然种类不是同一个,但是他们都有共同的形状特征,用肉眼看,就是形状都具有一定程度的锥形。计算机能比人类具有更加复杂的形状识别系统,因而实验结果不是同一种类也是可以理解的。

优点:

  • 使用灰度图像进行处理,可以减少计算量,并且大多数图像处理算法在灰度图像上效果更好。使用了OpenCV库,该库提供了许多用于计算图像特征的函数和工具。使用了NumPy库,可以方便地对数组进行处理和操作。

缺点:

算法只使用了Hu不变矩作为形状特征,可能无法捕捉到图像的其他重要特征信息。

章 基于深度学习的图像检索

6.1 核心算法描述

该算法的核心思想是使用预训练的VGG16模型提取图像的特征。通过加载图像、调整图像尺寸和预处理等操作,将图像数据转换为适合VGG16模型输入的格式。然后,使用VGG16模型对处理后的图像进行预测,得到图像的特征向量。最后,对特征向量进行归一化处理,以使得特征向量具有可比性和稳定性。这样,我们可以利用这些特征向量进行图像检索、分类或其他相关任务。

引入库和模块:

代码开始处引入了所需的库和模块,包括 keras.utils.image_utils 和 keras.applications.vgg16.VGG16 。这些库和模块提供了图像处理和深度学习模型的功能。

定义VGGNet类:

  • VGGNet类是整个系统的核心,用于封装VGG16模型以及图像特征的提取过程。
  • 构造函数 __init__ 初始化了一些参数,包括输入图像形状、权重(预训练模型的权重)、池化方法和模型本身(使用VGG16模型)。
  • 方法 extract_feat 用于提取图像的特征。它接收一个图像路径作为输入,并输出归一化后的特征向量。

   

extract_feat提取特征过程:

  • 加载图像:使用 image_utils 库加载指定路径的图像,并将其调整为预定义的输入图像形状。
  • 图像转换:将加载的图像转换为数组形式,并通过 np.expand_dims 函数增加一个维度,将其变成一个四维数组。
  • 图像预处理:使用 preprocess_input 函数对图像数据进行预处理,以便适应VGG16模型的输入要求。
  • 特征提取:通过 self.model.predict 方法对预处理后的图像进行预测,得到图像的特征向量。
  • 归一化处理:对特征向量进行归一化处理,将其除以其自身的L2范数,以确保特征向量具有统一的尺度和可比性。
  • 返回特征向量:返回归一化后的特征向量作为结果。

主程序运行:

  • 在主程序中,创建了一个VGGNet的实例对象 model 。
  • 调用 model 的 extract_feat 方法,传入一个图像路径作为参数,对图像进行特征提取。
  • 最后,将提取到的特征向量打印输出。

该算法实现了一个 VGG16 特征提取器,通过调用预训练的 VGG16 模型和对图像进行预处理,提取图像的特征向量。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。

6.2 系统架构说明

整体系统架构可以分为几个模块:图像加载与预处理模块、特征提取模块、特征归一化模块。

图像加载与预处理模块负责将指定路径的图像加载到内存中,并进行必要的调整和预处理以适应VGG16模型的输入要求。

特征提取模块利用预训练的VGG16模型对预处理过的图像进行特征提取,得到原始的特征向量。

特征归一化模块对特征向量进行归一化处理,以确保特征向量具有统一的尺度和可比性。

该系统采用了面向对象的方式封装了特征提取过程,使得代码更加模块化和可复用。通过调用VGGNet类的方法,可以方便地提取图像的特征向量,并且可以根据实际需求对特征提取过程进行改进和优化。

6.3 实验结果及分析

  1. 通过对一组图像进行特征提取,并观察提取到的特征向量的性质和分布情况,可以分析其在特征空间中的可辨识能力和表达能力。可以观察不同类别图像的特征向量之间的相似性和差异性,以及同一类图像的特征向量的紧凑性和一致性。从实验结果来看,深度学习算法综合了颜色、形状、纹理多种特征,从肉眼观察,深度学习的检索结果更符合人类所期待的检索结果,总体效果要比特征工程好很多。
  2. 与传统的特征工程方法相比,利用预训练的VGG16模型进行特征提取通常具有更高的表达能力、更全面的特征捕捉和更好的泛化能力。然而,它也面临迁移性限制、计算复杂度和数据量要求等一些劣势。根据具体问题和场景的需求,可以综合考虑使用传统特征工程方法和深度学习模型进行特征提取,或对现有模型进行进一步优化和调整,以获得更好的特征表示和任务性能。

优点:

  • VGG16模型通过在大规模图像数据集上进行训练,自动学习到了一组有效的特征表示,具有较强的表达能力和泛化能力。这使得算法在不同的图像任务和数据集上都能取得较好的效果,无需手动设计和选择特征。因而很适合应用在该工程中。
  • VGG16模型是一个深度卷积神经网络,拥有多个卷积层和全连接层。这使得它能够在多个抽象级别上提取图像的特征,从低级视觉特征(边缘、纹理)到高级语义特征(形状、物体),更全面地捕捉图像的信息。
  • VGG16模型是在大规模图像数据集上进行了预训练的。这意味着模型经过了大量的图像样本的训练和优化,对各种图像特征具有较强的识别能力,尤其擅长处理自然图像。

缺点:

  • VGG16模型在预训练过程中的目标任务和实际应用场景的任务可能存在一定差异。因此,直接使用VGG16模型的特征可能无法完全符合当前需求,需要进行微调或重新训练以适应具体任务。
  • VGG16模型具有大量的参数和复杂的网络结构,因此在计算方面要求更高的计算资源和时间,尤其是在对大量图像进行特征提取时可能需要较长的时间和更高的硬件要求。
  • VGG16模型的预训练是基于大规模数据集的,而且模型对分类任务进行了训练。如果数据集的规模较小,或者应用场景与预训练任务差异较大,可能导致特征提取效果下降。

第七章 基于KDTree的检索算法

7.1 核心算法描述

KD-Tree 是一种用于高效搜索 k 近邻点的数据结构,它在查找最近邻点时比传统的搜索方法(如线性搜索)具有一些优势。它一种用于存储 k 维空间中点的数据结构,其中 k 表示维度的数量。该数据结构通过将空间分割为垂直于坐标轴的超平面来组织点的集合。其中,根节点代表整个空间,子节点代表特定的子空间,直到叶子节点表示一个单独的数据点。

KD-Tree 通过将数据点进行空间划分,利用树结构减少搜索范围,快速找到给定点的最近邻点。通过递归的方式在树上进行搜索,并根据距离进行排序和剪枝,使得算法能够高效地找到最近的k个节点。

7.2 系统架构说明

KDNode 类

该类表示 KD-Tree 中的一个节点。

具体流程如下:

  • data: 节点的值,存储为列表。
  • left: 左子节点。
  • right: 右子节点。
  • axis: 节点所在的切分维度。
  • sel_axis: 下一次切分维度的选择函数。
  • dimensions: 数据点的维度数量。

create 函数

该函数根据给定的点列表创建一个 KD-Tree。

具体流程如下:

  • 如果输入的点列表为空,则返回 None。
  • 根据当前的切分维度对点列表进行排序。
  • 找到中间位置的点作为当前节点的值。
  • 递归地使用左侧子列表创建左子节点。
  • 递归地使用右侧子列表创建右子节点。
  • 返回创建的 KDNode,并设置相应的属性。

search_knn 函数

该函数用于寻找离给定点最近的 k 个节点,并返回以元组 (node, distance) 的形式表示的结果列表。

具体流程如下:

  • 如果未提供距离函数,则默认使用欧氏距离。
  • 创建一个堆来存储最近的 k 个节点,并以距离的负值作为排序依据,这样可以使堆中最大的距离位于堆顶。
  • 调用 search_node 方法进行节点的搜索,搜索过程会更新堆中的节点。
  • 最后按照距离从大到小排序堆,并返回结果。

search_node 函数

该函数用于在 KD-Tree 中递归搜索与给定点最近的 k 个节点。

具体流程如下:

  • 如果当前节点为空,则直接返回。
  • 计算当前节点与给定点之间的距离。
  • 将当前节点及其距离封装为元组,然后将该元组插入结果列表中。
  • 如果结果列表已满且当前节点的距离大于堆中最大距离,则直接返回,不再深入搜索。
  • 获取当前切分维度的切分平面位置。
  • 根据给定点与切分平面的关系,决定进入左子节点还是右子节点进行递归搜索。
  • 检查另一个子节点与当前堆中节点的距离,决定是否进入另一个子节点进行递归搜索。

compute_similarity 函数

该函数用于计算两个向量之间的余弦相似度。

7.3 实验结果及分析

  1. 根据实验搜索过程,即用户体验,KD-Tree比传统余弦相似度算法的搜索速度要快很多。
  2. 在实际应用中,KD-Tree 可以用于许多搜索任务,如最近邻搜索、范围搜索等。通过对数据进行适当的组织和分割,KD-Tree 可以更高效地找到与给定点最接近的 k 个邻居。
  3. 可以优化改进的地方:
  • 根据应用场景和数据分布的特点,可以尝试使用其他的切分策略和维度选择函数,以优化 KD-Tree 的构建和搜索过程。
  • 可以探索并实现更高级的近似最近邻搜索算法,如 Locality Sensitive Hashing (LSH) 等,以更高效地处理高维数据集的近似最近邻搜索问题。
  • 对于计算相似度的函数,可以选择其他适当的相似度度量方法,比如欧氏距离、余弦相似度等,或根据数据属性设计自定义的相似度度量方法。
  • 还可以考虑使用其他的数据结构和算法来进行数据索引、搜索和匹配,如线性搜索、倒排索引、哈希表等。

第八章 web系统展示​​​​​​​

8.技术栈

系统

技术栈

前端

HTMLCSSJavascript

后端

pythonflask web框架opencvkeras、pymysql

数据库

mysql 8.0.33

操作系统

macOS Ventura 13.4.1

8.功能介绍

  • 搜索界面为上传图像文件、基于图像颜色搜索、基于图像形状特征、基于图像纹理特征、基于深度学习搜索五个按钮,当用户点击选取文件后,可以从本地选取照片上传到后端服务器并保存在指定文件夹“static/images”下。然后从四个检索方法中选择一种,便可以完成指定搜索任务。按钮增加了悬停效果,在一定程度上优化了交互体验,
  • 当点击检索按钮后,跳转到搜索结果界面。
  • 考虑到优化用户的交互性,在搜索结果界面下方设置了返回按钮,用户点击返回按钮后可以再次跳转到搜索界面,选择其他检索方法或者重新上传图像。

总结与展望

9.遇到的困难

数据集的采集和转化

cifar-10数据集的下载和转化为图片的算法、以及将图片的路径批量导出到txt文本文件中。经过查阅各种资料,最终能够解决问题。

算法设计

关于基于特征工程的特征提取算法和深度学习的算法设计,经过查阅知网、csdn等前辈、大佬的代码、算法思想,最终总结出一套适合自己此次实训的算法。

后端框架

在此之前还没有用过python来做web系统,本次实训是我独立完成的后端flask框架搭建、路由配置、逻辑设计等。遇到了很多麻烦,比如对flask的基础很薄弱,基本上现学现卖,对于路由配置也是一知半解,但是通过查阅资料最终搞懂了,并且成功输出。

web前端设计

由于学校没有系统安排前端相关的课程,所以对于前端只是了解,没有怎么深切应用感受过,在本次实训中,button按钮、CSS样式、flex布局、javascript算法逻辑设计等几乎都是0基础起步,但是功夫不负有心人,最终成功克服了困难。

9.收获

通过本次独立完成实验,我系统地学习并深刻理解了一个web系统从数据集、后端、前端、数据库、路由的全过程,见证了从0到1,再到100的缓慢的过程。这次实验让我对web系统的开发有了更加深刻的理解,并且学习了相关的技能,比如flex布局、提高按钮交互性、前后端之间的路由配置、交互等等。

本次实验我掌握了基于内容的图像搜索系统的搭建,掌握了数据集的使用、数据预处理、图像颜色特征提取、图像形状特征提取、图像纹理特征提取、基于深度学习的特征提取、优化后的搜索算法(比如基于KDTree数据结构的搜索算法)等和数字图像处理、计算机视觉相关的理论知识和实践技能。

本次实验锻炼了我的自学能力和独立解决问题的能力。从数据集开始就是各种困难,但是在一步步的努力和坚持下,所有的困难都被一一克服,最终完成一张答卷。遇到困难不要畏惧,方法总比困难多,自学能力和独立解决问题的能力是一项很重要的品质,它能让我们不依赖于他人,极大地增强自信心。

本次实验是在老师的鼓励下,我才能坚持自己独立开发,老师说要相信自己的潜力,经过实践可得,老师的话是对的,虽然我做的系统还没有达到我最理想的状态,但是进展和成果也是很乐观的。

9.系统优点

本系统采用了KDTree数据结构,具有对数级的搜索效率,当数据集较大时可以大幅度提高搜索速度和效率。KDTree适用于大数据量高维度数据集,很适合本次实训的数据集对象。

本系统在处理纹理形状时使用了对数处理,即将计算得到的 Hu 不变矩进行对数转换,以 10 为底。对数转换的目的是将不变矩的值调整到一个可比较的范围,通过加负号将其变为正值,从而便于数据特征提取。

9.系统不足和优化

该系统还有很多不足,有很多可以再优化和进步的地方。

首先,可以使用更加丰富的数据集,通过大量的图像集,可以进一步提高检索结果的准确率和匹配度。

然后就是特征提取的算法可以进一步优化,本次系统在颜色、纹理、形状三个方向进行特征提取,还可以考虑其他方向,比如HOG,也可以将不同的特征提取算法结合,进行综合方法的特征提取。

搜索算法可以进一步优化,当数据集越来越大的时候,检索数据库中的数据就会成为一个瓶颈,只有更加高效的、更加优化的算法才能匹配更大的数据集,提高搜索效率,从而提高用户体验。

可以进一步进行系统架构的设计。比如本次实验采取的是前后端半分离,但是可以进一步设计成前后端完全分离,比如采用Vue3.0 + Element Plus的框架来进行设计,使得系统界面更加美观。

也可以考虑高并发、多线程、多进程等算法来进一步提高图像检索系统的检索效率和速度,提高用户体验。

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

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

相关文章

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例: 快速启动 | Apac…

算法笔记(动态规划入门题)

1.找零钱 int coinChange(int* coins, int coinsSize, int amount) {int dp[amount 1];memset(dp,-1,sizeof(dp));dp[0] 0;for (int i 1; i < amount; i)for (int j 0; j < coinsSize; j)if (coins[j] < i && dp[i - coins[j]] ! -1)if (dp[i] -1 || dp[…

Doris配置外表以及多个Hive外表的配置

1.场景分析 以Clickhouse、Doris、Starrocks等为代表的mpp分析数据库正在快速的兴起&#xff0c;以其高效查询、跨库整合能力收到广大技术人员的喜爱。本文主要浅显介绍下作者在使用Doris时&#xff0c;通过建立catlog进行跨库查询。 废话不多少&#xff0c;直接上代码 2.相关…

力扣211. 添加与搜索单词 - 数据结构设计

字典树 思路&#xff1a; 设计一棵字典树&#xff0c;每个节点存放单词的一个字符&#xff0c;节点放一个标记位&#xff0c;如果是单词结束则标记&#xff1b;字典树插入&#xff1a; 字典树默认有 26 个 slot 槽代表 a - z&#xff1b;遍历单词&#xff0c;如果字符对应槽存…

Python自动化实战之接口请求的实现

在前文说过&#xff0c;如果想要更好的做接口测试&#xff0c;我们要利用自己的代码基础与代码优势&#xff0c;所以该章节不会再介绍商业化的、通用的接口测试工具&#xff0c;重点介绍如何通过 python 编码来实现我们的接口测试以及通过 Pycharm 的实际应用编写一个简单接口测…

『Open3D』1.10 Tensor数据处理

open3d中实现了自身的数据类型,用于open3d中内部算法的数值计算,但基础使用上与numpy类似。 目录 1、tensor创建 2、tensor数据属性 3、 Tensor数据在CPU与GPU上的转换

Linux/Traceback

Enumeration nmap 使用nmap初步扫描发现只开放了22和80端口&#xff0c;端口详细扫描情况如下 先看看web是什么样子的&#xff0c;打开网站发现有一条留言&#xff0c;显示该站点已经被黑了&#xff0c; 并且留下了后门 查看源代码&#xff0c;可以看到下面的注释 <!--So…

Docker中创建并配置MySQL、nginx、redis等容器

Docker中安装并配置MySQL、nginx、redis等 文章目录 Docker中安装并配置MySQL、nginx、redis等一、创建nginx容器①&#xff1a;拉取镜像②&#xff1a;运行nginx镜像③&#xff1a;从nginx容器中映射nginx配置文件到本地④&#xff1a;重启nginx并重新配置nginx的挂载 二、创建…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Kubernetes (十四) 调度策略

一. 调度策略 二. 调度方法 nodeName 创建pod配置文件 vim nodename.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels…

23 SEMC外扩SDRAM

文章目录 23.1 SDRAM 控制原理23.2 SEMC 简介 23.1 SDRAM 控制原理 RT1052 系列芯片扩展内存时可以选择 SRAM 和 SDRAM 由于 SDRAM 的“容量/价格”比较高&#xff0c;即使用 SDRAM 要比 SRAM 要划算得多。 给 RT1052 芯片扩展内存与给 PC 扩展内存的原理是一样的 PC 上一般…

【计算机网络】HTTP协议以及简单的HTTP服务器实现

文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总…

网络编辑day4

思维导图 广播模型发送端-->类似于UDP客户端 #include<head.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error ");return -1;}//2、将套接字设置成允许广播int broadcast1…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二 模块二竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;模块二为网络安全事件响应、数字取证调查和 应用程序安全。本文件为信息安全管理与评估项目竞赛-模块二试题。 介绍 竞赛有固定的开始和结…

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC 博主平时DIY经常使用OLED&#xff0c;其中以4脚的I2C屏最多&#xff0c;就想着总结一下子&#xff0c;让广大DIY朋友更容易找到资源。 驱动采用的时SSD1306 同学们拿到代码后&#xff0c;可以直接用&#xff0c;其中博主给的代码默认…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo&#xff1a;第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋&#xff0c;没办法和 AlphaGO 对局。但是我喜欢玩斗地主&#xff0c;有斗地主人工智能机器人吗&#xff1f; 有&#xff0c;而且还开源了。DouZero&#xff1a;快手团队开发的斗地主AI。别的不说&…

文件共享服务(一)——DAS、NAS、SAN存储类型

一、存储类型 存储类型主要有三种 1. DAS直连式存储 通常由数据线直连电脑就可以用&#xff0c;比如一块新硬盘&#xff0c;只需要利用磁盘模拟器分区&#xff0c;创建文件系统&#xff0c;挂载就可以使用了。 PC中的硬盘或只有一个外部SCSI接口的JBOD存储设备&#xff08;即…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…

力扣每日一练(24-1-18)

经验一&#xff1a;不要把问题想复杂 Python&#xff1a; min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#&#xff1a; public int MaxProfit(int[] prices) {i…