从视频中聚类人脸
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【讨论】:
以上是关于从视频中聚类人脸的主要内容,如果未能解决你的问题,请参考以下文章