机器学习:人脸识别
如果用 CNN 按分类做验证的话,会有以下问题
- 需要每个人都给多个样本照片,比如每个人要提供 100 张自己的人脸照片供模型学习,这本来就不容易,加上人的数量也多,就更是个问题
- 哪怕有足够的样本数据,另一个问题是人员组成很容易变化,比如公司员工经常变化(大组织甚至每天都有人员进出),分类的数量和类别也就变了,不可能每次都重新训练
如果是为了识别部分公众人物,倒是可以这样做,因为一方面网上有很多公众人物的照片,另一方面公众人物的数量不多,而且也较为稳定
Triplet Loss (三元组损失)
训练集的每个数据,是一个三元组,由 Anchor (锚)、Positive (正确)、Negative (错误) 的三张照片组成
其中 Positive 和 Anchor 是同一个人,而 Negative 和 Anchor 不是同一个人
将照片分别放入卷积网络,得出一维特征值,比如 512 维特征值
然后计算 Anchor 的特征值和 Positive 的特征值的距离 d(A,P)
以及 Anchor 的特征值和 Negative 的特征值的距离 d(A,N)
要求 d(A,N) 至少要比 d(A,P) 大某个值,即 d(A,P) + a <= d(A,N)
损失函数 $\small L = \sum_{i=1}^{n}max(\ (d(A_{i}, P_{i})\ -\ d(A_{i}, N_{i})\ +\ a),\ \ 0) $
有三种三元组
easy triplets:loss 为 0 d(A,P) + a <= d(A,N) 的时候损失取 0
hard triplets:d(A,P) > d(A,N)
semi-hard triplets:d(A,P) + a > d(A,N) > d(A,P) d(A,N) 比 d(A,P) 大但差距不到 a
训练中如果有样本计算出来的是 semi-hard 那么训练效果会比较好,模型会被调整到满足 loss 为 0
后面验证的时候就是用训练出来的 CNN 网络,得出两张图片的特征,再计算特征距离,小于 a,就认为是同一个人
二分类法
在卷积层提取出特征值,假设特征值是 n 维(比如 512 维),两张图片的特征值分别是 X1 和 X2
不是简单计算距离,而是计算另一个值
\(\small y = sigmoid(\sum_{i=1}^{n}(w_{i} \times | x1_{i} - x2_{i}|) + b)\)
\(\small y \approx 1\) 就是同一个人,\(\small y \approx 0\) 就不是