用Faiss实现一个人脸检索

一个简单的人脸检索Faiss使用示例


需求:

  1. 人脸底库中包含多个人物ID,每个人物ID含有多个人脸特征向量。
  2. 要求最终计算特征向量间的cosine_similarity。
  3. 要求精确暴力检索。
  4. 在CPU上完成即可。

代码:

import numpy as np
import faiss
from faiss import normalize_L2

#1.随机化生成数据
d = 64  # dimension
nb = 10000  # database size
nq = 100  # nb of queries
np.random.seed(1234)  # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.
k = 5  #按距离排序返回K个结果
new_ids = np.random.randint(0,2,size=nb)

#2.实例化一个faiss索引
index = faiss.IndexIDMap2(faiss.IndexFlatIP(d))
#3.Flat类型的索引为暴力搜索方式,故不需要训练过程index.train(xb)
#4.向索引添加数据和id
normalize_L2(xb)         #求cosine_similarity,需要先对数据进行归一化
index.add_with_ids(xb, new_ids)
#5.检索
normalize_L2(xq)         
D, I = index.search(xq, k)

D距离矩阵nq*k

0.83715,0.82765,0.82305,0.82246,0.81697
0.86756,0.86418,0.86366,0.86219,0.85916
0.85836,0.84659,0.84092,0.83857,0.83776
0.86574,0.85780,0.85207,0.83666,0.83355
 ...

I索引矩阵nq*k

1,1,0,1,0
1,0,0,0,1
1,0,1,0,0
1,0,1,1,1
...

#1.保存索引
faiss.write_index(index, "./test.index")
#2.加载索引
ioindex = faiss.read_index("./test.index")

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值