首先按照源码中read me配置。可能运行出错的部分,用黄字高亮了解决方案。
以下分别解说训练和测试代码。
====训练部分===============
l learnCFSS.m为核心训练文件。需要顺序运行getParametricModels;addAll; learnCFSS;
运行需要matlabpool。如果数据N<100,则不启动并行。如果没有并行工具箱,可以手工修改代码不启动并行。
至少需要约900个样本,才能通过PCA部分的数量断言。需要较大内存要求。
poseVoting.m中使用dist函数,需要神经网络工具箱。如果没有该工具箱,可以手工添加dist函数。
至少需要约2700个样本,才能通过traintestP.m中,训练SVC时的数量断言。
traintestP.m中调用了libsvm的函数svmtrain。未避免调用到VLFEAT中的同名函数,在进入这部分之前,先去除VLFEAT的路径,之后再添加上。
learnCFSS
各种load |
|
for level = 1:stageTot 实际只用3次迭代 |
|
|
% Re-trains仅在第一次迭代调用 |
trainingSetGeneration:返回旋转对齐图像(images),生成平均脸(referenceShape),图像旋转回归器B,对齐变换T。 Pr:先验概率。,N *N,每行对应一个原始样本,表示取得每一个原始样本的概率。设定为均匀分布,对角线零,其他位置均等。 model.tpt:当前level目标形状。N*2L。用来在测试时依照概率生成样本。 |
|
主要作用:归一化样本 |
|
% from Pr to sub-region center |
|
traintestReg:生成回归模型regModel和当前形状currentPose(相当于论文中sub-region center)。 T:当前形状到平均脸(referenceShape)的变换 images:用T进一步更新图像 model.tpt:当前level目标性状,记为targetPose。 |
|
主要作用:根据概率Pr,生成扩展初始值,用回归器移动形状,得到currentPose。 |
|
% Train-test Pr |
|
traintestP:估计当前各个训练图像上,各个训练集形状的概率Pr。 |
|
|
trainingsetGeneration
只在第一次迭代调用
% 输入 |
||
|
||
% Loading original images |
||
Tb:每个原始图像中simple face(左右眼角左右嘴角)到标准形状的变换。N*2L。其中标准形状为target_simple_face(0-1之间)放大到priorsInfo.win_size(250*250)。 targetPose:旋转到标准simple shape之后的L个关键点。 referenceShape:平均形状。 |
||
% Label angle estimation according to targetPose |
||
Te:每一个targetPose(已经粗略旋转过)到referenceShape(平均形状)的变换。是一个较小较精细的变换。 angle:Te变换的旋转角度。 |
||
% Dataset partition |
||
set_id:N*1。把所有原始数据随机分成均等两组。用于训练两个旋转角度回归器。 |
||
% Training |
||
B:两个角度回归器。互为校验。 |
||
for s = 1:2 分别使用两组数据训练B{s} |
||
|
Tb_train:本次训练中,从原始图像到标准形状的变换。 angle_train:本次训练中,从粗略旋转到精细旋转的变化角度。 mp:用于本次训练的样本数。约为N/2。 MP:扩展后的样本数。扩展10倍(priorsInfo.augTimes)。 im:本次训练中,原始图像经过旋转得到的augment结果。N/2*扩展数。 label:扩展样本的随机旋转角度,最大旋转45°(priorsInfo.maxRoll)。 |
|
for i = 1: augTimes |
||
</ |