opencv - 从视频中聚类人脸

标签 opencv computer-vision cluster-analysis face-recognition feature-extraction

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

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

最佳答案

我建议看看

FaceNet: A Unified Embedding for Face Recognition and Clustering

我的 shortscience summary (如果你想看到正确呈现的数学部分,请去那里):

FaceNet 直接将人脸图像映射到 $\mathbb{R}^{128}$,其中距离直接对应于人脸相似度的度量。他们使用三元组损失函数。三元组是(A 的脸,A 的另一张脸,不是 A 的人的脸)。后来,这个叫做(anchor, positive, negative)。

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

LMNN

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

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

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

类(class)学习:三元组选择

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

他们使用的三胞胎。对于正例,这意味着 anchor 和正例之间的距离很大。对于负例,这意味着 anchor 和负例之间的距离很小。

他们想要拥有

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

其中 $\alpha$ 是边距,$x_i^a$ 是 anchor ,$x_i^p$ 是正面示例,$x_i^n$ 是反面示例。随着时间的推移,它们会增加 $\alpha$。至关重要的是,$f$ 映射的图像不是在完整的 $\mathbb{R}^{128}$ 中,而是在单位球体中。否则,只需使 $f' = 2\cdot f$ 即可将 $\alpha$ 加倍。

任务

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

数据集

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

网络

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

另见

另见

关于opencv - 从视频中聚类人脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179052/

相关文章:

scala - 如何查看应用 K-Means 算法后添加到集群中的数据点?

c++ - _cvLoadImage undefined symbol 链接问题

c++ - 如何使用opencv在图像中绘制矩形?

python - cv2.HoughCircles 找不到循环时

matlab - 用于分割嘴唇的Haar分类器

r - 使用大型数据集确定 k 均值的最佳簇数

python - 如何知道边界框(矩形)是否位于另一个边界框(矩形)内?

c++ - 解析旋转矩阵以获得角度

opencv - 对于 ARUCO 董事会估算来说,这是正常的不稳定程度吗? (视频示例)

lua - Torch 中的集群