Mnemonic Descent Method -- Face Alignment

Mnemonic Descent Method:  A recurrent process applied for end-to-end face alignment
Imperial College London, CVPR 2016

注:因为我对face alignment不熟,只是在帮同事解决代码实现中的问题的过程中了解了这个模型(同时用的caffe, 对TensorFlow不熟),更多的理解是从代码里的,因此这篇博文侧重对模型结构和实现的理解。

本文提出了一种CNN和RNN的串联 framework, 并且实现end-to-end的训练,用与 non-linear functions 的descent directions(下降方向)的学习以及face alignment。这是在face alignment 的第一个end-to-end 的CNN-RNN模型。如图1所示。


模型理解
模型主要由用于feature extraction 的CNN和后面的RNN组成。CNN模型包含两个conv layers,每层共32个filters, kernel 3*3, 且每层之后加ReLU 和2*2的max pooling.
此外,文中说为了保持更多的相对位置信息(在max pooling中可能会丢失),从第一个卷积层输出的feature map的中心crop一块出来于最后的pooling 输出拼接起来,作为输出。(但是在给出的实现代码中,是从第二个卷积层输出的feature map中crop的,而不是第一个卷积层,crop的大小是最后一个pooling输出的大小)。
RNN模型使用的是标准的RNN结构(没有用LSTM等改进的),模型参数为:4个time-steps, 1个hidden层,每层是512个units。在每个step 的hidden通过全链接映射到对descent directions 的预测。如图2所示,不过图2中是3个steps。


前向
数据即使用的是三个标注了68个基准点的(LFPW, HELEN, AFW). 
1, 首先,对训练集中的基准点求平均,最为68个初始基准点x0。
2, 以每个基准点为中心,抽取68个大小固定(本文中为24*24)的patches. 
3, 将这些patches通过CNN模型得到feature representation
4, 将feature representation作为RNN的一个step的输入,得到hidden layer的输出h,h一方面作为下个step的输出,同时经过fc输出得到此step对位置偏差的预测。
5, 重复2-4步骤4次,完成RNN的4个steps,期间每个step中CNN的权值共享,RNN自然也共享。
6, 将4个steps的输出相加,在加上基准点的初始值x0,就是此时对基准点的预测值。与真实点求平方差作为loss
需要注意的是,以上的步骤是前向的过程,并没有后向。在步骤2中,提取patches时围绕的基准点是基于上一个step中输出更新后的基准点。

关于源代码的几点注意
作者给出了基于TensorFlow实现的源代码。作者自己实现了在上述步骤2中围绕基准点抽取patches的op, 因此作者建议下载他们提供的tensorflow源码进行编译。当然如果自己已经安装好tensorflw并且不想换,可以仅下载作者自己实现的这个op的源码,名字叫extract_patches.cc,位于tensorflow/core/kernel/下。(可以参见tf官方的教程 How to Add a New Op).
此外,代码中RNN的实现并没有用tf给的类,而是用了fc的方式,即第一个step的输入于初始hidden state拼接作为正在的输入,与weight 做fc,得到h1, 将h1于下一个step的输入拼接作为真正的输入,再于weight 做fc得到h2,以此类推。同时通过tf.variable_scope的reuse进行参数共享。
    with tf.variable_scope('rnn', reuse=step>0) as scope:
            hidden_state = slim.ops.fc(tf.concat(1, [ims, hidden_state]), 512, activation=tf.tanh)
            prediction = slim.ops.fc(hidden_state, num_patches * 2, scope='pred', activation=None) 

源码地址:
https://github.com/trigeorgis/mdm





注:因为我对face alignment不熟,只是在帮同事解决代码实现中的问题的过程中了解了这个模型(同时用的caffe, 对TensorFlow不熟),更多的理解是从代码里的,因此这篇博文侧重对模型结构和实现的理解。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值