You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch人脸比对时张量距离列表升序排序获取前5匹配结果如何实现

解决方案
  • 你当前没有拿到排序结果的核心是两个问题:一是没有显式对距离做排序操作,直接输出了zip后的原始顺序(你看到的字母序是建库时name_list本身的存储顺序);二是tensor类型直接参与Python原生排序需要指定取值逻辑,否则不会按张量内的浮点数值排序。

方案1:最小改动适配现有代码

直接在原有逻辑基础上修改几行即可实现需求,修改后的完整代码如下:

import os
import torch
from PIL import Image

def face_match(img_path, data_path, top_k=5): 
    # 读取待匹配图像生成embedding
    img = Image.open(img_path)
    face = mtcnn(img)
    emb = resnet(face.unsqueeze(0)).detach()

    # 加载人脸数据库
    saved_data = torch.load(data_path) 
    embedding_list = saved_data[0]
    name_list = saved_data[1]
    dist_list = [] 
    
    for idx, emb_db in enumerate(embedding_list):
        # 把tensor转成Python原生浮点数存储
        dist = torch.dist(emb, emb_db).item()
        dist_list.append(dist)
    
    # 把姓名和距离绑定后按距离升序排序
    name_dist_pairs = list(zip(name_list, dist_list))
    sorted_pairs = sorted(name_dist_pairs, key=lambda x: x[1])
    
    # 取前top_k个结果返回
    top_k_result = sorted_pairs[:top_k]
    return top_k_result

# 调用示例
result = face_match(os.path.join(os.getcwd(), '1.jpg'), 'data.pt', top_k=5)
print(result)

方案2:向量化高性能实现(适合数据库规模较大的场景)

用PyTorch自带的批量计算和排序能力替代循环,运算效率提升明显,代码如下:

import os
import torch
from PIL import Image

def face_match(img_path, data_path, top_k=5): 
    img = Image.open(img_path)
    face = mtcnn(img)
    emb = resnet(face.unsqueeze(0)).detach()

    saved_data = torch.load(data_path) 
    # 把数据库的embedding列表转成批量tensor
    embedding_tensor = torch.stack(saved_data[0])
    name_list = saved_data[1]
    
    # 批量计算所有距离,dim=1按embedding维度算距离
    dists = torch.cdist(emb, embedding_tensor).squeeze()
    # 取距离最小的top_k个结果,返回对应值和索引
    top_k_dists, top_k_indices = torch.topk(dists, k=top_k, largest=False)
    
    # 组装结果,把tensor转成原生数值
    top_k_result = [(name_list[idx], dist.item()) for idx, dist in zip(top_k_indices, top_k_dists)]
    return top_k_result

# 调用示例
result = face_match(os.path.join(os.getcwd(), '1.jpg'), 'data.pt', top_k=5)
print(result)

注意事项

  • 原代码中存在img_path硬编码的问题,修改后的代码已移除该逻辑,调用时传入实际的图像路径即可生效
  • 调用时可以根据需求调整top_k参数获取任意数量的匹配结果
  • 如果需要做匹配阈值过滤,可以在返回结果前加一层判断,只保留距离小于设定阈值的结果

内容的提问来源于stack exchange,提问作者cfive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:01