发新帖

C++实现和解读Face Alignment at 3000fps via Local Binary Feature

[复制链接]
4178 10
c++实现代码已经放在我的github上了,戳连接
以下是论文解读:效果见最后
1. Framework
整个流程基于Cascade Pose Regression(CVPR 2010),分为T个stage,在训练时步骤如下(testing也类似)
  • 每个stage先抽取local binary features,
  • 然后根据真实的ΔS^i 用linear regression训练一个regressor,
  • 最后用训练出来的regressor得到ΔSi(是ΔS^i的近似)去更新前一个stage的shape,得到更加精确的shape
1.1 Training Phase:
Input: Image set {I}(N samples), ground truth shapes {S^}, initial shapes set {S0}
For t=1:T do
        featuresi=ϕt(Ii,St−1i)
        ΔSi^=Si^−Si−1
        E=∑∥Si^−Rt(featuresi)∥2
        ΔSi=Rt(featuresi)
        Sti=St−1i+ΔSi
End For
1.2 Testing phase
Input: Image I, initial shape S0
Output: refined shape S
For t=1:T do #总共有T个stage
        features=ϕt(I,St−1)
        ΔS=Rt(features)
        St=St−1+ΔS
End For
2. 抽取Local Binary Features
  • 先random产生500个pixel difference features
  • 选取最具有分辨力的pixel difference features作为Random Forest中每棵树中的非叶子结点
  • 输入图片得到Local Binary Features
2.1 Pixel Difference Features
Pixel Difference Features源自CVPR 2012的一篇叫face alignment by explicity shape regression的文章。
  • Pixel Indexed Features
    face_2.jpg
    如上图,作者认为对于特定的一个landmrk,它周围的有些点是几何不变的,比如我们有一个landmark是左眼的右眼角P(x,y),在它的上方某个地方ΔP(Δx,Δy)具有不变的性质,比如附近的眉毛某点 P(x+Δx,y+Δy) 就是黑色的,这个对每个人来说都是一样,当然由于光照等其他因素的原因,这个颜色还是有很大差异的,那么作者就提出了 Pixel Difference Features
  • Pixel Difference Features
    其实很简单,就是将附近某两个点的值相减得到一个差值,而这个值很大程度上在一个阈值内浮动,而且还可以剔除光照等因素的影响,即
    feature=I(x+Δx1,y+Δy1)−I(x+Δx2,y+Δy2)

2.2 创建Random Forest
Random Forest维基链接。Random Forest由很多tree组成,相比于单棵tree能够防止模型的over fitting。Random Forest能用于regression(本文用到的功能)和classification。
那么如何建立Random Forest,主要是如何选择split node,下面以如何构建一颗regression tree为例。
  • 首先我们确定一个landmark l,随机产生在l附近的500个pixel difference features的位置,然后对training中的所有images抽取这500个features,
  • 确定要构建l的第几个棵树(其他树一样,只是训练数据不一样而已)
  • 从树根节点开始
    var = variance of landmark l of traing images,
    min_var = INFINITY, fea = -1, left_child = NULL, right_child = NULL
    For each feature f:
            threshold = random choose from all images’s feature f
            // 比如现在所有图的f的值是2,2,2,4,5,3(假设有5张图),那么随机选择threshold可能是3
            tmp_left_child = images with f < threshold
            // 左子节点为所有f小于threshold的图片
            tmp_right_child = images with f >= threshold
            tmp_var = var - var_tmp_left_child - var_tmp_right_child
            // var_tmp_left_child是左子节点landmark l的variance
            if (tmp_var < min_var) {
                    min_var = tmp_var
                    fea = f
                    left_child = tmp_left_child
                    right_child = tmp_right_child
            }
    End For
    root节点的feature位置记为fea的位置
  • 对子节点left_child和right_child做跟3一样的操作,知道达到tree的最大depth
  • landmark l的其他树也一样如上,对其他landmark和对l的操作一样
2.3 Local Binary Features
face_3.jpg
那么对于每一张图的每一个landmark的每一棵树最后都会输出一个值,如上图下方,第一棵树遍历后来到了最左边的子节点所以记为[1, 0, 0, 0],对于每一棵树访问到的叶子节点记为1,其他的记为0,然后一个landmark拥有一个forest即有多棵树,那么把所有的结果连起来就是ϕtl=[1,0,0,0,0,1,0,0,0,0,1,0,…],真正的Local Binary Features是将所有的landmark的这些feature都连起来。
ϕt=[ϕt1,ϕt2,…,ϕtL]


所以我们可以看出这是一个很稀疏的向量,中间为1的个数是所有landmark中数的总数,其余的为0。然后就是要训练一个global linear regression了
3. Learning Global Linear Regression
minWt∑i=1N∥ΔSti^−Wtϕt(Ii,St−1i)∥22+λ∥Wt∥22

对每一个landmark训练时用的都是同一个local binary features.
  • 比如对于第一个landmark的Δx坐标进行regression,输入就是所有图片的local binary feature矩阵,所有Δx坐标组成的vector作为regression target,最后可以得到一个权重向量w,然后有了新的图片,抽取它的local binary feature后,乘以w就可以得到预测的Δx值,最后加到上一个stage的x上面得到新的x
  • 对于第一个landmark的Δy也是一样,这里的local binary feature矩阵和上面Δx矩阵的一样,只是要regression的target Δy不一样,
  • 其他的landmark同上
  • 上面的公式,是讲所有的landmark的w都何在一起了,求一个整体的W
4. 效果如图:还是很不错的
initial shape
face_initial.jpg
final shape
face_final.jpg



来自群组: LBF人脸对齐讨论群

举报 使用道具

回复

精彩评论10

bemy1004  中级会员  发表于 2015-9-16 09:21:43 | 显示全部楼层
看了楼主的解析,解答了我的疑惑。多谢

举报 使用道具

回复 支持 反对
liuqunzhong  中级会员  发表于 2015-9-21 18:12:41 | 显示全部楼层
解释的非常好啊  谢谢

举报 使用道具

回复 支持 反对
bemy1004  中级会员  发表于 2015-9-22 11:15:30 | 显示全部楼层
楼主您好,我想向您请教一个问题:我训练的模型样本量为1500张(42个点),测试效果后,侧脸的匹配效果非常不准。是不是跟训练样本的姿态有关系呢?或者因为减少了特征点的数量,破坏了整体的约束呢?

举报 使用道具

回复 支持 反对
zijingping  中级会员  发表于 2015-11-12 23:34:36 | 显示全部楼层
好东西!

举报 使用道具

回复
dc0525  金牌会员  发表于 2016-1-8 17:53:50 | 显示全部楼层
写的太好了,,,

举报 使用道具

回复 支持 反对
EdifierLY  新手上路  发表于 2016-3-18 10:43:08 | 显示全部楼层
基本思路基本上对的,但细节有不少有问题,代码中是最大衰减,这儿是min。。。

举报 使用道具

回复 支持 反对
izhaolei  新手上路  发表于 2016-4-1 19:43:42 | 显示全部楼层
看看 ,感谢提供思路

举报 使用道具

回复 支持 反对
Justin  新手上路  发表于 2016-6-24 19:50:49 | 显示全部楼层
求问,知道了68个点后,怎样进行人脸的对齐,刚开始接触这个领域,求教

举报 使用道具

回复 支持 反对
fzhrong  新手上路  发表于 2016-9-17 10:40:53 | 显示全部楼层
谢谢分享谢谢分享谢谢分享谢谢分享谢谢分享

举报 使用道具

回复 支持 反对
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多

关注我们

QQ:448109455 周一至周日8:30-20:30
快速回复 返回顶部 返回列表