- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经运行了 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 学习和启发的。这个想法是最小化同一个人的两个图像之间的距离,并最大化与其他人图像的距离。
Large Margin Nearest Neighbor (LMNN) 正在学习一个伪度量
$$d(x, y) = (x -y) M (x -y)^T$$
其中 $M$ 是正定矩阵。伪度量和度量之间的唯一区别是 $d(x, y) = 0\Leftrightarrow x = y$ 不成立。
先展示简单的例子,然后增加难度。这是通过选择三胞胎来完成的。
他们使用硬的三胞胎。对于正例,这意味着 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$ 加倍。
评估了两个模型:Zeiler & Fergus model和基于 Inception model 的架构.
关于opencv - 从视频中聚类人脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179052/
我是一名优秀的程序员,十分优秀!