基于LBP的Face Verification(人脸验证)算法
最近读了一篇有关人脸验证的CVPR paper:Boosted Multi-Task Learning for Face Verification With Applications toWeb Image and Video Search。这是我第一次系统地学习整个论文并复现算法,值得纪念一下哈哈哈哈哈哈。现将文章的内容整理如下,也方便日后自己回顾。
- 文章背景
- 提出的方案
- 不足之处
- matlab代码
文章背景
大家知道现在的搜索方法大多数是文本搜索,当我们想要一些某个明星的照片时,输入他的名字,排在前面的搜索结果可能能满足我们的要求,然而越到后面结果就差强人意,这说明文本搜索的精确度并不高。再比如我们在YouTube上搜索Taylor Swift,在所有的搜索结果中,有些视频只是在节目中提及了她却根本看不到她的人。在这些情况下,face recognition会大幅提高搜索结果的准确性。
face verification,人脸验证,就是判断两张图片是否为同一个人,当应用到搜索时,就是看搜索结果中视频/图片里的人是不是和给定图片里的人是同一个人。
提出的方案
现如今人脸识别仍面临着很多挑战,诸如人的表情变化、拍摄角度、光照条件和遮盖物的影响,在图像/视频检索中,尤其面临训练样本不足易导致过拟合的问题。在本文中,主要基于两方面来提出解决方案:
(1). 用什么特征表示人脸;
(2). 基于已有的特征表示方法如何设计分类器。
LBP作为特征
LBP—Local Binary Pattern局部二值模式,可用来表示人脸的局部纹理特征,具有灰度不变性。最原始的LBP如下:
LBP的基本思想是对图像的像素和它局部周围像素进行对比后的结果进行求和。把这个像素作为中心,对邻域的像素进行阈值比较。如果相邻像素的灰度值大于等于中心像素的灰度,把他标记为1,否则标记为0。你会用二进制数字来表示每个像素,比如11001111。因此,由于周围相邻8个像素,你最终可能获取2^8=256种可能组合,被称为局部二值模式,有时被称为LBP码。上图表示的LBP算子实际使用的是3*3的邻域。
一个像素对应一个LBP码,图像里一个区域块的所有像素的LBP码对应一个直方图,每一个模式对应一个bin。
uniform pattern:
当像素的LBP码的二进制表示中,0、1之间的跳变不大于2次则将此pattern称为uniform pattern。如11000000是uniform patt,而10101010不是uniform pattern。有人发现在所有的pattern里,有90%都是uniform pattern,故可直接用uniform pattern表示特征。一共有58种uniform pattern。
旋转不变的pattern:
原始的LBP不具有旋转不变性,若在像素的所有pattern中,选取最小值作为它的LBP码,这样我们就提出了旋转不变的LBP模式,共有8种。
设计分类器
(1)Adaboost learning with LBP patterns
利用boosting选择LBP的单个bin作为特征并分类。先经过LBP计算特征
F=f1,,...,fl
F
=
f
1
,
,
.
.
.
,
f
l
,再送入Adaboost分类器,它主要完成三方面的工作:从特征集中选择有效特征;基于选择的特征设计分类器;不断将弱分类器集成为强分类器。具体算法如下:
Boosted Multi-Task Learning
在训练样本较少的情况下,若对每个人都单独训练一个分类器则很容易导致过拟合,而如果对所有人仅训练一个分类器则会导致效果不是很好,不能很好地学习到每个人的特征。这时考虑使用Multi-Task Learning(多任务学习),对有共同特征的人只训练一个分类器,这样不仅使得分类效果更好,还会使算法更高效。具体算法如下: