function [patches] = Load_Patch_Experts( col_patch_dir, col_patch_file, depth_patch_dir, depth_patch_file, clmParams) %LOAD_PATCH_EXPERTS Summary of this function goes here % Detailed explanation goes here colourPatchFiles = dir([col_patch_dir col_patch_file]); % load all of the pathes for i=1:numel(colourPatchFiles) load([col_patch_dir, colourPatchFiles(i).name]); % determine patch type (slightly hacky but SVR patch experts don't % CCNF ratio variable) if(isfield(normalisationOptions, 'ccnf_ratio')) patch = struct; patch.centers = centers; patch.trainingScale = trainingScale; patch.visibilities = visiIndex; patch.patch_experts = patch_experts.patch_experts; patch.correlations = patch_experts.correlations; patch.rms_errors = patch_experts.rms_errors; patch.modalities = patch_experts.types; patch.multi_modal_types = patch_experts.types; patch.type = 'CCNF'; % Knowing what normalisation was performed during training is % important for fitting patch.normalisationOptionsCol = normalisationOptions; % As the similarity inverses will depend on the window size % and alphas and betas, but not actual data, precalculate % them here % create the similarity inverses window_sizes = unique(clmParams.window_size(:)); for s=1:size(window_sizes,1) for view=1:size(patch.patch_experts,1) for lmk=1:size(patch.patch_experts,2) if(visiIndex(view, lmk)) num_modalities = size(patch.patch_experts{view,lmk}.thetas,3); num_hls = size(patch.patch_experts{view,lmk}.thetas,1); patchSize = sqrt(size( patch.patch_experts{view,lmk}.thetas,2)-1); patchSize = [patchSize, patchSize]; % normalisation so that patch expert can be % applied using convolution w = cell(num_hls, num_modalities); norm_w = cell(num_hls, num_modalities); for hl=1:num_hls for p=1:num_modalities w_c = patch.patch_experts{view,lmk}.thetas(hl, 2:end, p); norm_w_c = norm(w_c); w_c = w_c/norm(w_c); w_c = reshape(w_c, patchSize); w{hl,p} = w_c; norm_w{hl,p} = norm_w_c; end end patch.patch_experts{view,lmk}.w = w; patch.patch_experts{view,lmk}.norm_w = norm_w; similarities = {}; response_side_length = window_sizes(s) - 11 + 1; for st=1:size(patch.patch_experts{view,lmk}.similarity_types, 1) type_sim = patch.patch_experts{view,lmk}.similarity_types{st}; neighFn = @(x) similarity_neighbor_grid(x, response_side_length(1), type_sim); similarities = [similarities; {neighFn}]; end sparsities = {}; for st=1:size(patch.patch_experts{view,lmk}.sparsity_types, 1) spFn = @(x) sparsity_grid(x, response_side_length(1), patch.patch_experts{view,lmk}.sparsity_types(st,1), patch.patch_experts{view,lmk}.sparsity_types(st,2)); sparsities = [sparsities; {spFn}]; end region_length = response_side_length^2; [ ~, ~, PrecalcQ2sFlat, ~ ] = CalculateSimilarities_sparsity( 1, {zeros(region_length,1)}, similarities, sparsities); PrecalcQ2flat = PrecalcQ2sFlat{1}; SigmaInv = CalcSigmaCCNFflat(patch.patch_experts{view,lmk}.alphas, patch.patch_experts{view,lmk}.betas, region_length, PrecalcQ2flat, eye(region_length), zeros(region_length)); if(s == 1) patch.patch_experts{view,lmk}.Sigma = {inv(SigmaInv)}; else patch.patch_experts{view,lmk}.Sigma = cat(1, patch.patch_experts{view,lmk}.Sigma, {inv(SigmaInv)}); end end end end end if(i==1) patches = patch; else patches = [patches; patch]; end else % creating the struct patch = struct; patch.centers = centers; patch.trainingScale = trainingScale; patch.visibilities = visiIndex; patch.type = 'SVR'; % if the normalisation options present in the loaded patch use % them, if not we use default values if(exist('normalisationOptions', 'var')) patch.normalisationOptionsCol = normalisationOptions; else patch.normalisationOptionsCol = normalisationColour; end % default for depth uses normalised-cross-corr per each sample, % rather than in a broad area if(~isfield(patch.normalisationOptionsCol, 'useZeroMeanPerPatch')) patch.normalisationOptionsCol.zscore = 0; patch.normalisationOptionsCol.useNormalisedCrossCorr = 1; patch.normalisationOptionsCol.useZeroMeanPerPatch = 1; end % Multi-modal section patch.patch_experts = cell(size(visiIndex,1), size(visiIndex,2)); for view=1:size(visiIndex,1) for landmark=1:size(visiIndex,2) patch.patch_experts{view, landmark} = struct; multi_modal_types = patch_experts.types; for p=1:numel(patch_experts.types) patch.patch_experts{view, landmark}(p).type = patch_experts.types(p); patch.patch_experts{view, landmark}(p).correlations = patch_experts.correlations(p); patch.patch_experts{view, landmark}(p).rms_errors = patch_experts.rms_errors(p); patch.patch_experts{view,landmark}(p).scaling = patch_experts.patch_experts{p}(view, landmark, 1); patch.patch_experts{view,landmark}(p).bias = patch_experts.patch_experts{p}(view, landmark, 2); patch.patch_experts{view,landmark}(p).w = reshape(patch_experts.patch_experts{p}(view, landmark, 3:end),11,11); end end end patch.multi_modal_types = multi_modal_types; if(i==1) patches = patch; else patches = [patches; patch]; end end clear 'normalisationOptions, centers, trainingScale, visiIndex, correlations, rmsErrors'; end if(~isempty(depth_patch_file)) depthPatchFiles = dir([depth_patch_dir depth_patch_file]); % load all of the depth patches for i=1:numel(depthPatchFiles) load([depth_patch_dir, depthPatchFiles(i).name]); % assuming that same view seen in depth and intensity % if the normalisation options present in the loaded patch use % them, if not we use default values if(exist('normalisationOptions', 'var')) patches(i).normalisationOptionsDepth = normalisationOptions; else patches(i).normalisationOptionsDepth = normalisationDepth; end % Multi-modal section patches(i).patch_experts_depth = cell(size(visiIndex,1), size(visiIndex,2)); for view=1:size(visiIndex,1) for landmark=1:size(visiIndex,2) patches(i).patch_experts_depth{view, landmark} = struct; if(exist('patch_m', 'var')) multi_modal_types = patch_m.types; for p=1:numel(patch_m.types) patches(i).patch_experts_depth{view, landmark}(p).type = patch_m.types(p); patches(i).patch_experts_depth{view, landmark}(p).correlations = patch_m.correlations(p); patches(i).patch_experts_depth{view, landmark}(p).rms_errors = patch_m.rms_errors(p); patches(i).patch_experts_depth{view,landmark}(p).scaling = patch_m.patch_experts{p}(view, landmark, 1); patches(i).patch_experts_depth{view,landmark}(p).bias = patch_m.patch_experts{p}(view, landmark, 2); patches(i).patch_experts_depth{view,landmark}(p).w = reshape(patch_m.patch_experts{p}(view, landmark, 3:end),11,11); end else multi_modal_types = {'reg'}; % for backward compatibility patches(i).patch_experts_depth{view, landmark}(1).type = {'reg'}; patches(i).patch_experts_depth{view, landmark}(1).correlations = correlations; patches(i).patch_experts_depth{view, landmark}(1).rms_errors = rmsErrors; patches(i).patch_experts_depth{view,landmark}(1).scaling = patchExperts(view, landmark, 1); patches(i).patch_experts_depth{view,landmark}(1).bias = patchExperts(view, landmark, 2); patches(i).patch_experts_depth{view,landmark}(1).w = reshape(patchExperts(view, landmark, 3:end), 11,11); end end end clear 'normalisationOptions, centers, trainingScale, visiIndex, correlations, rmsErrors'; end end end