第二部分讲到了用facenet将人脸embedding为特征矩阵,这种特征已经具有了相同人对应的向量距离小,不同人对应的向量距离大的特点。接下来,一般的应用有以下几类:
(1)人脸验证(Face ID)。就是检测A,B两个人是否属于同一个人,需要计算两个向量之间的距离,设定合适的报警阈值(threshold)即可。这种应用在手机等电子设备上比较常见,例如现在的手机的人脸解锁功能。
(2)人脸识别(Face Recognition)。给定一张图片,检测数据库中与之最相似的人脸,这个应用相对是较多的。这个问题显然可以被转换为一个求距离最近邻的问题,最适合用Knn算法解决。
(3)人脸聚类(Face Clastering)。目的是在数据库中找出最相似的人脸。直接使用聚类算法对人脸特征进行聚类,例如KMeans等。
这里我们要进行的是人脸识别,就是上面所讲的第二类问题。在小项目里使用的就是Knn算法,这个算法简单快速,准确率还不错。当然这个也不是唯一的,也可以用其他的分类算法,比如SVM等。(但是经过我自己的实验,用SVM的效果并不理想,究竟是为啥原因还有待探讨)接下来说一下Knn在这里是怎样工作的。
knn,即K最近邻(k-NearestNeighbor)分类算法,见名思意:找到最近的k个邻居(样本),在前k个样本中选择频率最高的类别作为预测类别。它是一种有监督的学习算法。算法步骤如下:
1)算距离:给定未知对象,计算它与训练集中的每个对象的距离;
2)找近邻:圈定距离最近的k个训练对象,作为未知对象的近邻;
3)做分类:在这k个近邻中出线次数最多的类别就是测试对象的预测类别。
其中k值的取值很重要,下面借别人的例子来说明这个算法的工作原理。有下面这么一张图,要判断中间的绿点属于哪一类。
若k = 3,那么绿点会被判定属于红色三角;
若k = 5,那么三角会被判定属于蓝色矩形;