function permutedFeatureVectors = makeAppendedFeatures(rownumber, image, scales, returnall, imageFeatureVector) % 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/ global nGridRow nGridCol featureDirectory global nStatistics configurationFile; if nargin < 4 returnall = 0; imageFeatureVector = 0; end numStatistics = nStatistics; % Per scale numfeatures = 17 * numStatistics; % Scales must follow the order of scales in the mat file numscales = length(scales); load([featureDirectory 'allTrainingFeatureData_row' num2str(rownumber) ... '_' num2str(image) '.mat']); currowFeatureVector = rowFeatureVector; numimages = size(currowFeatureVector, 4); numcolumns = size(currowFeatureVector, 2); numNonScales = 0; for i=1:numscales if scales(i) < 0 numNonScales = numNonScales + 1; end end numNeighbors = 5; if returnall == 1 numNeighbors = 7; end % Middle Top, bot, left, right order % The whole image feature is the last features %permutedFeatureVectors = zeros(1, numcolumns, ... % (5*(numscales-numNonScales)+numNonScales)*numfeatures, numimages); permutedFeatureVectors = zeros(1, numcolumns, ... (numNeighbors*(numscales-numNonScales))*numfeatures + numNonScales*68, ... numimages); % Let's load all the necessary feature vectors for z=1:numscales curscale = scales(z); i = 0; if curscale == 1 i = 1; elseif curscale == 2 i = 2; elseif curscale == 5 i = 3; elseif curscale == -1 i = 4; end if curscale > 0 offset = (curscale - 1)*2 + 1; toprow = rownumber - offset; botrow = rownumber + offset; toptoprow = toprow - offset; botbotrow = botrow + offset; if toprow < 1 toprow = 1; elseif botrow > nGridRow botrow = nGridRow; end if toptoprow < 1 toptoprow = 1; elseif botbotrow > nGridRow botbotrow = nGridRow; end % The feature at the center % permutedFeatureVectors(1, :, ... % (5*(z-1)*numfeatures+1):((5*(z-1)+1)*numfeatures), :) = ... % currowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); permutedFeatureVectors(1, :, ... (numNeighbors*(z-1)*numfeatures+1):((numNeighbors*(z-1)+1)*numfeatures), :) = ... currowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = 1; % The feature at the top top if returnall == 1 load([featureDirectory 'allTrainingFeatureData_row' num2str(toptoprow) ... '_' num2str(image) '.mat']); permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... rowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; end % The feature to the top load([featureDirectory 'allTrainingFeatureData_row' num2str(toprow) ... '_' num2str(image) '.mat']); permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... rowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; % The feature to the bottom bottom if returnall == 1 load([featureDirectory 'allTrainingFeatureData_row' num2str(botbotrow) ... '_' num2str(image) '.mat']); permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... rowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; end % The feature to the bottom load([featureDirectory 'allTrainingFeatureData_row' num2str(botrow) ... '_' num2str(image) '.mat']); permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... rowFeatureVector(1, :, ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; % The feature to the left perm = zeros(1, numcolumns); for j=1:numcolumns if j <= offset perm(1, j) = 1; else perm(1, j) = j - offset; end end permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... currowFeatureVector(1, perm, ... ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; % The feature to the right perm = zeros(1, numcolumns); for j=1:numcolumns if (j + offset) > numcolumns perm(1, j) = numcolumns; else perm(1, j) = j + offset; end end permutedFeatureVectors(1, :, ... ((numNeighbors*(z-1)+neighborid)*numfeatures+1):((numNeighbors*(z-1)+neighborid+1)*numfeatures), :) = ... currowFeatureVector(1, perm, ... ((i-1)*numfeatures+1):(i*numfeatures), :); neighborid = neighborid + 1; elseif curscale == -1 permutedFeatureVectors(1, :, ... (numNeighbors*(z-1)*numfeatures+1):(numNeighbors*(z-1)*numfeatures+68), :) = ... currowFeatureVector(1, :, ((i-1)*numfeatures+1):end, :); elseif curscale == -2 % Let's load the image data if nargin < 5 load([featureDirectory 'allTrainingFeatureData_image' num2str(image) '.mat']); end for cols=1:nGridCol permutedFeatureVectors(1, cols, ... (numNeighbors*(z-2)*numfeatures+68+1):(numNeighbors*(z-2)*numfeatures+68+68), :) = ... imageFeatureVector(1, 1, :, :); end end end