从视频中聚类人脸

Posted

技术标签:

【中文标题】从视频中聚类人脸【英文标题】:Clustering human faces from a video 【发布时间】:2014-11-28 12:26:13 【问题描述】:

我已经运行了 opencv 内置的人脸检测算法来提取视频每一帧中的人脸(以 1 fps 采样)。我还将每个人脸图像的大小调整为相同大小,并裁剪了部分图像以去除背景噪音和头发。现在的问题是我必须对这些人脸图像进行聚类——每个聚类对应一个人。我实现了这里描述的算法http://bitsearch.blogspot.in/2013/02/unsupervised-face-clustering-with-opencv.html

基本上上述算法,迭代使用OpenCV的LBPH人脸识别器对图像进行聚类。在该页面本身的描述中,结果并不令人满意。在我的实施中,结果更糟。任何人都可以提出一种更好的方法来聚类面孔吗?可能正在使用其他一些功能和其他一些聚类算法。集群数量未知。

【问题讨论】:

【参考方案1】:

我建议看看

FaceNet: A Unified Embedding for Face Recognition and Clustering

我的shortscience summary(如果您想查看正确渲染的数学部分,请前往那里):

FaceNet 直接将人脸图像映射到 $\mathbbR^128$,其中距离直接对应于人脸相似度的度量。他们使用三元组损失函数。三元组是(A 人的脸,A 人的另一张脸,不是 A 的人的脸)。后来,这被称为(锚,正,负)。

损失函数是由 LMNN 学习和启发的。这个想法是最小化同一个人的两个图像之间的距离,并最大化与其他人图像的距离。

LMNN

Large Margin Nearest Neighbor (LMNN) 正在学习伪度量

$$d(x, y) = (x -y) M (x -y)^T$$

其中 $M$ 是一个正定矩阵。伪度量和度量之间的唯一区别是 $d(x, y) = 0 \Leftrightarrow x = y$ 不成立。

课程学习:三元组选择

先展示简单的例子,然后增加难度。这是通过选择三元组来完成的。

他们使用 hard 的三连音。对于正例,这意味着锚点和正例之间的距离很大。对于负例,这意味着anchor和负例之间的距离很小。

他们想拥有

$$||f(x_i^a) - f(x_i^p)||_2^2 + \alpha

其中$\alpha$是margin,$x_i^a$是anchor,$x_i^p$是正面样本,$x_i^n$是负面样本。随着时间的推移,它们会增加 $\alpha$。至关重要的是,$f$ 不是在完整的 $\mathbbR^128$ 中映射图像,而是在单位球面上。否则,只需使 $f' = 2 \cdot f$ 就可以使 $\alpha$ 翻倍。

任务

人脸验证:这是同一个人吗? 人脸识别:这个人是谁?

数据集

在野外标记面部 (LFW) 上的准确率为 99.63% YouTube Faces DB 上的准确率为 95.12%

网络

评估了两个模型:Zeiler & Fergus model 和基于Inception model 的架构。

另见

DeepFace

另见

DeepFace: Closing the Gap to Human-Level Performance in Face Verification

【讨论】:

以上是关于从视频中聚类人脸的主要内容,如果未能解决你的问题,请参考以下文章

在R中聚类非常大的数据集

在python中聚类巨大的数据矩阵?

常见的5中聚类算法

scikit-learn 中聚类的混淆矩阵

5中聚类方法介绍

在 Python 中聚类约 100,000 个短字符串