Matlab Implementation (version 2.0)of Supervised Descent Method

2015-08-14 王财勇 更多博文 » 博客 » GitHub »

机器学习

原文链接 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:

  1. 从以上链接中下载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/';
  1. 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/
  2. 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$.

  1. Do training:

    run_training();

  2. Do testing:

    do_testing();

  3. 遗憾的是,我们还是没有真正对程序优化内存和速度,我们在程序运行中发现,占内存最严重的变量是storage_init_desc(特征向量矩阵),试想以LFBW为例,训练集共有811张图片,如我们扰动初始值10次,将会产生8110个shape,若使用sift特征(4*4*8=128维),加之特征点数为68,则storage_init_desc的维数将是(128*68=8704)*8110,对其使用SVM方法,程序跑不动,内存占满。

  4. 新增函数列表

  • /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
    1. 关于上述修正细节请参考系列博文《Some improvements about SDM for face alignment 》