一个简单的人脸检索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")

点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐