续 基于开源模型搭建实时人脸识别系统(六):人脸识别(人脸特征提取)_CodingInCV的博客-CSDN博客
经过人脸识别后,人脸就由图像变成了一个特征向量,衡量人脸之间的相似度也就转化成了人脸特征向量之间的相似度。
向量距离
向量的距离有多种计算方式,比较常见的是欧式距离、曼哈顿距离和余弦距离。人脸识别中主要使用欧式和余弦距离
欧式距离
欧式距离可以简单的理解为高维空间中2点之间的直线距离。
∑
(
x
i
−
y
i
)
2
\sqrt{\sum(x_i-yi)^2}
∑(xi−yi)2
余弦距离
余弦距离指的是向量空间中两个向量间的夹角的余弦值,又称作余弦相似度
c
o
s
θ
=
x
→
∙
y
→
∣
x
∣
∗
∣
y
∣
cos\theta =\frac{\overrightarrow{x}\bullet \overrightarrow{y}}{|x|*|y|}
cosθ=∣x∣∗∣y∣x∙y
对于归一化的向量,
c
o
s
θ
=
x
→
∙
y
→
cos\theta ={\overrightarrow{x}\bullet \overrightarrow{y}}
cosθ=x∙y
直接就等于向量的点积,并且和欧式距离是等价的。
人脸识别中的距离
目前,人脸识别训练时都会将特征进行归一化后再计算loss, 因此在识别时也都会将特征进行归一化后再使用,所以余弦距离更适合当前的人脸识别。另一方面,余弦距离的值域为-1到1,用来衡量相似程度也比较直观。
大规模向量检索与近似检索
人脸的底库根据应用规模从几百到上亿,对于规模较大的底库,直接按1:1的方式去遍历计算是比较低效的,实用上会使用矩阵运算的方式批量按1:N或M:N计算。各个平台上都有相应的库来进行矩阵运算。arm上有openblas, x86 cpu上有openblas或者MKL, 英伟达gpu上有cublas。除了这些底层的矩阵运算库之外,还有功能更强大的库和工具,这些工具不仅进行了矩阵运算,还将底库的增删、近似检索等功能都进行了封装,使用比较广泛的有faiss、Milvus等。相对而言,milvus功能更强大也更复杂。
facebookresearch/faiss: A library for efficient similarity search and clustering of dense vectors. (github.com)
milvus-io/milvus: A cloud-native vector database, storage for next generation AI applications (github.com)
microsoft/SPTAG: A distributed approximate nearest neighborhood search (ANN) library which provides a high quality vector index build, search and distributed online serving toolkits for large scale vector search scenario. (github.com)
近似检索
除了使用精确检索外,为了加快检索速度,还有一些近似检索的方法,牺牲部分精度来加速检索。
本项目的选择
考虑到易用性和本项目的量级,使用faiss-cpu。
结语
这里我们简要介绍了人脸比对中的一些概念。