您的位置:首页 > 编程语言 > MATLAB

SDM For Face Alignment流程介绍及Matlab代码实现之测试篇

2015-08-06 00:22 489 查看
测试很简单了,只需要载入数据,然后做正则化处理,使用训练模型产生的{Rk}\{R_k\},就可以预测特征点了。

face_alignment.m:用来预测特征点

function shape = face_alignment( ShapeModel, DataVariation,...
LearnedCascadedModel, Data, img, shape, options )

%% setup the fixed parameters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nData = length(Data);
shapeDim = size(ShapeModel.MeanShape,1);
n_init_randoms_test = options.n_init_randoms_test;

MeanShape2 = vec_2_shape(ShapeModel.MeanShape);

aligned_shape = zeros(n_init_randoms_test,shapeDim);

%% detect the face region using face detectors or ground-truth %%%%%%%%%%%%
%% if using ground-truth
boxes = detect_face( img , options );
%% predict the face box
bbox2 = get_correct_region2( boxes, shape,img, 1 );
bbox= [];

if isempty(bbox)
%% if using ground-truth
bbox = getbbox(shape);
end

%% randomize n positions for initial shapes
[rbbox] = random_init_position( ...
bbox, DataVariation, n_init_randoms_test );
[rbbox2] = random_init_position( ...
bbox2, DataVariation, n_init_randoms_test );
%% randomize which shape is used for initial position
rIdx = randi([1,nData],n_init_randoms_test);

%% iterations of n initial points %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for ir = 1 : n_init_randoms_test

%% get random positions and inital shape indexs
idx    = rIdx(ir);
init_shape = Data(idx).shape; %% get randomly shape from others
cbbox  = rbbox(ir,:);
cbbox2  = rbbox2(ir,:);
%init_shape = resetshape(cbbox, init_shape);
init_shape = resetshape(cbbox, MeanShape2);
init_shape2 = resetshape(cbbox2, MeanShape2);
%test box between  ground-truth and face detector
if 0
figure(1); imshow(img); hold on;
draw_shape(init_shape(:,1), init_shape(:,2),'r');
draw_shape(init_shape2(:,1), init_shape2(:,2),'g');
hold on;
rectangle('Position',  cbbox, 'EdgeColor', 'y');
rectangle('Position',  cbbox2, 'EdgeColor', 'k');
hold off;
pause;
end

%% detect landmarks using cascaded regression
aligned_shape(ir,:) = cascaded_regress( ShapeModel, ...
LearnedCascadedModel, img, init_shape, options );

end
if n_init_randoms_test == 1
shape = vec_2_shape(aligned_shape');
else
shape = vec_2_shape(mean(aligned_shape)');
end

end


我们来看一下效果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: