function [meanError, meanErrorDRF, meanErrorDumb, meanErrorVeryDumb, ... meanError1, meanErrorDRF1, meanErrorDumb1, meanErrorVeryDumb1] = ... trainData(trainOrTest, displayFlag, dimensions, scales, trainingType, modelType, smoothingCoeff, histDimension, DRFFlag, ... specialFilename) % this trains the parameters % Version 0.1, Feb 2006. % This code is copyrighted by Ashutosh Saxena, Stanford University % It is available for non-commercial use only. For commericial use, please % contact the authors. % Any publication or report resulting from Use of this code, should cite: % Learning Depth from Single Monocular Images, Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng, NIPS 2005. % 3-D Depth Reconstruction from a Single Still Image, Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng, To appear in IJCV 2007. % For more info and dataset, visit: http://ai.stanford.edu/~asaxena/learningdepth/ % For a better version of the algorithm, also visit: % http://ai.stanford.edu/~asaxena/reconstruction3d/ % This file has perhaps the most errors % To ensure that sigmas are positive, you have to threshold the predicted ones to some numbers > 0. % For learning as in the paper, use quadprog as in trainDataRelative_someotherversion.m % The WeightsX and WeightsY are different. (In the paper, it is not % clearly mentioned that thet are.) Using different weights for each % direction gave better results. global nGridRow nGridCol maxDistance minDistance global featureDirectory global nDim nLaw nStatistics nDimRel global nThetaStep upsilon = 1e-22; if nargin < 10 specialFilename = ''; end configurationFile; if nargin < 8 histDimension = 1:nDimRel; end if nargin < 5 trainingType = 'gaussian'; end trainingType = lower(trainingType); if nargin < 6 modelType = 'absolute'; end if nargin < 7 smoothingCoeff = [1 .01 .01]; end if nargin < 9 %if strcmp(trainingType, 'gaussian') && strcmp(modelType, 'absolute') % DRFFlag = true; %else DRFFlag = false; %end end if nargin < 4 || 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 if length(dimensions) == 1 && dimensions == -1 %H2 only dimensions = []; end imageNStep = 25; nAppendedDim = length(dimensions); if sum(scales == -1) <= 0 nFeatures = nAppendedDim / length(scales) / 5; else nFeatures = (nAppendedDim-nDim) / (length(scales)-1) / 5; end totalImages = 425;%325; imageNStep = 25; 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 = 7; scalesRel = [1 2]; for row = 1:nThetaStep:nGridRow %neglecting first row as features are heavily copied for n=imageVector%1:imageNStep:(totalImages-imageNStep+1) for callRow = 1:nThetaStep rowDepthMaps(callRow,:,:,n-1+(1:imageNStep)) = 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 = (rowDepthMaps(:,:,1,:) - rowDepthMaps(:,:,2,:) ); diffDepthMapsX = (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); for n=imageVector%[1:25:126, 176:326]%1:imageNStep:(totalImages-imageNStep+1) for callRow = 1:nThetaStep fV(callRow,:,:,n-1+(1:imageNStep)) = 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); % Code probably contains errors --- test and try to make it run. histDimension = 1:170;%1:170;%10*(hD-1)+(1:10); diff_fVY = cat(2, fV(:,0*nDimRel+histDimension), fV(:,1*nDimRel+histDimension), ... fV(:,3*nDimRel+histDimension), fV(:,4*nDimRel+histDimension) ); diff_fVX = cat(2, fV(:,0*nDimRel+histDimension), fV(:,2*nDimRel+histDimension), ... fV(:,3*nDimRel+histDimension), fV(:,5*nDimRel+histDimension) ); %diff_fVY_2 = cat(2, ...%fV(:,3*nDimRel+histDimension) .* fV(:,4*nDimRel+histDimension), ... % ...% fV(:,3*nDimRel+([1:10 91:110])) .^2, fV(:,4*nDimRel+([1:10 91:110])) .^ 2, ... % fV(:,3*nDimRel+histDimension), fV(:,4*nDimRel+histDimension) ); %diff_fVX_2 = cat(2, ...%fV(:,3*nDimRel+histDimension) .* fV(:,5*nDimRel+histDimension), ... % ...% fV(:,3*nDimRel+([1:10 91:110])) .^2, fV(:,5*nDimRel+([1:10 91:110])) .^ 2, ... % fV(:,3*nDimRel+histDimension), fV(:,5*nDimRel+histDimension) ); 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) )); % Could be used for comparison (i.e., sort of a baseline). dumbFeatureVector = ones(size(fV,1),1); clear fV; diffXFeatureVector = [ones(size(diff_fVX,1),1), diff_fVX]; clear diff_fVX; diffXFeatureVector_2 = [ones(size(diff_fVX_2,1),1), diff_fVX_2]; clear 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]; clear diff_fVY_2; if trainOrTest == 1 disp(['Relative Training with ' num2str(size(diffXFeatureVector,1)) ' samples and ' ... num2str(size(diffXFeatureVector,2)) ' dimensions, ' num2str(size(diffXFeatureVector_2,2)) ]);%... warning off; %=========scale 1============== weightsX(:,row) = diffXFeatureVector \ diffDepthVectorX; predictedDepthVectorX(:,row) = diffXFeatureVector * weightsX(:,row); varianceVectorX = ( diffDepthVectorX - predictedDepthVectorX(:,row) ).^2; clear diffXFeatureVector; weightsY(:,row) = diffYFeatureVector \ diffDepthVectorY; 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; weightsX_2(:,row) = [diffXFeatureVector_2; diffYFeatureVector_2] \ [diffDepthVectorX_2; diffDepthVectorY_2]; predictedDepthVectorX_2(:,row) = [diffXFeatureVector_2; diffYFeatureVector_2] * weightsX_2(:,row); varianceVectorX_2 = ( [diffDepthVectorX_2; diffDepthVectorY_2] - predictedDepthVectorX_2(:,row) ).^2; clear diffXFeatureVector_2; weightsY_2(:,row) = ones(size(diffYFeatureVector_2,1),1) \ diffDepthVectorY_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 ); 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)); %varianceWeightsX(:,row) = quadprog(diffXFeatureVector'*diffXFeatureVector, -diffXFeatureVector'*varianceVectorX, ... % -speye(size(diffXFeatureVector,2)), zeros(size(diffXFeatureVector,2),1) ); %varianceWeightsY(:,row) = quadprog(diffYFeatureVector'*diffYFeatureVector, -diffYFeatureVector'*varianceVectorY, ... % -speye(size(diffYFeatureVector,2)), zeros(size(diffYFeatureVector,2),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)) ' dimensions....']); end load(['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 * weightsX_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_2 = ( diffDepthVectorX_2 - predictedDepthVectorX_2(:,row) ).^2; varianceVectorY_2 = ( diffDepthVectorY_2 - predictedDepthVectorY_2(:,row) ).^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,10) == 0 if trainOrTest == 1 save(['weightsRelativeDepths_' trainingType '.mat'], 'weightsX', 'weightsY', 'weightsX_2', 'weightsY_2' ); end filename = ['predictedRelativeDepthVectorsEarly' num2str(trainOrTest) '_' trainingType '.mat']; save(filename, 'row', 'predictedDepthVectorX', 'predictedDepthVectorY', 'predictedDepthVectorX_2', 'predictedDepthVectorY_2', ... 'actualDepthMap', 'residualRelErrorX', 'residualRelErrorY', '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(['weightsRelativeDepths' trainingType '.mat'], 'weightsX', 'weightsY', 'weightsX_2', 'weightsY_2' ); end filename = ['predictedRelativeDepthVectorsEarly' num2str(trainOrTest) '_' trainingType '.mat']; save(filename, 'predictedDepthVectorX', 'predictedDepthVectorY', 'predictedDepthVectorX_2', 'predictedDepthVectorY_2', ... 'actualDepthMap', 'residualRelErrorX', 'residualRelErrorY', 'residualRelErrorX_2', 'residualRelErrorY_2', ... 'actualVarianceX', 'actualVarianceY', 'actualVarianceX_2', 'actualVarianceY_2');