sustaining_gazes/matlab_version/AU_training/experiments/FERA2011/Read_HOG_files_dynamic.m

133 lines
4.7 KiB
Matlab

function [hog_data, valid_data, vid_id] = Read_HOG_files_dynamic(users, hog_data_dir)
hog_data = [];
vid_id = {};
valid_data = [];
feats_filled = 0;
user1 = {'train_001', 'train_002', 'train_003', 'train_004', 'train_005',...
'train_006', 'train_007', 'train_008', 'train_009', 'train_010',...
'train_011', 'train_012', 'train_013', 'train_014', 'train_015',...
'train_016', 'train_017', 'train_018'};
user2 = {'train_019', 'train_020', 'train_021', 'train_022', 'train_023',...
'train_024', 'train_025', 'train_026', 'train_027', 'train_028',...
'train_029', 'train_030', 'train_031', 'train_032'};
user3 = {'train_033', 'train_034', 'train_035', 'train_036', 'train_037',...
'train_038', 'train_039', 'train_040', 'train_041'};
user4 = {'train_042', 'train_043', 'train_044', 'train_045', 'train_046',...
'train_047', 'train_048', 'train_049', 'train_050', 'train_051',...
'train_052', 'train_053', 'train_054', 'train_055', 'train_056'};
user5 = {'train_057', 'train_058', 'train_059', 'train_060', 'train_061',...
'train_062', 'train_063'};
user6 = {'train_064', 'train_065', 'train_066', 'train_067', 'train_068',...
'train_069', 'train_070', 'train_071', 'train_072', 'train_073',...
'train_074', 'train_075', 'train_076', 'train_077', 'train_078', 'train_079'};
user7 = {'train_080', 'train_081', 'train_082', 'train_083', 'train_084',...
'train_085', 'train_086', 'train_087'};
users_group = cat(1, {user1}, {user2}, {user3}, {user4}, {user5}, {user6}, {user7});
user_inds = [];
for i=1:numel(users)
hog_file = [hog_data_dir, '/au_training_', users{i} '.hog'];
f = fopen(hog_file, 'r');
curr_data = [];
curr_ind = 0;
while(~feof(f))
if(curr_ind == 0)
num_cols = fread(f, 1, 'int32');
if(isempty(num_cols))
break;
end
num_rows = fread(f, 1, 'int32');
num_chan = fread(f, 1, 'int32');
curr_ind = curr_ind + 1;
% preallocate some space
if(curr_ind == 1)
curr_data = zeros(5000, 1 + num_rows * num_cols * num_chan);
num_feats = 1 + num_rows * num_cols * num_chan;
end
if(curr_ind > size(curr_data,1))
curr_data = cat(1, curr_data, zeros(6000, 1 + num_rows * num_cols * num_chan));
end
feature_vec = fread(f, [1, 1 + num_rows * num_cols * num_chan], 'float32');
curr_data(curr_ind, :) = feature_vec;
else
% Reading in batches of 5000
feature_vec = fread(f, [4 + num_rows * num_cols * num_chan, 5000], 'float32');
feature_vec = feature_vec(4:end,:)';
num_rows_read = size(feature_vec,1);
curr_data(curr_ind+1:curr_ind+num_rows_read,:) = feature_vec;
curr_ind = curr_ind + size(feature_vec,1);
end
end
fclose(f);
curr_data = curr_data(1:curr_ind,:);
for k=1:numel(users_group)
if(~isempty(strmatch(users{i}, users_group{k})))
user_inds = cat(1, user_inds, k * ones(curr_ind,1));
end
end
valid = logical(curr_data(:, 1));
vid_id_curr = cell(curr_ind,1);
vid_id_curr(:) = users(i);
vid_id = cat(1, vid_id, vid_id_curr);
% Assume same number of frames per video
if(i==1)
hog_data = zeros(curr_ind*numel(users), num_feats);
end
if(size(hog_data,1) < feats_filled+curr_ind)
hog_data = cat(1, hog_data, zeros(size(hog_data,1), num_feats));
end
hog_data(feats_filled+1:feats_filled+curr_ind,:) = curr_data;
feats_filled = feats_filled + curr_ind;
end
if(numel(users) > 0)
% Perform normalization here
u_id = unique(user_inds)';
valid_data = hog_data(1:feats_filled,1) > 0;
for u=u_id
hog_data(user_inds==u, 2:end) = bsxfun(@plus, hog_data(user_inds==u, 2:end), -median(hog_data(user_inds==u & valid_data, 2:end)));
end
hog_data = hog_data(1:feats_filled,2:end);
end
end