﻿The following supplementary material includes Matlab code for 1) generating the training images, 2) training the DCNN, and 3) classifying images from an unscored EEG.

Please note this code was developed based on the example Classify Time Series Using Wavelet Analysis and Deep Learning (https://www.mathworks.com/help/deeplearning/ug/classify-time-series-using-wavelet-analysis-and-deep-learning.html).



%% Generate training images

tic

Fs = info.NumSamples/seconds(info.DataRecordDuration); % get sampling frequency
Fs = round(Fs(1,1));

mkdir % data directory
mkdir % baseline images folder'/home/starr-rjk/data/Matlab/eeg_analysis/data3/baseline'
mkdir % seizure images folder'/home/starr-rjk/data/Matlab/eeg_analysis/data3/seizure'
parentFolder = % parent directory
dataFolder = % data directory

imageRoot = fullfile(parentFolder,dataFolder);

colormap jet;

disp('LA')

for i = 1:height(labelEEGData.LA)-1

    data = labelEEGData.LA{i,1};
    labels = labelEEGData.label(i);

    signalLength = length(data);

    fb = cwtfilterbank('SignalLength',signalLength,'VoicesPerOctave',12,'SamplingFrequency',Fs,'FrequencyLimits',[1 24]);

    [cfs,frq] = fb.wt(gpuArray(data));
    cfs = abs(cfs * 3/mean(pentropy(data,Fs)));
    t = (0:(Fs*2-1))/Fs;
    pcolor(t,frq,cfs);
    set(gca,'yscale','log','XTick',[],'YTick',[]);shading interp; axis tight; caxis([0 200]);
    H = getframe(gca);
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_LA_',char(labels),'.jpg');
    imwrite(imresize(H.cdata,[224 224]),fullfile(imgLoc,imFileName));

end

imageRoot = fullfile(parentFolder,dataFolder);

disp('LP')

for i = 1:height(labelEEGData.LP)-1

    data = labelEEGData.LP{i,1};
    labels = labelEEGData.label(i);

    signalLength = length(data);

    fb = cwtfilterbank('SignalLength',signalLength,'VoicesPerOctave',12,'SamplingFrequency',Fs,'FrequencyLimits',[1 24]);
    
    [cfs,frq] = fb.wt(gpuArray(data));
    cfs = abs(cfs * kurtosis(data)/mean(pentropy(data,Fs)));
    t = (0:(Fs*2-1))/Fs;
    pcolor(t,frq,cfs);
    set(gca,'yscale','log','XTick',[],'YTick',[]);shading interp; axis tight; caxis([0 200]);
    H = getframe(gca);
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_LP_',char(labels),'.jpg');
    imwrite(imresize(H.cdata,[224 224]),fullfile(imgLoc,imFileName));

end

disp('RA')

imageRoot = fullfile(parentFolder,dataFolder);

for i = 1:height(labelEEGData.RA)-1

    data = labelEEGData.RA{i,1};
    labels = labelEEGData.label(i);

    signalLength = length(data);

    fb = cwtfilterbank('SignalLength',signalLength,'VoicesPerOctave',12,'SamplingFrequency',Fs,'FrequencyLimits',[1 24]);

    [cfs,frq] = fb.wt(gpuArray(data));
    cfs = abs(cfs * 2.5/mean(pentropy(data,Fs)));
    t = (0:(Fs*2-1))/Fs;
    pcolor(t,frq,cfs);
    set(gca,'yscale','log','XTick',[],'YTick',[]);shading interp; axis tight; caxis([0 200]);
    H = getframe(gca);
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_RA_',char(labels),'.jpg');
    imwrite(imresize(H.cdata,[224 224]),fullfile(imgLoc,imFileName));

end

disp('RP')

imageRoot = fullfile(parentFolder,dataFolder);

for i = 1:height(labelEEGData.RP)-1

    data = labelEEGData.RP{i,1};
    labels = labelEEGData.label(i);

    signalLength = length(data);

    fb = cwtfilterbank('SignalLength',signalLength,'VoicesPerOctave',12,'SamplingFrequency',Fs,'FrequencyLimits',[1 24]);

    [cfs,frq] = fb.wt(gpuArray(data));
    cfs = abs(cfs * kurtosis(data)/mean(pentropy(data,Fs)));
    t = (0:(Fs*2-1))/Fs;
    pcolor(t,frq,cfs);
    set(gca,'yscale','log','XTick',[],'YTick',[]);shading interp; axis tight; caxis([0 200]);
    H = getframe(gca);
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_RP_',char(labels),'.jpg');
    imwrite(imresize(H.cdata,[224 224]),fullfile(imgLoc,imFileName));

end

toc

beep

beep

beep

%% Train the DCNN

parentFolder = % parent folder
dataFolder = % data folder

allImages = imageDatastore(fullfile(parentFolder,dataFolder),...
'IncludeSubfolders',true,...
'LabelSource','foldernames');

%% split images

rng default
[imgsTrain,imgsValidation] = splitEachLabel(allImages,0.2,'randomized');
disp(['Number of training images: ',num2str(numel(imgsTrain.Files))]);
disp(['Number of validation images: ',num2str(numel(imgsValidation.Files))]);


%%
net = googlenet;

lgraph = layerGraph(net);
numberOfLayers = numel(lgraph.Layers);
figure('Units','normalized','Position',[0.1 0.1 0.8 0.8]);
plot(lgraph)
title(['GoogLeNet Layer Graph: ',num2str(numberOfLayers),' Layers']);

%%
newDropoutLayer = dropoutLayer(0.6,'Name','new_Dropout');
lgraph = replaceLayer(lgraph,'pool5-drop_7x7_s1',newDropoutLayer);

%%
numClasses = numel(categories(imgsTrain.Labels));
newConnectedLayer = fullyConnectedLayer(numClasses,'Name','new_fc',...
'WeightLearnRateFactor',5,'BiasLearnRateFactor',5);
lgraph = replaceLayer(lgraph,'loss3-classifier',newConnectedLayer);

%%
newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'output',newClassLayer);

%%
options = trainingOptions('sgdm',...
'MiniBatchSize',15,...
'MaxEpochs',20,...ex
'InitialLearnRate',1e-4,...
'ValidationData',imgsTrain,...
'ValidationFrequency',10,...
'Verbose',1,...
'ExecutionEnvironment','auto',...
'Plots','training-progress');
rng default

%%
trainedGN = trainNetwork(imgsTrain,lgraph,options);

%%

disp('training images')
[YPred,probs] = classify(trainedGN,imgsTrain);
accuracy = mean(YPred==imgsTrain.Labels);
disp(['GoogLeNet Accuracy: ',num2str(100*accuracy),'%'])


disp('validation images')
[YPred,probs] = classify(trainedGN,imgsValidation);
accuracy = mean(YPred==imgsValidation.Labels);
disp(['GoogLeNet Accuracy: ',num2str(100*accuracy),'%'])
%% classify images/EEG recordings

tic

parentFolder = % parent folder
dataFolder = % data folder;

imageRoot = fullfile(parentFolder,dataFolder);

colormap jet;

labelEEGData = evalin('base','labelEEGData');
trainedGN = evalin('base','trainedGN');
EEGData = evalin('base','EEGData');

h = height(labelEEGData);

disp('LA')

for i = 1:(h-1)


    labels = 'unclassified';

    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_LA_',char(labels),'.jpg');

    
    imgsClassify = imageDatastore(fullfile(imgLoc,imFileName));

    [EEGData.LAclass{i},EEGData.LAprob{i}] = classify(trainedGN,imgsClassify);

end

imageRoot = fullfile(parentFolder,dataFolder);

disp('LP')

for i = 1:(h-1)


    labels = 'unclassified';
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_LP_',char(labels),'.jpg');
    
    imgsClassify = imageDatastore(fullfile(imgLoc,imFileName));

    [EEGData.LPclass{i},EEGData.LPprob{i}] = classify(trainedGN,imgsClassify);

end


imageRoot = fullfile(parentFolder,dataFolder);

disp('RA')

for i = 1:(h-1)


    labels = 'unclassified';

     
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_RA_',char(labels),'.jpg');
    
    imgsClassify = imageDatastore(fullfile(imgLoc,imFileName));

    [EEGData.RAclass{i},EEGData.RAprob{i}] = classify(trainedGN,imgsClassify);

end

imageRoot = fullfile(parentFolder,dataFolder);

disp('RP')

for i = 1:(h-1)

    labels = 'unclassified';
    
    imgLoc = fullfile(imageRoot,char(labels));
    imFileName = strcat(num2str(i*2-2),'_RP_',char(labels),'.jpg');
    
    imgsClassify = imageDatastore(fullfile(imgLoc,imFileName));

    [EEGData.RPclass{i},EEGData.RPprob{i}] = classify(trainedGN,imgsClassify);

end

    if EEGData.LAclass{1}=='baseline' && EEGData.LPclass{1}=='baseline' && EEGData.RAclass{1}=='baseline' && EEGData.RPclass{1}=='baseline'...
            && EEGData.LAclass{2}=='baseline' && EEGData.LPclass{2}=='baseline' && EEGData.RAclass{2}=='baseline' && EEGData.RPclass{2}=='baseline'
        EEGData.class{1} = 0;

    else
        EEGData.class{1} = 1;

    end


j=1;


for i = 2:height(labelEEGData)-2
    
    if EEGData.LAclass{i}=='baseline' && EEGData.LPclass{i}=='baseline' && EEGData.RAclass{i}=='baseline' && EEGData.RPclass{i}=='baseline'...
            && EEGData.LAclass{i-1}=='baseline' && EEGData.LPclass{i-1}=='baseline' && EEGData.RAclass{i-1}=='baseline' && EEGData.RPclass{i-1}=='baseline'...
            && EEGData.LAclass{i+1}=='baseline' && EEGData.LPclass{i+1}=='baseline' && EEGData.RAclass{i+1}=='baseline' && EEGData.RPclass{i+1}=='baseline'
        EEGData.class{i} = 0;

    else
        EEGData.class{i} = 1;

    end
    
end

EEGData=EEGData(1:(h-1),:);

EEGData.class{h} = 0;

%% Find seizure start and end times

for i = 2:height(EEGData)

    if EEGData.class{i}-EEGData.class{i-1}==1
        EEGData.sz_start_stop{i} = 'start';

    elseif EEGData.class{i}-EEGData.class{i-1}==-1
        EEGData.sz_start_stop{i} = 'stop';

    else
        EEGData.sz_start_stop{i} = 'neither';

    end

end

    EEGData.sz_start_stop{1} = 'neither';
    EEGData.sz_start_stop{end} = 'stop';

sz_start_indices = find(strcmp(EEGData.sz_start_stop, 'start'));
sz_stop_indices = find(strcmp(EEGData.sz_start_stop, 'stop'));

sz_start_times = 2*((sz_start_indices)-1);
sz_stop_times = 2*((sz_stop_indices)-1);
sz_stop_times(end) = (sz_stop_times(end)+2);

DCNN_sz_times = [sz_start_times sz_stop_times];

toc

beep
pause(1)
beep
pause(1)
beep



