# CBIR **Repository Path**: ssj9806/cbir ## Basic Information - **Project Name**: CBIR - **Description**: 基于内容的图像检索/CBIR - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 19 - **Forks**: 0 - **Created**: 2023-01-13 - **Last Updated**: 2025-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 该项目是一个关于基于内容的图像检索(CBIR)的探索与实验。该项目是使用Python语言编写的,里面主要包括两块内容:一块是实验部分(寻找检索精度与速度表现较好的那个点);另一块是作为服务器使用,供Java编写的界面调用图像检索功能。 Java的项目在这:https://gitee.com/ssj9806/sf_web_system。 **放在前面:项目中出现的任何与路径有关的错误,定位到将其修改成你电脑上的绝对路径即可。** # 一.项目配置 1. Windows10操作系统 2. conda 4.7.12 3. Python 3.7(Pycharm 2019.2.4) 4. TensorFlow 2.3.0 # 二.CBIR的探索与实验 该部分是对图像检索的探索与实验。讲述了我的图像检索功能是如何实现的,相关实验是如何开展的,希望能给大家有所帮助。**如果只是想把图像检索作为服务器的一个功能使用可以直接跳到第三个标题**。 ## 1.前期工作 1. 注意用于图像检索功能提取特征的图片类型:jpg,jpeg,png。大家也可以自行扩展。 2. 在ImageDatabase文件夹中有多个模型的文件夹,这些都是使用不同模型提取特征做实验用的,**需要拓展的话新建其他模型名称的文件夹即可**。至于模型的文件夹里的文件夹与文件都是代码创建,可以忽略。 3. 在ImageDatabase文件夹下有两个文件夹:一个image_DB(图片库),另一个image_test(做检索实验的图片)。**你需要把你要做实验的图片按9:1比例放到这两个文件夹中**,**注意这两个文件夹里存放的是分类文件夹,分类文件夹中存放的才是图片**,这是为了方面计算mAP用的。 4. 在根目录下的utils.py文件中,将main方法上IMAGE_DB_PATH变量改成自己电脑上的绝对路径。 ```python IMAGE_DB_PATH = 'E:/xxx/CBIR/ImageDatabase/image_DB' # 存储图片集的路径 ``` ## 2.特征提取 这是做图像检索实验的第一步,需要把每张图片的特征提取并保存到文件中,需要时加载即可,不然都放内存会装不下的。 1. 在networkFeatureExtract文件夹中,我提供了11种模型的实验代码。需要实验其他模型的直接复制改一下其中的参数即可。 2. 在每个py文件下面的main方法中我用数字一、二写了两部分代码。**在特征提取阶段,运行第一部分代码,将第二部分注释掉**。 ## 3.特征聚合(该步骤不用操作) 上一步特征提取得到的是[h,w,c]的三维特征,需要聚合成一维的用于表示一张图片的特征,这样方面检索。 1. 该步骤在根目录下的selectFiltersAndAggregation.py文件中。 2. 该文件中写了一些筛选过滤器与特征聚合的方法,**这里可以不用运行**,在后面的experiment.py中一起运行即可。 ## 4.检索与重排序(该步骤不用操作) 上一步聚合完特征就可以做检索精度的实验了,为了能提高检索的精度,我使用了行人重识别的k-reciprocal Encoding方法重排序。 1. 该步骤在根目录下的measureAndEvaluation.py文件中。 2. 该文件中写了一些计算mAP与re-rank mAP的方法,**这里可以不用运行**,在后面的experiment.py中一起运行即可。 ## 5.实验 由于以上只做了特征的提取,聚合和重排序还没做,我将其整合到experiment.py中了。 1. 改文件下的main方法下有一、二、三等几个方法,**逐个运行即可,运行一个的时候最好把其他的注释掉**,因为你需要对控制台打印的数据进行处理与分析。 2. 第一个方法是针对所有11个网络进行不同过滤器数量的特征聚合,并保存。 3. 第二个方法是实验不同filters_num及其对应的mAP和re_rank_mAP,注意这里计算re-rank mAP时参数使用的是:k1=40,k2=5,lambda=0.3。下面会做参数选择的实验。 4. 前面有说在每个特征提取的文件中都有一个第二个方法,在这里运行。在networkFeatureExtract文件夹下的每个文件中main方法下都有一个二方法,是用来求不同过滤器数量聚合特征所需的平均时间的。单独运行,把一注释掉。 5. 第三个方法是实验re-rank mAP中所需的,效果较好的参数值。我认为不同领域的较好参数值是有差异的。单独运行,把其他的注释掉。 至此所有的实验就做完了,大家可以对感兴趣的部分自行设计实验去做。 # 三.CBIR作为服务器 该部分是图像检索功能作为服务器上的一个功能供Java页面调用的。如果只是想使用图像检索这样一个功能,不想做实验可以直接使用即可。该部分已经配置好了实验过程中效果不错的一些参数,可以放心使用。 ## 1.前期工作 1. 在本项目外新建一个文件夹用于做图片数据库,例如命名为ImageDB。 2. 在ImageDB文件夹下新建一个images文件夹,把所有图片都放到这个文件夹下,不用在其中再分类了。 3. 在ImageDB文件夹下新建一个feature文件夹,把图片数据库的特征提前准备好放在这里。 假设你把这个ImageDB文件夹新建在了E盘,那么它的绝对路径就是:(记住这个绝对路径)其它的文件夹是Java项目需要的。 ```xml E:/ImageDB/ ImageDB的路径格式如下: -ImageDB -feature -eachVideoFeature -images -incomplete -images -temp -image -video -videos -frame_list -imageDBNamelist.py <== 这个文件后面会自动生成 ``` ## 2.提取特征并保存 在CBIR项目根目录下找到`selectFiltersAndAggregation.py`文件,在里面的main方法直接运行即可,但是要注意两个路径参数值的改成你自己电脑上的路径。 ```python originalPth = "E:/ImageDB/images/" destinationPath = "E:/ImageDB/feature/" ``` 将路径前缀`E:/ImageDB/`改成你电脑上的绝对路径。 ## 3.保存name_list文件 在CBIR项目根目录下找到`utils.py`文件,在里面的main方法直接运行即可,但是要注意两个路径参数值的改成你自己电脑上的路径。 ```python imgDB_path = "E:/ImageDB/images/" imgDB_name_list_save_path = "E:/ImageDB/imageDBNamelist.npy" ``` 将路径前缀`E:/ImageDB/`改成你电脑上的绝对路径。 ## 4.运行CBIR项目根目录下的PythonAsServer.py 运行后控制台出现以下文字说明图像检索已在后台运行监听中,等待被请求。 ```xml 服务器地址: ('127.0.0.1', 12345) 当前时间: 2023-01-12 17:25:18 ```