本项目是一个基于 Python 的图像检索应用,提供了图形用户界面 (GUI) 进行交互。它支持多种特征提取方法 (SIFT, ORB)、图像编码技术 (BoF, VLAD)、模型训练、查询扩展和结果重排序等功能。
项目主要由以下几部分组成:
- Python 脚本文件:
gui.py: 实现应用的图形用户界面。interfaces.py: 定义后端服务的接口。jiance.py: (检测.py) 实现后端核心逻辑,包括特征提取、模型训练、检索和评估。query.py: 实现查询扩展功能。rerank.py: 实现检索结果的重排序功能。
- 数据目录:
models/: 存储预计算的视觉码本 (codebook_*.pkl) 和图像特征 (features_*.pkl),用于加速检索过程。
- 主要功能: 该文件负责项目的图形用户界面 (GUI)。它使用
tkinter构建界面,允许用户进行图像检索、模型选择、训练和评估等操作。 - 主要定义:
class ImageRetrievalApp(tk.Frame):(gui.py:12)__init__(self, root, backend_service): (gui.py:13) 初始化GUI应用。setup_control_panel(self): (gui.py:184) 设置控制面板。setup_display_panel(self): (gui.py:276) 设置显示面板。select_query_image_gui(self): (gui.py:298) 选择查询图片。start_training_gui(self): (gui.py:380) 启动训练。start_retrieval_gui(self): (gui.py:387) 启动检索。start_evaluation_gui(self): (gui.py:398) 启动评估。display_retrieval_results(self, results: List[tuple[float, str]]): (gui.py:405) 显示检索结果。show_model_selection_dialog_gui(self): (gui.py:586) 显示模型选择对话框。
- 主要功能: 该文件定义了项目后端服务的接口。它使用
abc.ABC来创建一个抽象基类,规范了后端服务应提供的功能。 - 主要定义:
class BackendService(ABC):(interfaces.py:4)- 一个抽象基类,定义了后端服务必须实现的方法(例如,启动训练、检索、加载模型等)。
- 主要功能: 该文件实现了后端服务接口 (
BackendService),是图像检索应用的核心逻辑单元。它负责处理包括图像特征提取 (如 SIFT, ORB)、特征编码 (Bag-of-Features, VLAD), 模型训练、保存/加载模型、执行图像检索、查询扩展、结果重排序以及性能评估等任务。 - 主要定义:
class JianceBackend(BackendService):(jiance.py:27)init_feature_extractors(self): (jiance.py:114) 初始化特征提取器。extract_features(self, image_path: str, feature_type: str): (jiance.py:124) 提取图像特征。encode_bof(self, descriptors: np.ndarray, use_tfidf: bool) -> np.ndarray: (jiance.py:167) BoF 编码。encode_vlad(self, descriptors: np.ndarray) -> np.ndarray: (jiance.py:182) VLAD 编码。_perform_training(self, params: Dict[str, Any]): (jiance.py:199) 执行训练。save_model_logic(...): (jiance.py:310) 保存模型。load_model_logic(...): (jiance.py:335) 加载模型。_perform_retrieval(...): (jiance.py:409) 执行检索。_perform_evaluation(...): (jiance.py:599) 执行评估。
- 主要功能: 该文件实现了查询扩展 (Query Expansion) 的逻辑,用于通过修改或增加原始查询的特征来提高检索系统的性能。
- 主要定义:
expand_query(...) -> Tuple[Optional[np.ndarray], List[str]]: (query.py:157) 执行查询扩展。_select_expansion_samples(...): (query.py:52) 选择用于扩展的样本。MockBackendService(BackendService): (query.py:487) 用于测试的模拟后端服务。
- 主要功能: 该文件实现了基于空间验证(Spatial Verification)的图像检索结果重排序模块。通过RANSAC几何一致性验证和特征点匹配来提高检索的准确性。这是一个独立化的模块,支持多种重排序方法。
- 核心算法:
- 空间验证: 使用SIFT/ORB特征点匹配和RANSAC算法进行几何一致性验证
- 评分机制: 结合原始相似度分数和空间一致性分数
- 重排序策略: 线性组合多种评分指标
- 主要定义:
rerank_with_spatial_verification(...) -> List[Tuple[float, str]]: 基于空间验证的重排序函数rerank_linear_combination(...) -> List[Tuple[float, str]]: 兼容性重排序函数,内部调用空间验证方法extract_keypoints_and_descriptors(...): 提取图像特征点和描述符match_features(...): 特征点匹配spatial_verification(...): RANSAC空间验证compute_spatial_score(...): 计算空间一致性分数get_rerank_config(): 获取重排序配置信息benchmark_rerank_performance(...): 性能评估功能
- 主要用途: 存储预计算的模型数据 (
.pkl文件),包括:- 视觉码本 (
codebook_*.pkl): 如models/codebook_ORB_BoF_64.pkl。这些是 BoF 和 VLAD 编码的基础,通过对 SIFT 或 ORB 特征进行聚类生成。文件名指明了特征类型、编码方法和码本大小。 - 图像特征 (
features_*.pkl): 如models/features_SIFT_VLAD_128_tfidf_True.pkl。这些是数据集中图像的预计算特征向量,用于与查询图像进行快速比较。文件名指明了特征类型、编码方法、码本大小以及是否使用 TF-IDF。
- 视觉码本 (
- 作用: 通过存储这些预计算数据,显著提高了模型加载和图像检索的效率。
- 核心语言: Python (3.7+ 推测)
- GUI:
tkinter - 计算机视觉/图像处理:
OpenCV (cv2)(用于 SIFT, ORB 特征提取等) - 机器学习/数据处理:
scikit-learn (sklearn)(用于 K-Means 聚类, TF-IDF, 相似度计算等)NumPy(用于数值和数组操作)- 图像编码: Bag-of-Features (BoF), VLAD
- 数据持久化:
pickle(用于.pkl文件) - 数据可视化:
Matplotlib - 标准库:
os,abc,typing,threading(推测)