function [meanError, meanErrorDRF, meanErrorDumb, meanErrorVeryDumb, ... meanError1, meanErrorDRF1, meanErrorDumb1, meanErrorVeryDumb1] = ... trainData(trainOrTest, displayFlag, scales, trainingType, histDimension) % this trains the parameters global nGridRow nGridCol maxDistance minDistance global featureDirectory weightsDirectory global nDim nLaw nStatistics nDimRel global nThetaStep upsilon = 1e-22; configurationFile; if nargin < 5 histDimension = 1:nDimRel; end if nargin < 4 trainingType = 'gaussian'; end trainingType = lower(trainingType); if nargin < 3 || scales(1) == 0 scales = [1 2];% 5 -1]; end %if nargin < 3 %|| dimensions == -1 % if sum(scales == -1) <= 0 % column feature is not appended with neighbors % dimensions = 1:((nDim*5)*length(scales)); % else % dimensions = 1:((nDim*5)*(length(scales)-1)+nDim); % end %end if nargin < 2 displayFlag = false; end if nargin < 1 trainOrTest = 1; % 2 for test end totalImages = 257;%325; imageNStep = 50; imageVector = [1:imageNStep:totalImages]; tmp = 1:totalImages; if trainOrTest == 1 dataSetsNumber = tmp(find(mod(tmp,4) > 0)); elseif trainOrTest == 2 dataSetsNumber = tmp(find(mod(tmp,4) == 0)); end nImages = length(dataSetsNumber); %weights = zeros(2*nAppendedDim+1,nGridRow); %absoluteVarianceWeights = zeros(2*nAppendedDim+1,nGridRow); %1 for bias relativeRange = 3; scalesRel = [1 2]; for row = 1:nThetaStep:nGridRow %neglecting first row as features are heavily copied for n=1:totalImages:totalImages%imageVector%1:imageNStep:(totalImages-imageNStep+1) for callRow = 1:nThetaStep rowDepthMaps(callRow,:,:,n-1+(1:totalImages)) = makeAppendedRangedDepths(min(nGridRow,row+callRow-1),n,scalesRel,relativeRange); end end rowDepthMaps = rowDepthMaps(:,:,:,dataSetsNumber); actualDepthMap(min(nGridRow,row-1+(1:nThetaStep)),:,:) = permute( rowDepthMaps(:,:,1,:), [1 2 4 3]); % the actual depth map % diffDepthMapsY = abs(rowDepthMaps(:,:,1,:) - rowDepthMaps(:,:,2,:) ); % diffDepthMapsX = abs(rowDepthMaps(:,:,1,:) - rowDepthMaps(:,:,3,:) ); diffDepthMapsY_2 = abs(rowDepthMaps(:,:,4,:) - rowDepthMaps(:,:,5,:) ); diffDepthMapsX_2 = abs(rowDepthMaps(:,:,4,:) - rowDepthMaps(:,:,6,:) ); % diffDepthVectorX = double(reshape( permute(diffDepthMapsX(:,:,1,:), [1 2 4 3]), [nThetaStep*nGridCol*nImages 1]) ); % diffDepthVectorY = double(reshape( permute(diffDepthMapsY(:,:,1,:), [1 2 4 3]), [nThetaStep*nGridCol*nImages 1]) ); diffDepthVectorX_2 = double(reshape( permute(diffDepthMapsX_2(:,:,1,:), [1 2 4 3]), [nThetaStep*nGridCol*nImages 1]) ); diffDepthVectorY_2 = double(reshape( permute(diffDepthMapsY_2(:,:,1,:), [1 2 4 3]), [nThetaStep*nGridCol*nImages 1]) ); clear rowDepthMaps; %=======Loading feature vectors=========== fV = zeros(nThetaStep,nGridCol,3*sum(scalesRel>0)*nDimRel,totalImages); %3 neighbors for n=imageVector for callRow = 1:nThetaStep if n <= 250, tmpIndex = n-1+(1:imageNStep); else tmpIndex = n-1+(1:7); end fV(callRow,:,:,tmpIndex) = makeAppendedRangedFeatures(min(nGridRow,row+callRow-1), n, scalesRel, relativeRange);%scales);%, dimensions); end end disp('Feature Vector loaded......'); fV = fV(:,:,:,dataSetsNumber); %=======smoothing the histogram============ %fV = reshape( filter([1 2 1], 4, reshape(fV, [size(fV,1) size(fV,2) 10 3*length(scalesRel)*nLaw size(fV,4)]), [], 3), ... % [size(fV,1) size(fV,2) 10*3*length(scalesRel)*nLaw size(fV,4)] ); %permuting to take "dimensions" in 2, and nImages*nCols into 1 fV = reshape( permute( fV, [1 2 4 3]), [nThetaStep*nGridCol*nImages size(fV,3)]); for hD = 1:1%nLaw %histDimension = 10*(hD-1)+(1:10); histDimension = 1:170;%1:170;%10*(hD-1)+(1:10); %only predicting variance at sccale 2. % diff_fVY = abs( fV(:,0*nDimRel+histDimension) - fV(:,1*nDimRel+histDimension) );%, ... % fV(:,3*nDimRel+histDimension), fV(:,4*nDimRel+histDimension) ); % diff_fVX = abs( fV(:,0*nDimRel+histDimension) - fV(:,2*nDimRel+histDimension) );%, ... % fV(:,3*nDimRel+histDimension), fV(:,5*nDimRel+histDimension) ); dumbFeatureVector = ones(size(fV,1),1); if false%strcmp(trainingType, 'gaussian') == 1 diff_fVY_2 = cat(2, abs(fV(:,3*nDimRel+histDimension) - fV(:,4*nDimRel+histDimension) ), ... abs(fV(:,0*nDimRel+histDimension) - fV(:,1*nDimRel+histDimension) )); diff_fVX_2 = cat(2, abs(fV(:,3*nDimRel+histDimension) - fV(:,5*nDimRel+histDimension) ), ... abs(fV(:,0*nDimRel+histDimension) - fV(:,2*nDimRel+histDimension) )); else diff_fVY_2 = cat(2, abs(fV(:,3*nDimRel+histDimension) - fV(:,4*nDimRel+histDimension) ) );%, ... % abs(fV(:,0*nDimRel+histDimension) - fV(:,1*nDimRel+histDimension) )); diff_fVX_2 = cat(2, abs(fV(:,3*nDimRel+histDimension) - fV(:,5*nDimRel+histDimension) ) );%, ... % abs(fV(:,0*nDimRel+histDimension) - fV(:,2*nDimRel+histDimension) )); end if trainOrTest == 2 || strcmp(trainingType, 'gaussian') == 1 %diffXFeatureVector = [ones(size(diff_fVX,1),1), diff_fVX]; clear diff_fVX; diffXFeatureVector_2 = [ones(size(diff_fVX_2,1),1), diff_fVX_2]; %diffYFeatureVector = [ones(size(diff_fVY,1),1), diff_fVY]; clear diff_fVY; diffYFeatureVector_2 = [ones(size(diff_fVY_2,1),1), diff_fVY_2]; else %diffXFeatureVector = [diff_fVX]; clear diff_fVX; diffXFeatureVector_2 = [diff_fVX_2]; %diffYFeatureVector = [diff_fVY]; clear diff_fVY; diffYFeatureVector_2 = [diff_fVY_2]; end clear diff_fVX_2 diff_fVY_2; clear fV; if trainOrTest == 1 disp(['Relative Training with ' num2str(size(diffXFeatureVector_2,1)) ' samples and ' ... num2str(size(diffXFeatureVector_2,2)) ' dimensions.' ]);%num2str(size(diffXFeatureVector_2,2)) ]);%... warning off; %=========scale 1============== if strcmp(trainingType, 'gaussian') == 1 % weightsX(:,row) = diffXFeatureVector \ diffDepthVectorX; % weightsY(:,row) = diffYFeatureVector \ diffDepthVectorY; elseif strcmp(trainingType, 'laplacian') == 1 % weightsX(:,row) = robustfit(diffXfeatureVector, diffDepthVectorX, 'huber'); % weightsY(:,row) = robustfit(diffYfeatureVector, diffDepthVectorY, 'huber'); end % predictedDepthVectorX(:,row) = diffXFeatureVector * weightsX(:,row); % varianceVectorX = ( diffDepthVectorX - predictedDepthVectorX(:,row) ).^2; % clear diffXFeatureVector; % predictedDepthVectorY(:,row) = diffYFeatureVector * weightsY(:,row); % varianceVectorY = ( diffDepthVectorY - predictedDepthVectorY(:,row) ).^2; % clear diffYFeatureVector; % actualVarianceX(row) = mean(varianceVectorX); % actualVarianceY(row) = mean(varianceVectorY); % residualRelErrorX(row) = sum(varianceVectorX) / sum( (diffDepthVectorX - mean(diffDepthVectorX) + upsilon).^2 ); % residualRelErrorY(row) = sum(varianceVectorY) / sum( (diffDepthVectorY - mean(diffDepthVectorY) + upsilon).^2 ); %=======scale 2============ % weightsX_2(:,row) = diffXFeatureVector_2 \ diffDepthVectorX_2; % predictedDepthVectorX_2(:,row) = diffXFeatureVector_2 * weightsX_2(:,row); % varianceVectorX_2 = ( diffDepthVectorX_2 - predictedDepthVectorX_2(:,row) ).^2; % clear diffXFeatureVector_2; if strcmp(trainingType, 'gaussian') == 1 %weightsX_2(:,row) = diffXFeatureVector_2 \ diffDepthVectorX_2; %weightsX_2(:,row) = [diffXFeatureVector_2; diffYFeatureVector_2] \ [diffDepthVectorX_2; diffDepthVectorY_2]; %weightsY_2(:,row) = diffYFeatureVector_2 \ diffDepthVectorY_2; %weightsY_2(:,row) = ones(size(diffYFeatureVector_2,1),1) \ diffDepthVectorY_2; mu_coeff = 1e4; weightsX_2(:,row) = quadprog( (diffXFeatureVector_2'*diffXFeatureVector_2 + mu_coeff * eye( size(diffXFeatureVector_2,2) ) ), ... -diffXFeatureVector_2'*diffDepthVectorX_2, ... -speye(size(diffXFeatureVector_2,2)), 0*speye(size(diffXFeatureVector_2,2),1) ); weightsY_2(:,row) = quadprog( (diffYFeatureVector_2'*diffYFeatureVector_2 + mu_coeff * eye( size(diffYFeatureVector_2,2) ) ), ... -diffYFeatureVector_2'*diffDepthVectorY_2, ... -speye(size(diffYFeatureVector_2,2)), 0*speye(size(diffYFeatureVector_2,2),1) ); elseif strcmp(trainingType, 'laplacian') == 1 weightsX_2(:,row) = robustfit([diffXFeatureVector_2; diffYFeatureVector_2], ... [diffDepthVectorX_2; diffDepthVectorY_2], 'huber'); %weightsY_2(:,row) = robustfit(diffYfeatureVector_2, diffDepthVectorY_2, 'huber'); end if strcmp(trainingType, 'laplacian') == 1 diffXFeatureVector_2 = [ones(size(diffXFeatureVector_2,1),1), diffXFeatureVector_2]; diffYFeatureVector_2 = [ones(size(diffYFeatureVector_2,1),1), diffYFeatureVector_2]; end % predictedDepthVectorX_2(:,row) = [diffXFeatureVector_2; diffYFeatureVector_2] * weightsX_2(:,row); % varianceVectorX_2 = ( [diffDepthVectorX_2; diffDepthVectorY_2] - predictedDepthVectorX_2(:,row) ).^2; predictedDepthVectorX_2(:,row) = diffXFeatureVector_2 * weightsX_2(:,row); varianceVectorX_2 = (diffDepthVectorX_2 - predictedDepthVectorX_2(:,row) ).^2; clear diffXFeatureVector_2; % predictedDepthVectorY_2(:,row) = ones(size(diffYFeatureVector_2,1),1) * weightsY_2(:,row); % varianceVectorY_2 = ( diffDepthVectorY_2 - predictedDepthVectorY_2(:,row) ).^2; % clear diffYFeatureVector_2; % weightsY_2(:,row) = diffYFeatureVector_2 \ diffDepthVectorY_2; predictedDepthVectorY_2(:,row) = diffYFeatureVector_2 * weightsY_2(:,row); varianceVectorY_2 = ( diffDepthVectorY_2 - predictedDepthVectorY_2(:,row) ).^2; % clear diffYFeatureVector_2; actualVarianceX_2(row) = mean(varianceVectorX_2); actualVarianceY_2(row) = mean(varianceVectorY_2); % residualRelErrorX_2(row) = sum(varianceVectorX_2) / ... % sum( ([diffDepthVectorX_2; diffDepthVectorY_2] ... % - mean([diffDepthVectorX_2; diffDepthVectorY_2]) + upsilon).^2 ); residualRelErrorX_2(row) = sum(varianceVectorX_2) / ... sum( (diffDepthVectorX_2 - mean(diffDepthVectorX_2) + upsilon).^2 ); residualRelErrorY_2(row) = sum(varianceVectorY_2) / ... sum( (diffDepthVectorY_2 - mean(diffDepthVectorY_2) + upsilon).^2 ); warning on; %allRowResidualRelErrorX_2(row,hD) = residualRelErrorX_2(row); %allRowResidualRelErrorY_2(row,hD) = residualRelErrorY_2(row); %elseif strcmp(trainingType, 'laplacian') %disp('Starting linear program...'); %size(featureVector); %nAppendedDim; %tmp = linprog( [repmat(0,nAppendedDim+1,1); repmat(1,nImages*nGridCol,1)], ... % [sparse(featureVector), -speye(nImages*nGridCol); -sparse(featureVector), -speye(nImages*nGridCol)], ... % [depthVector; -depthVector] ); %weights(:,row) = tmp(1:(nAppendedDim+1)); % %tmp = linprog( [repmat(0,1,1); repmat(1,nImages*nGridCol,1)], ... % [sparse(dumbFeatureVector), -speye(nImages*nGridCol); -sparse(dumbFeatureVector), -speye(nImages*nGridCol)], ... % [depthVector; -depthVector] ); %dumbWeights(:,row) = tmp(1:(nAppendedDim+1)); elseif trainOrTest == 2 if true%mod(row,5) == 0 disp([num2str([row nGridRow]) ' >>>>>>>> Testing on ' num2str( length(dataSetsNumber) ) ' images, for ' num2str(nGridRow) ' rows x ' ... num2str(nGridCol) ' columns depthmap resolution; in ' num2str( size(diffXFeatureVector_2,2)) ' dimensions....']); end load([weightsDirectory 'weightsRelativeDepths_' trainingType '.mat']); % predictedDepthVectorX(:,row) = diffXFeatureVector * weightsX(:,row); % predictedDepthVectorY(:,row) = diffYFeatureVector * weightsY(:,row); % clear diffXFeatureVector diffYFeatureVector; predictedDepthVectorX_2(:,row) = diffXFeatureVector_2 * weightsX_2(:,row); % predictedDepthVectorY_2(:,row) = ones(size(diffYFeatureVector_2,1),1) * weightsY_2(:,row); predictedDepthVectorY_2(:,row) = diffYFeatureVector_2 * weightsY_2(:,row); clear diffXFeatureVector_2 diffYFeatureVector_2; residualRelErrorX = 0; residualRelErrorY = 0; residualRelErrorX_2 = 0; residualRelErrorY_2 = 0; actualVarianceX = 0; actualVarianceY = 0; actualVarianceX_2 = 0; actualVarianceY_2 = 0; % varianceVectorX = ( diffDepthVectorX - predictedDepthVectorX(:,row) ).^2; % varianceVectorY = ( diffDepthVectorY - predictedDepthVectorY(:,row) ).^2; varianceVectorX_2 = ( diffDepthVectorX_2 - predictedDepthVectorX_2(:,row) ).^2; varianceVectorY_2 = ( diffDepthVectorY_2 - predictedDepthVectorY_2(:,row) ).^2; % residualRelErrorX(row) = sum(varianceVectorX) / ... % sum( (diffDepthVectorX - mean(diffDepthVectorX) + upsilon).^2 ); % residualRelErrorY(row) = sum(varianceVectorY) / ... % sum( (diffDepthVectorY - mean(diffDepthVectorY) + upsilon).^2 ); residualRelErrorX_2(row) = sum(varianceVectorX_2) / ... sum( (diffDepthVectorX_2 - mean(diffDepthVectorX_2) + upsilon).^2 ); residualRelErrorY_2(row) = sum(varianceVectorY_2) / ... sum( (diffDepthVectorY_2 - mean(diffDepthVectorY_2) + upsilon).^2 ); end disp( num2str([row ...%residualRelErrorX(row) residualRelErrorY(row) ... residualRelErrorX_2(row) residualRelErrorY_2(row) ]) ); %... end if mod(row-1,9) == 0 if trainOrTest == 1 save([weightsDirectory 'weightsRelativeDepths_' trainingType '.mat'], ...%'weightsX', 'weightsY', ... 'weightsX_2', 'weightsY_2' ); end filename = [weightsDirectory 'predictedRelativeDepthVectorsEarly' num2str(trainOrTest) '_' trainingType '.mat']; save(filename, 'row', ...%'predictedDepthVectorX', 'predictedDepthVectorY', 'residualRelErrorX', 'residualRelErrorY', 'predictedDepthVectorX_2', 'predictedDepthVectorY_2', 'residualRelErrorX_2', 'residualRelErrorY_2', ...% 'actualVarianceX', 'actualVarianceY', ... 'actualVarianceX_2', 'actualVarianceY_2'); end end %disp([mean(residualRelErrorX) mean(residualRelErrorX) mean(residualRelErrorX_2) mean(residualRelErrorX_2)]); if trainOrTest == 1 save([weightsDirectory 'weightsRelativeDepths_' trainingType '.mat'], ...%'weightsX', 'weightsY', ... 'weightsX_2', 'weightsY_2' ); end filename = [weightsDirectory 'predictedRelativeDepthVectorsEarly' num2str(trainOrTest) '_' trainingType '.mat']; save(filename, 'row', ...%'predictedDepthVectorX', 'predictedDepthVectorY', 'residualRelErrorX', 'residualRelErrorY', 'predictedDepthVectorX_2', 'predictedDepthVectorY_2', 'residualRelErrorX_2', 'residualRelErrorY_2', ...% 'actualVarianceX', 'actualVarianceY', ... 'actualVarianceX_2', 'actualVarianceY_2');