人脸验证算法Joint Bayesian详解及实现(Python版)

Tags: JointBayesian DeepLearning Python

本博客仅为作者记录笔记之用,不免有很多细节不对之处。

还望各位看官能够见谅,欢迎批评指正。

博客虽水,然亦博主之苦劳也。

如对代码有兴趣的请移步我的 Github。 
如需转载,请附上本文链接,不甚感激! 
http://blog.csdn.net/cyh_24/article/details/49059475


Bayesian Face Revisited: A Joint Formulation

============================

研究人脸识别方向快一年多了,虽没有什么大的成果,不过总归还算有些许小收获。 
在下不才,未能像师兄张雨石 那般洋洋洒洒写下DeepID人脸识别算法之三代 之类的深度好文。只好另辟蹊径,走走少有人走的路,哈哈!(注:本文乃大水文,大神请勿逗留)。

我们知道,人脸识别有两个大方向:

  1. Face Verification,判断两张人脸是否为同一个人。
  2. Face Identification,从一个人脸库中找到给定的这张人脸对应的身份。

本文要重点介绍的Joint Bayesian 就是用来实现第一个(face verification)功能的。本文主要是针对Bayesian Face Revisited: A Joint Formulation 这篇文章的笔记。这篇论文仅通过高维LBP跟Joint Bayesian这两个方法结合,就把LFW 数据集上的人脸验证准确率轻松刷到了92.4%. 香港中文大学团队的DeepID2将七个联合贝叶斯模型使用SVM进行融合,最终达到了99.15%的结果。


一个Naive的想法

如果这个任务交给你,你最开始会怎么想?如何判断两张图片是否为同一个人?

  • 提取这两张图片的特征,然后得出两张图片的差异? -
  • 通过差异来判断,差异为何种情况时为同一个人,否则为不同人?

我们假装专业一点,用x1,x2 分别表示两张图片,Hi表示这两张图片为intra-personal(同一个人),用 He 表示extra-personal(不同人)。用 △ 表示 x1-x2 (两者差异)。

假装我们能够写下如下公式(反正我肯定写不出来):

这里S(△)就是关于差异△的函数,如果:

  • S(△) >=Thresold: 为同一个人;
  • S(△) < Thresold: 非同一个人;

如果你了解一点 MAP(Maximum a Posterior, 最大后验假设),那么上面的复杂的式子就可以转化成近似求一个对数似然比(结果差别不大,但是运算速度大幅提高,最重要的是式子简单很多有没有。。。):

问题转换为如下,如果:

  • 如果P(△|Hi)很大,P(△|He)很小,ratio值很大,则判断为同一个人;
  • 如果P(△|Hi)很小,P(△|He)很大,ratio值很小,则判断为不同人;
  • 但是,若两者同时很小,或同时很大,这会造成一个分类错误,结果无法断定。这种情况如下图所示:

从上图中可以看到,2-D的数据通过差分x-y映射到1-D上。O附近的点交错在一起, 使得在O附近的Class-1 和Class-2 无法区分开来。这就是我们这个Naive想法的缺陷了。


A Naive Bayesian

如果上面的想法能够再Naive一点,再理想化一点,我们假设(x1, x2)服从高斯分布,那么就有:

  • P(x1, x2|Hi) = N(0, ∑I),
  • p(x1, x2|He) = N(0, ∑E)

再用R来求验证x1, x2的相似性。其中 ∑I 和 ∑E 分别是同一个人和不同人的协方差矩阵。 
这就是Naive Bayesian方法了,这样得到的结果会比传统的贝叶斯脸要好。

上面的这种方法是从统计数据中直接训练得到协方差矩阵∑I,∑E。有两个因素可能会限制效果:

  1. 我们假设人脸特征为d维的特征,而我们需要从更高的维度空间(2d)中计算出协方差矩阵,由于训练缺乏足够多的独立的训练数据,所以我们得到的可能是一种不可靠的统计结果。
  2. 由于数据集中训练样本不完全独立,因此∑E有可能不是(blockwise)块对角线矩阵。而上面的公式中要求x1,x2必须相互独立。

A joint formulation

看到下面这张图片,你有没有什么灵感?提示:左图为不同人的脸部特征分布情况,右图为同一个人的脸部特征分布情况:

从上图可以得出,一个人脸由两部分组成:identity 和 intra-personal variation。 identity 用来区分不同人,intra-personal variation 是同一个人在不同姿态下的差异。我们用 μ 来表示identity,用 ε 表示intra-personal variation(包括:光线,姿态,表情等变化),那么人脸x就可以用如下公式定义了: 

上式中,这两个潜在变量 μ 和 ε 分布服从两个高斯分布:N(0, Sμ) 和 N(0, Sε)。简要来说,上面的表达式包括附加的一些假设可以作为一个人脸的先验知识。

Joint formulation with prior

有了上面的先验知识,就可以得到一个均值为0的高斯联合分布{x1,x2}。若 μ 和 ε 是相互独立的,那么我们就可以得到两张人脸特征的协方差如下: 

1. 在 Hi的假设前提下 
此时,μ1 和 μ2 是相同的,并且ε1 和 ε2 是独立的。 
因此P(x1, x2|Hi)分布的协方差矩阵就可以按照如下计算:

2. 在 He的假设前提下 
此时,μ 和ε 都是独立的。 
因此P(x1, x2|He)分布的协方差矩阵就可以按照如下计算:

有了上面的两种情况下的联合概率,相应的对数似然比 r(x1,x2) 就可以在简单的代数变换之后得到(其实博主一点都不觉得简单,但是我们还是要假装很轻松的样子。。。。):

注意:这式子(4)中,为了简单处理,常数项被省略。在这个对数似然比矩阵中,还有三个有趣的特性,读者有兴趣的可以再读一读原文附件的一些材料: 
—-> 1. 矩阵 A 和 G 都是非负半正定矩阵 
—-> 2. 如果 A = G, 那么这个对数似然比就降为马氏距离 
—-> 3. 特征在经过任何的满秩的线性变化之后,这个对数似然比矩阵都是不变的


Model Learning

上面的一大堆可能你并没有看懂推导过程的式子,主要在告诉我们一件事情:

如果两个潜在变量 μ (identity) 和 ε (intra-personal variance) 分布服从两个高斯分布:N(0, Sμ) 和 N(0, Sε), 那么,对数似然比r(x1,x2)就可以通过两个协方差矩阵 Sμ 和 Sε 计算得到。

所以,现在的任务就是训练模型来求这两个未知的 Sμ 和 Sε .

我们可以很简单地利用经典的 LDA (线性判别分析) 来求出这两个类内跟类间的协方差矩阵,实际上,使用这个LDA方法,你还是能够得到一个比较不错的结果了。但是,为了得到更高精度的准确率,我们的模型采用的是一个类 EM 算法来求解。这里就按照EM算法的两步走来介绍:

E-step (期望步骤)

假设每个人有m 张图片,那么x=[x1;…x;m], 相应的潜在变量就是 h=[μ ;ε1;…;εm],h 与 x 的关系如下: 

总结一下,首先通过已知的协方差矩阵Sμ 和 Sε 求解对应的F和G,然后由F,G,去求解对应的 μ 和 ε .

M-step (最大化步骤)

在这个步骤中,我们的目标是更新参数值Θ={Sμ, Sε}:

这里的 μ 和 ε 是E-step 阶段的结果。 
不断重复E-step 跟M-step过程,直到Sμ, Sε收敛。

Initialization (初始化)

在代码实现中,μ 和 ε 是通过随机的正定矩阵初始化得到。例如,你可以从随机的一些数据中得到协方差矩阵当做初始值。

Verify(对数似然比的计算)

对数似然比ratio 的计算公式如下:

得到这个ratio之后,如果 ratio >= 阈值,则认为是同一个人;否则不是同一个人。


算法实现(Python版)

已经在网上看到有人实现了matlab版本的joint bayesian,不过因为我们实验室一直是python的天下,所以简单的照着matlab版本,用numpy实现了一把。

我把代码都放到了github上,而且里面有完整的使用说明和实验报告。

所以这里就不贴代码了。这里就简单贴一个算法的大致流程图:

 
图片引用自[网络](http://blog.csdn.net/hqbupt/article/details/37758627)

对代码有兴趣的请移步我的 Github. 
代码只是实验用,写的并不好,勉强能运行,欢迎拍砖!


参考文献

[1]. D.Chen, X.Cao, L.Wang, F.Wen, and J.Sun. Bayesian face revisited: A joint formulation.In Proc. ECCV, 2012.
[2]. http://blog.csdn.net/csyhhb/article/details/46300001
[3]. http://www.zhihu.com/question/28086678
[4]. http://blog.csdn.net/hqbupt/article/details/37758627

from: http://blog.csdn.net/cyh_24/article/details/49059475

【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)相关推荐

  1. 人脸识别SeetaFace2原理与代码详解

    人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...

  2. 人脸识别系列三 | MTCNN算法详解上篇

    前言 我们前面分享了PCA,Fisher Face,LBPH三种传统的人脸识别算法,Dlib人脸检测算法.今天我们开始分享一下MTCNN算法,这个算法可以将人脸检测和特征点检测结合起来,并且MTCNN ...

  3. baseline发布!OPPO安全AI挑战赛,人脸识别对抗攻击赛题详解

    baseline线上评测101.53分,文末附项目github地址. 今年6月,由OPPO发起,OPPO安全主办的"OPPO安全AI挑战赛"正式拉开序幕.比赛主要聚焦人脸识别场景中 ...

  4. MATLAB人脸识别系统设计与仿真【GUI解界面】

    MATLAB人脸识别系统设计与仿真[GUI解界面] 第一章 绪论 本章提出了本文的研究背景及应用前景.首先阐述了人脸图像识别意义:然后介绍了人脸图像识别研究中存在的问题:接着介绍了自动人脸识别系统的一 ...

  5. 人脸识别_云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案

    云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案 人脸识别闸机-人脸识别闸机解决方案 软硬一体的人脸识别闸机解决方案,提升人员系统化管理的安全性与便捷性 方案构成 针对人员出入的闸机及门禁场 ...

  6. 虹软人脸识别 - 人脸特征数据的存取

    虹软人脸识别 - 人脸特征数据的存取 文章目录 虹软人脸识别 - 人脸特征数据的存取 一.简介 二.数据库应用 1. 连接数据库 2. 建表 3. 注册人脸并保存其特征值到数据库 4. 获取人脸特征数 ...

  7. 人脸反光识别和读数识别_云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案...

    云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案 人脸识别闸机-人脸识别闸机解决方案 软硬一体的人脸识别闸机解决方案,提升人员系统化管理的安全性与便捷性 方案构成 针对人员出入的闸机及门禁场 ...

  8. K210人脸识别+人脸信息存储

    K210系列教程 使用MaixPy IDE开发K210 K210实现人脸识别(附代码解读) K210人脸识别+人脸信息存储 K210人脸识别+RFID录入信息 在我的上一篇博客中已经介绍了如何使用K2 ...

  9. 微信小程序公众号支付宝小程序的登录授权、支付、分享、人脸识别人脸核身

    文章目录 一.微信小程序 1. 获取信息用户信息 2.支付 3.分享 4. 腾讯云小程序人脸核身 二.微信公众号 1.获取信息用户信息 2.支付 3. 分享(普通分享) 4.分享(vue单页面 配置分 ...

最新文章

  1. docker 配置使用宿主机的GPU(ubuntu16.04+cuda10.0+cudnn7)
  2. python2 float类型_Python学习笔记2:基本数据类型
  3. 如何将读书与自己的生活工作结合起来?
  4. python源码精要(3)-C代码规范
  5. php中把美国时间转为北京时间的自定义
  6. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<1>python)
  7. 比较两个listString是否相等
  8. bLue的字符串游戏
  9. 菜鸟教程 Python100例答案
  10. 有才的人全败给“傲”,平庸的人皆输在“懒”!
  11. linux 远程启动带gui程序,通过 ssh 运行 远程linux GUI 的方法.
  12. 指南|查询美国的关税清单
  13. 互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率
  14. vr计算机方面的应用,AR和VR到底有什么区别,分别应用在哪些方面?
  15. Charles ——抓包工具安装与(Charles与浏览器)配置(Python爬虫必备神器)
  16. 这么多编程学习网站,总有一个适合你吧
  17. FCN训练不收敛的原因分析和最详细的FCN训练与测试自己的数据程序配置
  18. Web前端面试指导(完结)
  19. GG_DSG_Shareplex对比
  20. Trucksim+Prescan+Simulink联合仿真笔记(Carsim同理)

热门文章

  1. Spring MVC-06循序渐进之Converter和Formatter
  2. Quartz-Spring集成Quartz通过XML配置的方式
  3. 【二叉树详解】二叉树的创建、遍历、查找以及删除等-数据结构05
  4. SQLite3单例模式(C++)
  5. linux上用的端口转发工具,Linux中的快速端口转发工具—rinetd
  6. mysql 修改字段为1-10的随机数
  7. Go语言defer详解
  8. python 栈的压入弹出序列
  9. IP地址中的网络地址和主机地址分别是什么意思?怎么计算的呢?
  10. python语句分为复合语句_复合语句if条件的Python求值