Matlab Implementation (version 2.0)of Supervised Descent Method
原文链接 http://wangcaiyong.com/2015/08/14/sdm/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
我们下载了Github上的代码,并仔细阅读了其中的细节。最后我们对源代码做了一些修正(新代码已上传到Github),主要包括:
- 修复了代码运行中出现的一些bug
- 添加了一些函数,使代码更简洁
- 训练阶段我们采用了分批处理,优化了内存
- 参考论文《Extended Supervised Descent Method for Robust Face Alignment》,优化了源程序
- 在测试阶段,我们使用了逆的缩放和平移变换将得到的aligned_shape 转换为原始图片的特征点true_shape
- 添加了详细的注释,使之更容易明白。
<!--more-->
Dependency:
- Vlfeat library: http://www.vlfeat.org/ 提供了hog/sift特征函数,程序默认使用hog特征,如果要使用sift特征,你可以使用xx_sift.m提供的接口(见commom/desc/xx_sift.m).如果使用Vlfeat的sift,你需要修改程序。因为程序默认的sift接口为xx_sift.m
- libLinear: http://www.csie.ntu.edu.tw/~cjlin/liblinear/ 使用其提供的svm方法计算超定方程组的根
- mexopencv: https://github.com/kyamagu/mexopencv 使用其提供的人脸检测程序(不过程序中我们一般以ground_truth的特征点的包围盒替代,更准确)
Datasets in use:
[300-W] http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/ 该数据集仅提供了68个特征点的数据,也就是w300类型的数据
How to use:
- 从以上链接中下载300-W数据(i.e. LFPW),并放在"./data" 文件夹下。 然后纠正setup.m中的数据集的路径
For example:
options.trainingImageDataPath = './data/lfpw/trainset/';
options.trainingTruthDataPath = './data/lfpw/trainset/';
options.testingImageDataPath = './data/lfpw/testset/';
options.testingTruthDataPath = './data/lfpw/testset/';
- Download and install dependencies: libLinear, Vlfeat, mexopencv, put into "./lib" folder and compile if necessary. Make sure you already addpath(...) all folders in matlab. Check and correct the library path in setup.m. 安装方法分别见: libLinear:http://m.blog.csdn.net/blog/tiandijun/40929563 Vlfeat:http://www.cnblogs.com/woshitianma/p/3872939.html mexopencv:http://wangcaiyong.com/2015/07/14/mexopencv/
- If you run first time. You should set these following parameters to learn shape and variation. For later time, reset to 0.
options.learningShape = 1; options.learningVariation = 1; 说明:第一个变量learningShape学习了数据集的平均特征点;第二个变量learningVariation学习了true_shape与mean_shape的包围盒之间差值(一个box包含四个变量x,y,width,height)的均值和方差,后期用在扰动产生更多的初始变量$x_0$.
Do training:
run_training();
Do testing:
do_testing();
遗憾的是,我们还是没有真正对程序优化内存和速度,我们在程序运行中发现,占内存最严重的变量是storage_init_desc(特征向量矩阵),试想以LFBW为例,训练集共有811张图片,如我们扰动初始值10次,将会产生8110个shape,若使用sift特征(4*4*8=128维),加之特征点数为68,则storage_init_desc的维数将是(128*68=8704)*8110,对其使用SVM方法,程序跑不动,内存占满。
新增函数列表
- /common/cropImage/cropImage.m
- /common/desc/xx_sift.m
- /common/flip/flipImage.m
- /common/io/write_w300_shape.m
- /source/train/learn_single_regressor2.m
- 关于上述修正细节请参考系列博文《Some improvements about SDM for face alignment 》