| 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(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; |
| |
| 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) |
|
|
| |
| [~, ids] = sort(ls); |
| to_refine = ids(end-3:end); |
|
|
| |
| |
| 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 |