题目:基于内容的图像在线检索系统
简介:基于内容的图像在线检索系统(Content Based Online Image Retrieval , 以下简称 CBOIR),是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统,允许用户在线输入一张图像,在远程图像数据库中查找具有相同或相似内容的其它图片。
要求:本实训完成的系统要求实现基于视觉特征的在线图像检索。
该项目的实训内容主要包括:
1. 搭建一个Web系统,实现图像文件的在线提交、存储和检索结果展示。
2.系统调用基于特征工程方法的算法进程,算法能够利用颜色特征、纹理特征、形状特征及HOG\LBP\HARR等全局和局部特征实时从图像库中检索出和输入图像相同或相似的图像,结合机器学习的方法,计算图像相似度或直接进行图像类别分类,将结果显示在系统中。
3.系统调用基于深度学习方法的算法进程,通过搭建深度学习的网络对相似图像进行检索和分类,将结果显示在系统中。
4. 对于以上两类方法,各组(2-3人)分工完成,在线展示方法的横向和纵向比较,要求有丰富的实验设计和实验结果分析。
由于想挑战自己,故本次任务由本人独立完成,故可能有考虑不周的地方。
基于内容的图像在线检索系统(CBOIR)是一种用于大规模数字图像内容检索的研究分支。本实训旨在实现基于视觉特征的图像检索 Web 平台,要求实现的功能包括基于颜色信息、纹理特征、形状特征的图像检索。本文在以上全局特征、浮点特征的基础上,还使用了深度学习实现图像检索,并对检索方式进行拓广,实现了基于KDTree的数据结构进行高效查找,并对多种特征工程结果进行对比分析、不同神经网络之间的对比分析、特征工程和深度学习方式的结果进行对比分析。此外,系统还能在 Web 平台上进行图像展示。
关键词:CBOIR;颜色;纹理;形状;深度学习;KDTree;web
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 平台。
具体包括:
图像检索系统工作流程
图像检索系统框架
文件名 |
存储内容 |
存储方式 |
path.txt |
图像位置 |
相对路径 |
colorjuData.txt |
颜色特征 |
图像路径:颜色特征 |
greymatrixData.txt |
纹理特征 |
图像路径:纹理特征 |
ShapeNchangeData.txt |
形状特征 |
图像路径:形状特征 |
VGGData.txt |
深度学习特征 |
图像路径:深度学习特征 |
本次实验有mysql和txt文件两种保存形式。
颜色特征表
颜色特征表Color保存的是数据集图像的颜色特征信息,即图像的一阶矩(均值)、二阶矩(标准差)和三阶矩(斜度)。
纹理特征表
纹理特征表Texture保存的是归一化后的灰度共生矩阵计算得到每个方向上的特征值的平均值和标准差。
形状特征表
形状特征表Shape保存的是 Hu 不变矩特征。
VGG特征表
VGG特征表保存在了txt文件中,保存的是神经网络的倒数第二层全连接层的特征值,一共512维,属于高维特征。文件总大小为132.2MB
该算法通过将图像转换到HSI(色调、饱和度、亮度)颜色空间,并计算图像的一阶矩(均值)、二阶矩(标准差)和三阶矩(斜度)。颜色矩表征了图像颜色分布的集中程度和对比度。这些特征可用于图像分类、检索和分析。
该算法在图像检索系统中的作用主要是提取图像颜色特征。这些特征可用于描述图像的整体颜色分布。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。
该算法实现了两个核心函数:rgb_to_hsi和color_moments。
rgb_to_hsi函数:
该函数实现了将RGB图像转换为HSI(色相、饱和度、亮度)色彩空间的转换。函数接收一个RGB图像作为输入,并返回转换后的HSI图像。
具体流程:
color_moments函数:
该函数实现了计算图像的颜色矩特征。函数接收一个图像文件路径作为输入,并返回一个包含颜色矩特征的列表。
具体流程:
优点:
缺点:
目前的特征提取过程相对简单,没有考虑不同颜色通道的权重和相关性,可能导致提取的特征不够准确和区分度不够。
该方法使用灰度共生矩阵(GLCM)来描述图像的纹理特征。GLCM能够捕捉像素之间的空间关系和灰度级的分布情况,用于描述图像的纹理信息。通过计算GLCM的特征值,如对比度(Con)、能量(Asm)、熵(Eng)和逆差矩(Idm),可以反映图像的纹理特征及其统计属性。提取的纹理特征包括四个方向的特征值,对应0度、45度、90度和135度的灰度共生矩阵。根据归一化后的灰度共生矩阵计算得到每个方向上的特征值的平均值和标准差,并将其作为纹理特征向量。
该算法在图像检索系统中的作用主要是提取图像纹理特征。以函数的方式实现了纹理特征的提取。它可以作为图像检索系统中的一个模块,用于提取图像的纹理特征。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。
该算法中实现了两个核心算法函数:feature_computer和glcm。
feature_computer函数:
该函数用于计算给定灰度共生矩阵的四个特征值:对比度(Con)、能量(Asm)、熵(Eng)和逆差矩(Idm)。
具体流程为:
glcm函数:
该函数用于计算给定灰度图像的归一化灰度共生矩阵。
具体流程为:
extract_texture_feature函数:
该函数用于提取给定图像的纹理特征,并返回特征向量。
具体流程为:
该实验结果效果良好,搜索出来的图片纹理具有很高的相似性。
优点
缺点:
只使用了一个固定的灰度级数,可能无法充分表达不同图像数据集中的灰度范围和纹理细节。可使用可变的灰度级数,根据图像数据集的灰度范围和纹理细节进行自适应的灰度级数设置,以提高纹理特征的表达能力。但是因为时间原因暂时无法实现。
该函数使用 OpenCV 提供的函数计算图像的形状特征,特别是 Hu 不变矩。Hu 不变矩是一种通过对图像的几何、中心和归一化矩进行计算得到的形状特征,具有旋转、缩放和平移不变性。通过对计算得到的 Hu 不变矩进行对数转换,将其范围映射到可比较的区间。返回以 10 为底的对数化的 Hu 不变矩列表。
该算法在图像检索系统中的作用主要是提取图像形状特征。以函数的方式实现了形状特征的提取。可以将该函数作为图像处理系统中的一个模块,用于提取图像的形状特征。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。
该算法实现了一个核心函数 extract_shape_features,用于提取给定图像的形状特征。
extract_shape_features函数:
该函数使用 OpenCV 提供的函数计算给定灰度图像的形状特征。
具体流程如下:
该实验结果虽然种类不是同一个,但是他们都有共同的形状特征,用肉眼看,就是形状都具有一定程度的锥形。计算机能比人类具有更加复杂的形状识别系统,因而实验结果不是同一种类也是可以理解的。
优点:
缺点:
算法只使用了Hu不变矩作为形状特征,可能无法捕捉到图像的其他重要特征信息。
该算法的核心思想是使用预训练的VGG16模型提取图像的特征。通过加载图像、调整图像尺寸和预处理等操作,将图像数据转换为适合VGG16模型输入的格式。然后,使用VGG16模型对处理后的图像进行预测,得到图像的特征向量。最后,对特征向量进行归一化处理,以使得特征向量具有可比性和稳定性。这样,我们可以利用这些特征向量进行图像检索、分类或其他相关任务。
引入库和模块:
代码开始处引入了所需的库和模块,包括 keras.utils.image_utils 和 keras.applications.vgg16.VGG16 。这些库和模块提供了图像处理和深度学习模型的功能。
定义VGGNet类:
extract_feat提取特征过程:
主程序运行:
该算法实现了一个 VGG16 特征提取器,通过调用预训练的 VGG16 模型和对图像进行预处理,提取图像的特征向量。特征提取后,将得到的特征值作为图像的描述,用于与数据库中的其他图像进行相似性计算和匹配。
整体系统架构可以分为几个模块:图像加载与预处理模块、特征提取模块、特征归一化模块。
图像加载与预处理模块负责将指定路径的图像加载到内存中,并进行必要的调整和预处理以适应VGG16模型的输入要求。
特征提取模块利用预训练的VGG16模型对预处理过的图像进行特征提取,得到原始的特征向量。
特征归一化模块对特征向量进行归一化处理,以确保特征向量具有统一的尺度和可比性。
该系统采用了面向对象的方式封装了特征提取过程,使得代码更加模块化和可复用。通过调用VGGNet类的方法,可以方便地提取图像的特征向量,并且可以根据实际需求对特征提取过程进行改进和优化。
优点:
缺点:
KD-Tree 是一种用于高效搜索 k 近邻点的数据结构,它在查找最近邻点时比传统的搜索方法(如线性搜索)具有一些优势。它一种用于存储 k 维空间中点的数据结构,其中 k 表示维度的数量。该数据结构通过将空间分割为垂直于坐标轴的超平面来组织点的集合。其中,根节点代表整个空间,子节点代表特定的子空间,直到叶子节点表示一个单独的数据点。
KD-Tree 通过将数据点进行空间划分,利用树结构减少搜索范围,快速找到给定点的最近邻点。通过递归的方式在树上进行搜索,并根据距离进行排序和剪枝,使得算法能够高效地找到最近的k个节点。
KDNode 类
该类表示 KD-Tree 中的一个节点。
具体流程如下:
create 函数
该函数根据给定的点列表创建一个 KD-Tree。
具体流程如下:
search_knn 函数
该函数用于寻找离给定点最近的 k 个节点,并返回以元组 (node, distance) 的形式表示的结果列表。
具体流程如下:
search_node 函数
该函数用于在 KD-Tree 中递归搜索与给定点最近的 k 个节点。
具体流程如下:
compute_similarity 函数
该函数用于计算两个向量之间的余弦相似度。
系统 |
技术栈 |
前端 |
HTML、CSS、Javascript |
后端 |
python、flask web框架、opencv、keras、pymysql |
数据库 |
mysql 8.0.33 |
操作系统 |
macOS Ventura 13.4.1 |
数据集的采集和转化
cifar-10数据集的下载和转化为图片的算法、以及将图片的路径批量导出到txt文本文件中。经过查阅各种资料,最终能够解决问题。
算法设计
关于基于特征工程的特征提取算法和深度学习的算法设计,经过查阅知网、csdn等前辈、大佬的代码、算法思想,最终总结出一套适合自己此次实训的算法。
后端框架
在此之前还没有用过python来做web系统,本次实训是我独立完成的后端flask框架搭建、路由配置、逻辑设计等。遇到了很多麻烦,比如对flask的基础很薄弱,基本上现学现卖,对于路由配置也是一知半解,但是通过查阅资料最终搞懂了,并且成功输出。
web前端设计
由于学校没有系统安排前端相关的课程,所以对于前端只是了解,没有怎么深切应用感受过,在本次实训中,button按钮、CSS样式、flex布局、javascript算法逻辑设计等几乎都是0基础起步,但是功夫不负有心人,最终成功克服了困难。
通过本次独立完成实验,我系统地学习并深刻理解了一个web系统从数据集、后端、前端、数据库、路由的全过程,见证了从0到1,再到100的缓慢的过程。这次实验让我对web系统的开发有了更加深刻的理解,并且学习了相关的技能,比如flex布局、提高按钮交互性、前后端之间的路由配置、交互等等。
本次实验我掌握了基于内容的图像搜索系统的搭建,掌握了数据集的使用、数据预处理、图像颜色特征提取、图像形状特征提取、图像纹理特征提取、基于深度学习的特征提取、优化后的搜索算法(比如基于KDTree数据结构的搜索算法)等和数字图像处理、计算机视觉相关的理论知识和实践技能。
本次实验锻炼了我的自学能力和独立解决问题的能力。从数据集开始就是各种困难,但是在一步步的努力和坚持下,所有的困难都被一一克服,最终完成一张答卷。遇到困难不要畏惧,方法总比困难多,自学能力和独立解决问题的能力是一项很重要的品质,它能让我们不依赖于他人,极大地增强自信心。
本次实验是在老师的鼓励下,我才能坚持自己独立开发,老师说要相信自己的潜力,经过实践可得,老师的话是对的,虽然我做的系统还没有达到我最理想的状态,但是进展和成果也是很乐观的。
本系统采用了KDTree数据结构,具有对数级的搜索效率,当数据集较大时可以大幅度提高搜索速度和效率。KDTree适用于大数据量高维度数据集,很适合本次实训的数据集对象。
本系统在处理纹理形状时使用了对数处理,即将计算得到的 Hu 不变矩进行对数转换,以 10 为底。对数转换的目的是将不变矩的值调整到一个可比较的范围,通过加负号将其变为正值,从而便于数据特征提取。
该系统还有很多不足,有很多可以再优化和进步的地方。
首先,可以使用更加丰富的数据集,通过大量的图像集,可以进一步提高检索结果的准确率和匹配度。
然后就是特征提取的算法可以进一步优化,本次系统在颜色、纹理、形状三个方向进行特征提取,还可以考虑其他方向,比如HOG,也可以将不同的特征提取算法结合,进行综合方法的特征提取。
搜索算法可以进一步优化,当数据集越来越大的时候,检索数据库中的数据就会成为一个瓶颈,只有更加高效的、更加优化的算法才能匹配更大的数据集,提高搜索效率,从而提高用户体验。
可以进一步进行系统架构的设计。比如本次实验采取的是前后端半分离,但是可以进一步设计成前后端完全分离,比如采用Vue3.0 + Element Plus的框架来进行设计,使得系统界面更加美观。
也可以考虑高并发、多线程、多进程等算法来进一步提高图像检索系统的检索效率和速度,提高用户体验。