特征向量检索中的Query Expansion应用

查询扩展(Query Expansion)是一种在信息检索领域常用的技术,旨在改善检索结果的准确性和覆盖范围。它通过扩展查询以包含更多相关的信息,从而提高检索系统的性能。

具体步骤(以图像检索为例,文本亦如此):

  1. 提取特征:对于原始查询图像,使用特征提取算法(如卷积神经网络)从图像中提取特征向量。
  2. 相似图像检索:使用提取的特征向量作为查询向量,在图像库中搜索与之相似的图像。
  3. 融合特征:将相似图像的特征向量与原始查询的特征向量进行融合,可以使用简单的加权求和或其他融合方法。
  4. 扩展查询:将融合后的特征向量作为扩展后的查询向量,用于重新执行图像检索。

代码示例:

(此为示例,代码可以进一步优化)

import cv2
import numpy as np

# 提取特征函数
def extract_features(image_path):
    # 读取图像
    image = cv2.imread(image_path)
    # 创建ORB对象
    orb = cv2.ORB_create()
    # 检测关键点并计算描述符
    keypoints, descriptors = orb.detectAndCompute(image, None)
    descriptors = np.mean(descriptors,axis=0)
    # descriptors = descriptors.reshape(1, 32)
    return keypoints, descriptors

# 使用欧氏距离计算相似度得分
def calculate_similarity(query_descriptors, db_descriptors):
    distance = np.sqrt(np.sum((query_descriptors - db_descriptors) ** 2))
    similarity_score = -distance  # 取负值,使得距离越小相似度越高
    return similarity_score

# 相似图像检索函数
def search_similar_images(query_image_path, database_images, top_k=5):
    # 提取查询图像的特征
    _, query_descriptors = extract_features(query_image_path)
    # print (query_descriptors)
    
    # 初始化相似度矩阵
    similarity_scores = []
    
    # 遍历数据库中的图像
    for image_path in database_images:
        # 提取数据库图像的特征
        _, db_descriptors = extract_features(image_path)
        
        # 使用某种相似度度量方法(如欧氏距离)计算查询图像与数据库图像的相似度得分
        similarity_score = calculate_similarity(query_descriptors, db_descriptors)
        
        # 将相似度得分与图像路径添加到相似度矩阵中
        similarity_scores.append((similarity_score, image_path))
    
    # 根据相似度得分对图像进行排序
    similarity_scores.sort(reverse=True)
    
    # 返回前top_k个相似的图像
    top_k_images = [image_path for _, image_path in similarity_scores[:top_k]]
    return top_k_images

# 最后使用qe查询
def search_similar_qe(expanded_query_descriptors, database_images, top_k=5):
    # 提取查询图像的特征
    query_descriptors = expanded_query_descriptors
    
    # 初始化相似度矩阵
    similarity_scores = []
    
    # 遍历数据库中的图像
    for image_path in database_images:
        # 提取数据库图像的特征
        _, db_descriptors = extract_features(image_path)
        
        # 使用某种相似度度量方法(如欧氏距离)计算查询图像与数据库图像的相似度得分
        similarity_score = calculate_similarity(query_descriptors, db_descriptors)
        
        # 将相似度得分与图像路径添加到相似度矩阵中
        similarity_scores.append((similarity_score, image_path))
    
    # 根据相似度得分对图像进行排序
    similarity_scores.sort(reverse=True)
    
    # 返回前top_k个相似的图像
    top_k_images = [image_path for _, image_path in similarity_scores[:top_k]]
    return top_k_images

# 融合特征函数
def fuse_features(query_features, similar_features, weights):
    # 对特征进行加权融合
    fused_features = query_features * weights[0] + similar_features * weights[1]
    return fused_features

# 扩展查询函数
def expand_query(query_image_path, similar_images, weights):
    # 提取查询图像的特征
    query_keypoints, query_descriptors = extract_features(query_image_path)
    
    # 初始化扩展后的查询特征
    expanded_query_descriptors = np.zeros_like(query_descriptors)
    
    # 遍历相似图像
    for similar_image_path in similar_images:
        # 提取相似图像的特征
        _, similar_descriptors = extract_features(similar_image_path)
        
        # 对查询特征和相似图像特征进行融合
        fused_descriptors = fuse_features(query_descriptors, similar_descriptors, weights)
        
        # 将融合后的特征添加到扩展后的查询特征中
        expanded_query_descriptors += fused_descriptors
    
    # 归一化扩展后的查询特征
    expanded_query_descriptors /= len(similar_images)
    
    return query_keypoints, expanded_query_descriptors

# 示例用法
query_image_path = '1012.jpg'
database_images = ['1013.jpg', '1014.jpg', '1015.jpg', '1016.jpg', '1017.jpg']
top_k = 3
weights = [0.5, 0.5]

# 搜索相似图像
similar_images = search_similar_images(query_image_path, database_images, top_k)
print (similar_images)

# 扩展查询
query_keypoints, expanded_query_descriptors = expand_query(query_image_path, similar_images, weights)


# 使用扩展后的查询特征重新执行图像检索
expanded_similar_images = search_similar_qe(expanded_query_descriptors, database_images, top_k)
print (expanded_similar_images)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值