mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2025-12-30 13:02:30 +00:00
96 lines
4.0 KiB
Matlab
96 lines
4.0 KiB
Matlab
function [ shape2D, global_params, local_params, final_lhood, landmark_lhoods, view_used, early_term ] = Fitting_from_bb_multi_hyp( Image, DepthImage, bounding_box, PDM, patches, clmParams, views, early_term_params)
|
|
|
|
num_points = numel(PDM.M)/3;
|
|
|
|
shapes = zeros(num_points, 2, size(views,1));
|
|
ls = zeros(size(views,1),1);
|
|
lmark_lhoods = zeros(num_points,size(views,1));
|
|
views_used = zeros(size(views,1),1);
|
|
globals = cell(size(views,1),1);
|
|
locals = cell(size(views,1),1);
|
|
|
|
% If early termination parameters are defined use clever multi-hypothesis setup
|
|
% otherwise evaluate all of them in a simplistic manner
|
|
if(nargin > 7)
|
|
|
|
patches_small = patches(1);
|
|
patches_large = patches(2:end);
|
|
|
|
clmParams_small = clmParams;
|
|
clmParams_small.numPatchIters = 1;
|
|
clmParams_large = clmParams;
|
|
clmParams_large.regFactor = clmParams_large.regFactor(2:end);
|
|
clmParams_large.sigmaMeanShift = clmParams_large.sigmaMeanShift(2:end);
|
|
clmParams_large.tikhonov_factor = clmParams_large.tikhonov_factor(2:end);
|
|
clmParams_large.numPatchIters = 3;
|
|
clmParams_large.window_size = clmParams_large.window_size(2:end,:);
|
|
|
|
|
|
early_term = 0;
|
|
% Find the best orientation
|
|
for v = 1:size(views,1)
|
|
[shapes(:,:,v),globals{v},locals{v},ls(v),lmark_lhoods(:,v),views_used(v)]...
|
|
= Fitting_from_bb(Image, DepthImage, bounding_box, PDM, patches_small, clmParams_small, 'orientation', views(v,:));
|
|
|
|
ls(v) = ls(v) * early_term_params.weights_scale(views_used(v)) + early_term_params.weights_add(views_used(v));
|
|
|
|
if(ls(v) > early_term_params.cutoffs(views_used(v)))
|
|
early_term = v;
|
|
[shape,global_params,local_params,final_lhood,landmark_lhoods,view_used]...
|
|
= Fitting_from_bb(Image, DepthImage, bounding_box, PDM, patches_large, clmParams_large, 'gparam', globals{v}, 'lparam', locals{v});
|
|
break;
|
|
end
|
|
end
|
|
|
|
if(early_term == 0)
|
|
|
|
% Discard the really unreliable starts
|
|
[~, ids] = sort(ls);
|
|
to_refine = ids(end-3:end);
|
|
|
|
% If there are any starts left try refining them in a
|
|
% multiscale approach
|
|
if(~isempty(to_refine))
|
|
shapes = zeros(num_points, 2, numel(to_refine));
|
|
ls = zeros(numel(to_refine),1);
|
|
lmark_lhoods = zeros(num_points,numel(to_refine));
|
|
views_used = zeros(numel(to_refine),1);
|
|
globals_n = cell(size(to_refine,1),1);
|
|
locals_n = cell(size(to_refine,1),1);
|
|
ind = 1;
|
|
for v = to_refine'
|
|
[shapes(:,:,ind), globals_n{ind}, locals_n{ind},...
|
|
ls(ind),lmark_lhoods(:,ind),views_used(ind)] ...
|
|
= Fitting_from_bb(Image, DepthImage, bounding_box, PDM, patches_large, clmParams_large, 'gparam', globals{v}, 'lparam', locals{v});
|
|
ind = ind+1;
|
|
end
|
|
end
|
|
|
|
% TODO aggregation?
|
|
[final_lhood, v_ind] = max(ls);
|
|
landmark_lhoods = lmark_lhoods(:,v_ind);
|
|
global_params = globals_n{v_ind};
|
|
local_params = locals_n{v_ind};
|
|
shape = shapes(:,:,v_ind);
|
|
view_used = views_used(v_ind);
|
|
end
|
|
shape2D = shape;
|
|
else
|
|
|
|
% Find the best orientation
|
|
for v = 1:size(views,1)
|
|
[shapes(:,:,v),globals{v},locals{v},ls(v),lmark_lhoods(:,v),views_used(v)] = Fitting_from_bb(Image, [], bounding_box, PDM, patches, clmParams, 'orientation', views(v,:));
|
|
end
|
|
|
|
[final_lhood, v_ind] = max(ls);
|
|
landmark_lhoods = lmark_lhoods(:,v_ind);
|
|
|
|
global_params = globals{v_ind};
|
|
local_params = locals{v_ind};
|
|
|
|
shape2D = shapes(:,:,v_ind);
|
|
view_used = views_used(v_ind);
|
|
|
|
end
|
|
|
|
end |