diff --git a/cvpr_computedescriptors.m b/cvpr_computedescriptors.m index 63099be..0a0e419 100644 --- a/cvpr_computedescriptors.m +++ b/cvpr_computedescriptors.m @@ -22,10 +22,10 @@ OUT_FOLDER = 'descriptors'; %% and within that folder, create another folder to hold these descriptors %% the idea is all your descriptors are in individual folders - within %% the folder specified as 'OUT_FOLDER'. -OUT_SUBFOLDER='avgRGB'; +% OUT_SUBFOLDER='avgRGB'; % OUT_SUBFOLDER='globalRGBhisto'; % OUT_SUBFOLDER='spatialColour'; -% OUT_SUBFOLDER='spatialColourTexture'; +OUT_SUBFOLDER='spatialColourTexture'; allfiles=dir (fullfile([DATASET_FOLDER,'/Images/*.bmp'])); for filenum=1:length(allfiles) @@ -37,10 +37,10 @@ for filenum=1:length(allfiles) fout=[OUT_FOLDER,'/',OUT_SUBFOLDER,'/',fname(1:end-4),'.mat'];%replace .bmp with .mat %% EXTRACT FUNCTION - F=extractAvgRGB(img); +% F=extractAvgRGB(img); % F=extractGlobalColHist(img); % F=extractSpatialColour(img); -% F=extractSpatialColourTexture(img); + F=extractSpatialColourTexture(img); save(fout,'F'); toc end diff --git a/cvpr_visualsearch_pca.m b/cvpr_visualsearch_pca.m index 318e22d..5857113 100644 --- a/cvpr_visualsearch_pca.m +++ b/cvpr_visualsearch_pca.m @@ -27,10 +27,10 @@ DATASET_FOLDER = 'dataset'; DESCRIPTOR_FOLDER = 'descriptors'; %% and within that folder, another folder to hold the descriptors %% we are interested in working with -DESCRIPTOR_SUBFOLDER='avgRGB'; +% DESCRIPTOR_SUBFOLDER='avgRGB'; % DESCRIPTOR_SUBFOLDER='globalRGBhisto'; % DESCRIPTOR_SUBFOLDER='spatialColour'; -% DESCRIPTOR_SUBFOLDER='spatialColourTexture'; +DESCRIPTOR_SUBFOLDER='spatialColourTexture'; CATEGORIES = ["Farm Animal" "Tree" @@ -95,23 +95,17 @@ for iterating_category=1:CAT_TOTAL %% 2) Select descriptors for category and training data category_training_descriptors = []; test_descriptors = []; + test_categories = []; for i=1:NIMG - if iterating_category == ALLCATs(i) + if (iterating_category == ALLCATs(i)) && (size(category_training_descriptors,1) < MODEL_SIZE) category_training_descriptors = [ category_training_descriptors ; ALLFEAT(i,:) ]; else test_descriptors = [ test_descriptors ; ALLFEAT(i,:) ]; + test_categories = [ test_categories ; ALLCATs(i) ]; end end - model_descriptors = category_training_descriptors(1:MODEL_SIZE, :); - - model_mean = mean(model_descriptors); - model_data_min_mean = model_descriptors - repmat(model_mean, MODEL_SIZE, 1); - - C = (model_data_min_mean' * model_data_min_mean) ./ MODEL_SIZE; - - [eig_vct, eig_val] = eig(C); - + [eig_vct, eig_val, model_mean] = getEigenModel(category_training_descriptors); TEST_SIZE = size(test_descriptors,1); @@ -119,21 +113,19 @@ for iterating_category=1:CAT_TOTAL dst=[]; for i=1:TEST_SIZE candidate=test_descriptors(i,:); - query=ALLFEAT(queryimg,:); - - category=ALLCATs(i); + category=test_categories(i); %% COMPARE FUNCTION - thedst=compareEuclidean(query, candidate); + thedst=compareMahalanobis(eig_vct, eig_val, model_mean, candidate); dst=[dst ; [thedst i category]]; end dst=sortrows(dst,1); % sort the results %% 4) Calculate PR - precision_values=zeros([1, NIMG]); - recall_values=zeros([1, NIMG]); + precision_values=zeros([1, TEST_SIZE]); + recall_values=zeros([1, TEST_SIZE]); - correct_at_n=zeros([1, NIMG]); + correct_at_n=zeros([1, TEST_SIZE]); query_row = dst(1,:); query_category = query_row(1,3); @@ -141,7 +133,7 @@ for iterating_category=1:CAT_TOTAL %calculate PR for each n - for i=1:NIMG + for i=1:TEST_SIZE rows = dst(1:i, :); @@ -182,8 +174,8 @@ for iterating_category=1:CAT_TOTAL %% 5) calculate AP - P_rel_n = zeros([1, NIMG]); - for i = 1:NIMG + P_rel_n = zeros([1, TEST_SIZE]); + for i = 1:TEST_SIZE precision = precision_values(i); i_result_relevant = correct_at_n(i); diff --git a/descriptor/extractSpatialColourTexture.m b/descriptor/extractSpatialColourTexture.m index 3a3b46d..01a3c5c 100644 --- a/descriptor/extractSpatialColourTexture.m +++ b/descriptor/extractSpatialColourTexture.m @@ -1,7 +1,7 @@ function F=extractSpatialColourTexture(img) -grid_rows = 10; -grid_columns = 10; +grid_rows = 4; +grid_columns = 4; img_size = size(img); img_rows = img_size(1); @@ -43,7 +43,7 @@ for i = 1:grid_rows avg_vals = extractAvgRGB(img_cell); [mag_img, angle_img] = getEdgeInfo(grey_img_cell); - edge_hist = getEdgeAngleHist(mag_img, angle_img); + edge_hist = getEdgeAngleHist(mag_img, angle_img, 6, 0.05); %concatenate average values into vector descriptor = [descriptor edge_hist avg_vals(1) avg_vals(2) avg_vals(3)]; diff --git a/distance/compareMahalanobis.m b/distance/compareMahalanobis.m new file mode 100644 index 0000000..7258b95 --- /dev/null +++ b/distance/compareMahalanobis.m @@ -0,0 +1,11 @@ +function dst=compareMahalanobis(vct, val, mean, F2) + +x_minus_mean = (F2 - mean)'; +matrices = val' * vct' * x_minus_mean; + +x=matrices.^2; +x=sum(x); + +dst=sqrt(sqrt(x)); + +return; diff --git a/scratch.m b/scratch.m index 140959a..9598b5f 100644 --- a/scratch.m +++ b/scratch.m @@ -1,2 +1,2 @@ -getRandomCategoryImage(7) \ No newline at end of file +loadDescriptors() \ No newline at end of file diff --git a/util/getEdgeAngleHist.m b/util/getEdgeAngleHist.m index 04832ec..8d973bd 100644 --- a/util/getEdgeAngleHist.m +++ b/util/getEdgeAngleHist.m @@ -1,7 +1,4 @@ -function F=getEdgeAngleHist(mag_img, angle_img) - -bins = 8; -threshold = 0.05; +function F=getEdgeAngleHist(mag_img, angle_img, bins, threshold) dimensions = size(angle_img); rows = dimensions(1); @@ -13,7 +10,7 @@ for i = 1:rows if mag_img(i, j) > threshold bin_value = angle_img(i, j) / (2 * pi); - bin_value = bin_value * bins; + bin_value = floor(bin_value * bins); vals = [vals bin_value]; @@ -21,5 +18,9 @@ for i = 1:rows end end -F= histogram(vals, bins, 'Normalization', 'probability').Values; +if size(vals, 2) == 0 + F = zeros(1, bins) +else + F= histogram(vals, bins, 'Normalization', 'probability').Values; +end return; \ No newline at end of file diff --git a/util/getEigenModel.m b/util/getEigenModel.m new file mode 100644 index 0000000..01500e9 --- /dev/null +++ b/util/getEigenModel.m @@ -0,0 +1,12 @@ +function [eig_vct, eig_val, model_mean]=getEigenModel(model_descriptors) + +model_size = size(model_descriptors, 1); + +model_mean = mean(model_descriptors); +model_data_min_mean = model_descriptors - repmat(model_mean, model_size, 1); + +C = (model_data_min_mean' * model_data_min_mean) ./ model_size; + +[eig_vct, eig_val] = eig(C); + +return; \ No newline at end of file