机器学习:人脸识别

如果用 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\) 就不是



posted @ 2022-11-06 00:16  moon~light  阅读(250)  评论(0编辑  收藏  举报