78 lines
2.7 KiB
Mathematica
78 lines
2.7 KiB
Mathematica
|
function [ responses ] = PatchResponseCCNF(patches, patch_experts_class, visibilities, patchExperts, window_size)
|
||
|
%PATCHRESPONSESVM Summary of this function goes here
|
||
|
% Detailed explanation goes here
|
||
|
|
||
|
normalisationOptions = patchExperts.normalisationOptionsCol;
|
||
|
patchSize = normalisationOptions.patchSize;
|
||
|
|
||
|
responses = cell(size(patches, 1), 1);
|
||
|
empty = zeros(window_size(1)-patchSize(1)+1, window_size(2)-patchSize(2)+1);
|
||
|
|
||
|
for i = 1:numel(patches(:,1))
|
||
|
responses{i} = empty;
|
||
|
if visibilities(i)
|
||
|
|
||
|
col_norm = normalisationOptions.useNormalisedCrossCorr == 1;
|
||
|
|
||
|
b = zeros(numel(empty), 1);
|
||
|
|
||
|
num_hl = size(patch_experts_class{i}.thetas,1);
|
||
|
|
||
|
smallRegionVec = patches(i,:);
|
||
|
smallRegion = reshape(smallRegionVec, window_size(1), window_size(2));
|
||
|
|
||
|
for hls = 1:num_hl
|
||
|
|
||
|
w = patch_experts_class{i}.w{hls};
|
||
|
|
||
|
% normalisation needed per each response
|
||
|
norm_w = patch_experts_class{i}.norm_w{hls};
|
||
|
|
||
|
response = -norm_w * SVMresponse(smallRegion, w, col_norm, patchSize) - patch_experts_class{i}.thetas(hls, 1);
|
||
|
|
||
|
% here we include the bias term as well, as it wasn't added
|
||
|
% during the response calculation
|
||
|
h1 = 1./(1 + exp(response(:)));
|
||
|
b = b + (2 * patch_experts_class{i}.alphas(hls) * h1);
|
||
|
|
||
|
end
|
||
|
|
||
|
% Sigma will be dependent on the size of the patch find the
|
||
|
% needed precomputed Sigma
|
||
|
rel_sigma = 1;
|
||
|
if(numel(patch_experts_class{i}.Sigma) > 1)
|
||
|
for sig=1:numel(patch_experts_class{i}.Sigma)
|
||
|
if(size(patch_experts_class{i}.Sigma{sig},2)==numel(b))
|
||
|
rel_sigma = sig;
|
||
|
break;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
response = patch_experts_class{i}.Sigma{rel_sigma} * b;
|
||
|
|
||
|
% make sure we have no negative responses
|
||
|
response = response - min(response);
|
||
|
|
||
|
responses{i}(:) = response;
|
||
|
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
function response = SVMresponse(region, patchExpert, normalise_x_corr,patchSize)
|
||
|
|
||
|
if(normalise_x_corr)
|
||
|
|
||
|
% the fast mex convolution
|
||
|
[response] = normxcorr2_mex(patchExpert, region);
|
||
|
|
||
|
response = response(patchSize(1):end-patchSize(1)+1,patchSize(2):end-patchSize(2)+1);
|
||
|
else
|
||
|
% this assumes that the patch is already normed
|
||
|
template = rot90(patchExpert,2);
|
||
|
response = conv2(region, template, 'valid');
|
||
|
end
|
||
|
end
|