gerard@1: % Copyright 2013 MUSIC TECHNOLOGY GROUP, UNIVERSITAT POMPEU FABRA gerard@1: % gerard@1: % Written by Gerard Roma gerard@1: % gerard@1: % This program is free software: you can redistribute it and/or modify gerard@1: % it under the terms of the GNU Affero General Public License as published by gerard@1: % the Free Software Foundation, either version 3 of the License, or gerard@1: % (at your option) any later version. gerard@1: % gerard@1: % This program is distributed in the hope that it will be useful, gerard@1: % but WITHOUT ANY WARRANTY; without even the implied warranty of gerard@1: % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the gerard@1: % GNU Affero General Public License for more details. gerard@1: % gerard@1: % You should have received a copy of the GNU Affero General Public License gerard@1: % along with this program. If not, see . gerard@1: gerard@1: function [ predict_label ] = classify_scenes(tmp_path, train_file,test_file, output_file, grid_search) gerard@1: addpath('rastamat/'); gerard@1: addpath('libsvm/') gerard@1: gerard@1: classes = {'bus' 'busystreet' 'office' 'openairmarket' 'park' 'quietstreet' 'restaurant' 'supermarket' 'tube' 'tubestation'}; gerard@1: gerard@1: [tr_names,tr_labels] = loadClassificationOutput(train_file); gerard@1: [te_names,te_labels] = loadClassificationOutput(test_file); gerard@1: gerard@1: gerard@1: %% extract features gerard@1: disp('analyzing training files'); gerard@1: train_features = analyze_files(tr_names,tmp_path); gerard@1: disp('analyzing test files'); gerard@1: test_features = analyze_files(te_names, tmp_path); gerard@1: train_labels = []; gerard@1: test_labels = ones(length(te_names),1); gerard@1: gerard@1: train_labels = get_class_indices(tr_labels); gerard@1: gerard@1: [train_z, mu, sigma] = zscore(train_features); gerard@1: MU = repmat(mu,size(test_features,1),1); gerard@1: SIGMA = repmat(sigma,size(test_features,1),1); gerard@1: test_z = (test_features -MU)./SIGMA; gerard@1: gerard@1: gerard@1: %% SVM grid Search inspired in http://labrosa.ee.columbia.edu/projects/consumervideo/ gerard@1: gerard@1: if grid_search gerard@1: disp('performing grid search'); gerard@1: tuning_data_fraction = 0.9; gerard@1: train_size = round(tuning_data_fraction*size(train_z,1)); gerard@1: p = randperm(size(train_z,1)); gerard@1: trainX = train_z(p(1:train_size),:); gerard@1: validateX = train_z(p(train_size+1:end),:); gerard@1: trainY = get_class_indices(tr_labels(p(1:train_size))); gerard@1: validateY = get_class_indices(tr_labels(p(train_size+1:end))); gerard@1: gerard@1: gerard@1: gamma = 2.^[-10:1:10]; gerard@1: C = 2.^[0:13]; gerard@1: gerard@1: params = zeros(length(gamma),length(C)); gerard@1: best_a = 0; gerard@1: best_g = 0; gerard@1: best_C = 0; gerard@1: gerard@1: for gi= 1:length(gamma) gerard@1: for Ci = 1:length(C) gerard@1: m = svmtrain(trainY', trainX, sprintf('-c %d -g %2.5f -q',C(Ci),gamma(gi))); gerard@1: [p,a] = svmpredict(validateY', validateX, m, '-q'); gerard@1: if a(1) > best_a gerard@1: best_C = C(Ci); gerard@1: best_g = gamma(gi); gerard@1: best_a = a(1); gerard@1: end gerard@1: end gerard@1: end gerard@1: disp('grid search done'); gerard@1: else gerard@1: best_C=70; gerard@1: best_g = 0.003; gerard@1: end gerard@1: gerard@1: gerard@1: model = svmtrain(train_labels', train_z, sprintf('-c %d -g %2.5f -q',best_C,best_g)); gerard@1: [predict_indices, accuracy_obj, prob_values] = svmpredict(test_labels, test_z, model,'-q'); gerard@1: predict_label = classes(predict_indices); gerard@1: gerard@1: gerard@1: outfd = fopen(output_file,'w+'); gerard@1: gerard@1: for i = 1:length(te_names) gerard@1: fprintf(outfd,'%s\t',[char(te_names(i))]); gerard@1: fprintf(outfd,'%s\n',[char(predict_label(i))]); gerard@1: end gerard@1: fclose(outfd); gerard@1: gerard@1: function idx = get_class_indices(labels) gerard@1: idx = []; gerard@1: for i=1:length(labels) gerard@1: class = find(strcmp(classes,labels(i))); gerard@1: idx(i) = class; gerard@1: end gerard@1: gerard@1: end gerard@1: gerard@1: gerard@1: end gerard@1: