clc
datadir = 'AV_DATA';
%% Load Data
% Files for digit 2
audio_files_2 = dir(strcat(datadir, filesep, '2*a.fea'));
video_files_2 = dir(strcat(datadir, filesep, '2*v.fea'));
% Files for digit 5
audio_files_5 = dir(strcat(datadir, filesep, '5*a.fea'));
video_files_5 = dir(strcat(datadir, filesep, '5*v.fea'));
nsequences = 10;
audio_data_2 = cell(1, nsequences);
video_data_2 = cell(1, nsequences);
audio_data_5 = cell(1, nsequences);
video_data_5 = cell(1, nsequences);
av_data_2 = cell(1, nsequences);
av_data_5 = cell(1, nsequences);
for i=1:nsequences
% Read in audio files for '2'
audio_name_2 = strcat(datadir, filesep, audio_files_2(i).name);
audio_data_2(i) = {dlmread(audio_name_2)};
% Read in video files for '2'
video_name_2 = strcat(datadir, filesep, video_files_2(i).name);
video_data_2(i) = {dlmread(video_name_2)};
% Read in audio files for '5'
audio_name_5 = strcat(datadir, filesep, audio_files_5(i).name);
audio_data_5(i) = {dlmread(audio_name_5)};
% Read in video files for '5'
video_name_5 = strcat(datadir, filesep, video_files_5(i).name);
video_data_5(i) = {dlmread(video_name_5)};
% Generate AV data through concatenation for '2'
av_data_2{i} = [audio_data_2{i}, video_data_2{i}];
% Generate AV data through concatenation for '5'
av_data_5{i} = [audio_data_5{i}, video_data_5{i}];
end
%% Declare HMM parameters
nlatent = 5;
A_init = [0.8 0.2 0.0 0.0 0.0;
0.0 0.8 0.2 0.0 0.0;
0.0 0.0 0.8 0.2 0.0;
0.0 0.0 0.0 0.8 0.2;
0.0 0.0 0.0 0.0 1.0;];
audio_scores = zeros(2,1); % first row -> '2', second row -> '5'
video_scores = zeros(2,1);
av_scores = zeros(2,1);
%% Train the audio HMM
for i=1:20
fprintf('\n --- Test %d --- \n', i);
% Form training set based on test example
if i <= 10
Y = audio_data_2{i};
Yseq_2 = [audio_data_2(1:i-1), audio_data_2(i+1:end)];
Yseq_5 = audio_data_5;
else
Y = audio_data_5{i-10};
Yseq_2 = audio_data_2;
Yseq_5 = [audio_data_5(1:i-11), audio_data_5(i-9:end)];
end
disp('Training audio HMM for "2"')
[P0_2,A_2,mu_2,sigma_2] = ghmm_learn(Yseq_2,nlatent,A_init);
disp('Training audio HMM for "5"')
[P0_5,A_5,mu_5,sigma_5] = ghmm_learn(Yseq_5,nlatent,A_init);
% Test via ML rule: log P(O|lambda) = sum(scale)
[~,scale_2] = ghmm_fwd(Y,A_2,P0_2,mu_2,sigma_2);
[~,scale_5] = ghmm_fwd(Y,A_5,P0_5,mu_5,sigma_5);
score_2 = sum(scale_2);
score_5 = sum(scale_5);
fprintf('Likelihood for 2: %f\n', score_2);
fprintf('Likelihood for 5: %f\n', score_5);
% Correct prediction for '2'
if (i <= 10) && (score_2 > score_5)
audio_scores(1) = audio_scores(1) + 1;
end
% Correct prediction for '5'
if (i >= 11) && (score_5 > score_2)
audio_scores(2) = audio_scores(2) + 1;
end
end
%% Train the video HMM
for i=1:20
fprintf('\n --- Test %d --- \n', i);
% Form training set based on test example
if i <= 10
Y = video_data_2{i};
Yseq_2 = [video_data_2(1:i-1), video_data_2(i+1:end)];
Yseq_5 = video_data_5;
else
Y = video_data_5{i-10};
Yseq_2 = video_data_2;
Yseq_5 = [video_data_5(1:i-11), video_data_5(i-9:end)];
end
disp('Training video HMM for "2"')
[P0_2,A_2,mu_2,sigma_2] = ghmm_learn(Yseq_2,nlatent,A_init);
disp('Training video HMM for "5"')
[P0_5,A_5,mu_5,sigma_5] = ghmm_learn(Yseq_5,nlatent,A_init);
% Test via ML rule: log P(O|lambda) = sum(scale)
[~,scale_2] = ghmm_fwd(Y,A_2,P0_2,mu_2,sigma_2);
[~,scale_5] = ghmm_fwd(Y,A_5,P0_5,mu_5,sigma_5);
score_2 = sum(scale_2);
score_5 = sum(scale_5);
fprintf('Likelihood for 2: %f\n', score_2);
fprintf('Likelihood for 5: %f\n', score_5);
% Correct prediction for '2'
if (i <= 10) && (score_2 > score_5)
video_scores(1) = video_scores(1) + 1;
end
% Correct prediction for '5'
if (i >= 11) && (score_5 > score_2)
video_scores(2) = video_scores(2) + 1;
end
end
%% Train the AV HMM
for i=1:20
fprintf('\n --- Test %d --- \n', i);
% Form training set based on test example
if i <= 10
Y = av_data_2{i};
Yseq_2 = [av_data_2(1:i-1), av_data_2(i+1:end)];
Yseq_5 = av_data_5;
else
Y = av_data_5{i-10};
Yseq_2 = av_data_2;
Yseq_5 = [av_data_5(1:i-11), av_data_5(i-9:end)];
end
disp('Training AV HMM for "2"')
[P0_2,A_2,mu_2,sigma_2] = ghmm_learn(Yseq_2,nlatent,A_init);
disp('Training AV HMM for "5"')
[P0_5,A_5,mu_5,sigma_5] = ghmm_learn(Yseq_5,nlatent,A_init);
% Test via ML rule: log P(O|lambda) = sum(scale)
[~,scale_2] = ghmm_fwd(Y,A_2,P0_2,mu_2,sigma_2);
[~,scale_5] = ghmm_fwd(Y,A_5,P0_5,mu_5,sigma_5);
score_2 = sum(scale_2);
score_5 = sum(scale_5);
fprintf('Likelihood for 2: %f\n', score_2);
fprintf('Likelihood for 5: %f\n', score_5);
% Correct prediction for '2'
if (i <= 10) && (score_2 > score_5)
av_scores(1) = av_scores(1) + 1;
end
% Correct prediction for '5'
if (i >= 11) && (score_5 > score_2)
av_scores(2) = av_scores(2) + 1;
end
end