我正在基于面部识别和验证的项目中工作。我正在使用暹罗网络来获取人脸的128向量(Embeddings)。
我正在将该人脸的编码/嵌入存储在数据库中,然后检查或说将传入的人脸编码与先前存储的编码进行匹配,以识别该人。
为了建立一个强大的系统,我必须存储同一个人的多个编码。当我只使用一个编码矢量,并与:
匹配时从face_recognition
库(以获取距离):
face_recognition.compare_faces( stored_list_of_encodings, checking_image_encodings )
这并非一直有效,因为我只比较了一种编码。为了使系统足以应付大多数情况,我想存储同一个人的至少3种编码,然后与新数据进行比较。
现在的问题:如何存储一个人的多个嵌入物,然后比较距离?
我正在使用face_recognition
作为库和暹罗网络进行特征提取。
请记住,它们被称为近似值,因此您不会获得确切的结果,但是如果要处理大量实体,这是您的最佳选择。如果您不是这种情况,则可以使用sklearn中已经提供的蛮力最近邻解决方案来获得完全匹配。
创建KNN分类器
实现此目的的方法是创建一个分类数据库,其中每个功能都有与之关联的人名(在这种情况下,一个功能代表一个人的一张脸部图像)。然后,在比较时,您将计算每个表示形式的查询特征的距离。您使用N个最小距离进行比较。然后,您可以遍历N个距离,看看每个类别都属于什么类别,然后可以使用出现的最大标签,这将是您的目标类别。以我的经验来看,虽然它不是非常稳健(尽管这完全取决于测试数据的类型,但是我的工作与大量的野外图像有关,因此不够健壮)]
平均表示
[我使用的另一种方法是我平均每个人的表示。如果我有5张图像,我将采用从这些表示中提取的5个表示的平均值或中位数。以我的经验,中位数比平均水平更好。现在,您将获得一个与每个人关联的平均表示,您可以对每个平均表示进行测距,而距离最小的那个将成为您的目标课程。
集群表示形式
另一种方法是使用DBScan将表示形式群集到群集中,然后在运行时将查询代表分类到群集中,并以该群集中的多数类作为标签
根据我的经验,平均代表制是最好的,但是您最终需要多张图像,我认为至少要5张。但就我而言,由于我要适应多个角度,所以我至少需要5个。NOTE ::
SVM是一种错误的方法,它限制了数据库的大小,并且每次需要向数据库中添加新人员时,都需要为刚刚拥有的额外课程训练新的SVM。弹出此外,出于存储目的,您始终可以将其存储在JSON中
创建KNN分类器
实现此目的的方法是创建一个分类数据库,其中每个功能都有与之关联的人名(在这种情况下,一个功能代表一个人的一张脸部图像)。然后,在比较时,您将计算每种表示形式的查询特征的距离。您使用N个最小距离进行比较。然后,您可以遍历N个距离,看看每个类别都属于什么类别,然后可以使用出现的最大标签,这将是您的目标类别。以我的经验来看,尽管它并不是非常可靠(尽管这完全取决于测试数据的类型,但我的工作与大量的野外图像有关,因此不够坚固)]
平均表示
[我使用的另一种方法是我平均每个人的表示。如果我有5张图像,我将采用从这些表示中提取的5个表示的平均值或中位数。以我的经验,中位数比平均值要好。现在,您将拥有一个与每个人关联的平均表示,您可以对每个平均表示进行测距,而距离最小的那个将成为您的目标课程。
集群表示形式>>
另一种方法是使用DBScan将表示形式群集到群集中,然后在运行时将查询代表分类到群集中,并以该群集中的多数类作为标签
根据我的经验,平均代表制是最好的,但是您最终需要多张图像,我认为至少要5张。但是在我的情况下,我需要至少5个,因为我要适应多个角度,不是这样。NOTE ::
SVM是一种错误的方法,它限制了数据库的大小,并且每次需要向数据库中添加新人员时,都需要为刚刚增加的额外课程训练新的SVM。弹出此外,出于存储目的,您始终可以将其存储在JSON中