Итерационный подход к созданию маркированных наборов сигналов с уменьшением человеческих усилий

Этот пример представляет итерационный рабочий процесс на основе глубокого обучения для маркировки сигналов с уменьшенными усилиями по маркировке человека.

Маркировка сигнальных данных является утомительной и дорогой задачей, которая требует больших человеческих усилий. Поиск способов уменьшить это усилие может значительно ускорить разработку решений глубокого обучения для задач обработки сигналов.

Рассмотрим задачу маркировки необходимых областей в наборе сигнальных данных. Первый подход состоит в маркировке всех данных вручную. Такой подход требует много времени и усилий. Альтернативный подход, исследованный в этом примере, обрабатывает процесс маркировки итеративно. При каждой итерации подмножество сигналов выбирается из немаркированного набора данных и отправляется в предварительно обученную глубокую сеть для автоматической маркировки. Человек-маркер исследует полученные метки и исправляет неправильные метки. Проверенные маркированные сигналы добавляются к набору обучающих данных, чтобы переобучить глубокую сеть с расширенными обучающими данными.

При каждой итерации человек-маркер все еще должен посетить и изучить все сигналы, маркированные сетью. Однако задача изменяется от сигналов маркировки с нуля до исправления неточных меток, сгенерированных надежной сетью. Эта последняя задача требует значительно меньших усилий по маркировке человека. При каждой новой итерации сеть обучается с большим количеством данных, что приводит к улучшению эффективности предсказания и маркировки сети. Следовательно, при каждой итерации для коррекции меток требуется все меньше человеческого вмешательства.

Этот пример следует процедуре, представленной в Сегментации Формы Волны Использование Глубокого Обучения для обучения сети долгой краткосрочной памяти (LSTM), которая может классифицировать выборки сигнала ЭКГ как принадлежащие к одному из трёх необходимых областей.

Данные

Этот пример рассматривает маркировку областей сигнала ЭКГ с использованием данных, общедоступных в базе данных QT [1] [2]. Данные состоят примерно из 15 минут записей ЭКГ от 105 пациентов. Чтобы получить каждую запись, экзаменаторы поместили два электрода в других местах на груди пациента, получая двухканальный сигнал. База данных обеспечивает метки областей сигнала, сгенерированные автоматизированной экспертной системой [3]. Метки соответствуют местоположениям областей P волны, T волны и QRS комплекса в измерениях ЭКГ. Каждый канал 105 двухканальных сигналов ЭКГ был маркирован независимо автоматизированной экспертной системой и обрабатывается независимо для всего 210 сигналов ЭКГ, которые хранились вместе с метками области в 210 MAT-файлах. Файлы доступны в следующем расположении: https://www.mathworks.com/supportfiles/SPT/data/QTDatabaseECGData1.zip.

Загрузите набор данных с помощью downloadSupportFile функция.

% Download the data
datasetZipFile = matlab.internal.examples.downloadSupportFile('SPT','data/QTDatabaseECGData1.zip');
datasetFolder = fullfile(fileparts(datasetZipFile),'QTDataset');
if ~exist(datasetFolder,'dir')     
     unzip(datasetZipFile,fileparts(datasetZipFile));
end

The unzip операция создает datasetFolder папка с 210 MAT-файлами в ней. Каждый файл содержит сигнал ЭКГ в переменной ecgSignal и таблица меток областей в переменных signalRegionLabels. Каждый файл также содержит частоту дискретизации сигнала в переменной Fs. В этом примере все сигналы имеют частоту дискретизации 250 Гц.

Создайте сигнальный datastore для доступа к данным в файлах. Укажите имена переменных, которые вы хотите считать из каждого файла, используя SignalVariableNames параметр.

sds = signalDatastore(datasetFolder,'SignalVariableNames',["ecgSignal","signalRegionLabels"])
sds = 
  signalDatastore with properties:

                       Files:{
                             ' .../MATLAB/Examples/R2021b/supportfiles/SPT/data/QTDataset/ecg1.mat';
                             ' .../MATLAB/Examples/R2021b/supportfiles/SPT/data/QTDataset/ecg10.mat';
                             ' .../MATLAB/Examples/R2021b/supportfiles/SPT/data/QTDataset/ecg100.mat'
                              ... and 207 more
                             }
                     Folders: {'/home/fboucher/Documents/MATLAB/Examples/R2021b/supportfiles/SPT/data/QTDataset'}
    AlternateFileSystemRoots: [0×0 string]
                    ReadSize: 1
         SignalVariableNames: ["ecgSignal"    "signalRegionLabels"]
       ReadOutputOrientation: "column"

datastore возвращает массив ячеек с двумя элементами с сигналом ECG и таблицей меток областей каждый раз, когда вы вызываете read функция. Используйте preview функция datastore, чтобы увидеть, что содержимое первого файла является сигналом ЭКГ длиной 225000 дискретизаций и таблицей, содержащей 3385 меток областей.

data = preview(sds)
data=2×1 cell array
    {225000×1 double}
    {  3385×2 table }

Проверьте первые несколько строк таблицы меток областей и заметьте, что каждая строка содержит индексы пределов областей и значение класса областей (P, T или QRS).

head(data{2})
ans=8×2 table
    ROILimits     Value
    __________    _____

     83    117     P   
    130    153     QRS 
    201    246     T   
    285    319     P   
    332    357     QRS 
    412    457     T   
    477    507     P   
    524    547     QRS 

Визуализируйте метки для первых 1000 выборок с помощью signalMask объект.

MGroundTruth = signalMask(data{2});
plotsigroi(MGroundTruth,data{1}(1:1000))

Преобразуйте необходимые области меток в категориальную последовательность, чтобы иметь возможность обучить глубокую сеть для выполнения классификации последовательность-последовательность. Используйте transform функция datastore для применения преобразования, когда данные сигнала считываются с диска.

numFiles = numel(sds.Files);
sds = transform(sds,@getmask);

Измените размер (разделите) сигналов и меток, чтобы получить несколько сегментов длины 5000 выборок и преобразовать каждый сегмент ЭКГ в частотно-временную область с помощью Synchrosqueezed преобразования Фурье (FSST).

sds = transform(sds,@resizeData);
sdsFSST = transform(sds,@(x,fs)extractFSSTFeatures(x,250));

Используйте 70% файлов для обучения и 30% для проверки. Перетащите набор данных так, чтобы сигналы обучения и тестирования были выбраны случайным образом.

rng default
[trainIdx,~,testIdx] = dividerand(numFiles,0.7,0,0.3);

trainDs = subset(sds,trainIdx); % resized 5000 sample signals and labels
trainDsFSST = subset(sdsFSST,trainIdx); % FSST-transformed signals and labels

testDsFSST = subset(sdsFSST,testIdx);

Считайте все данные в память с помощью метода readall хранилищ данных. Это действие будет считывать каждый сигнал ECG и применять все преобразования, описанные выше, чтобы вернуть несколько сегментов ECG, преобразованных синхронизацией Фурье. Используйте UseParallel опция параллельного преобразования набора данных с помощью доступных процессоров в вашем компьютере каждый раз, когда у вас есть ™ Parallel Computing Toolbox.

% Get FSST-transformed signals
ecgFSSTData = readall(trainDsFSST,UseParallel=true);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 8).
testFSSTData = readall(testDsFSST,UseParallel=true);

ecgFSST = ecgFSSTData(:,1);
ecgLabels = ecgFSSTData(:,2);

testECGFSST = testFSSTData(:,1);
testLabels = testFSSTData(:,2);

% Get time domain signal segments so that we can plot some labeling results
ecgData = readall(trainDs);
ecgSignals = ecgData(:,1);

Этот пример показывает, что возможно уменьшить человеческие усилия, связанные с маркировкой сигнала, путем итерационного обучения глубокой сети. При каждой итерации:

  1. Сеть помечает подмножество немаркированных систем координат данных, используя ранее маркированные системы координат.

  2. Человек-маркер исправляет любые ошибки маркировки вручную.

  3. Исправленную маркировку добавляют к ранее маркированным системам координат.

  4. Расширенный набор маркированных сигналов используется для обучения сети к следующей итерации.

Чтобы провести количественные сравнения, моделируйте два сценария:

  • Для сценария базовой линии, в котором человек помечает набор данных в целом с нуля, обучите сеть с помощью полностью помеченных ecgFrames установите.

  • Для второго сценария сделайте вид, что ecgFrames данные не маркируются и маркируются с помощью итерационного метода

Предсказание Эффективности с использованием полностью маркированного набора данных ЭКГ

Создайте сеть BiLSTM и обучите ее с полным маркированным ecgFrames установлено, чтобы получить верхнюю границу производительности прогнозирования. Как упоминалось выше, этот подход требует маркировки грубой силы всего набора данных и, следовательно, самого большого усилия по маркировке человека. Обучите сеть маркированным ecgFrames установите и вычислите точность предсказания на тестовые данные наборе.

Сетевая архитектура

Создайте сеть BiLSTM с помощью слоев глубокого обучения.

  • Задайте sequenceInputLayer с размером в качестве количества функций в FSST сигналов, которое является общим количеством выборок частотного диапазона (40 в этом примере).

  • Задайте bilstmLayer с 200 скрытыми узлами и установите OutputMode на sequence поскольку каждая выборка сигнала имеет метку.

  • Задайте fullyConnectedLayer с размером выходом 4, соответствующим четырем категориям, P-волна, QRS-комплекс, T-волна и N/A.

  • Добавление softmaxLayer и a classificationLayer для вывода предполагаемых меток.

% Training with the full emulated unlabeled data set
layers = [ ...
    sequenceInputLayer(size(ecgFSST{1},1))
    bilstmLayer(200,'OutputMode','sequence')
    fullyConnectedLayer(4)
    softmaxLayer
    classificationLayer];

Использование traningOptions чтобы задать решатель оптимизации и гиперпараметры для обучения сети. В этом примере используется оптимизатор ADAM и мини-пакет размером 50. Обучите сеть с помощью CPU или GPU. Для использования графический процессор требуется Parallel Computing Toolbox™. Информацию о том, какие графические процессоры поддерживаются, см. в разделе Поддержка GPU Release (Parallel Computing Toolbox). Для получения информации о других параметрах смотрите trainingOptions (Deep Learning Toolbox). Этот пример использует графический процессор для обучения с использованием ExecutionEnvironment'пара "имя-значение".

options = trainingOptions('adam', ...
    'MaxEpochs',10, ...
    'MiniBatchSize',50, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch',...
    'Plots','training-progress',...
    'Verbose',0,...
    'DispatchInBackground',true);

Обучите сеть с полностью маркированными ecgFrames набор данных.

baselineNet = trainNetwork(ecgFSST,ecgLabels,layers,options);

Классифицируйте системы координат с помощью обученной сети и вычислите среднюю точность предсказания. Точность базового предсказания составляет около 90%.

predictLabelsAll = classify(baselineNet,testECGFSST,'MiniBatchSize',50);
accuracyAll = mean(cellfun(@(x,y)mean(x==y),predictLabelsAll,testLabels));
fprintf('The baseline prediction accuracy is %2.1f%%.\n',accuracyAll*100);
The baseline prediction accuracy is 89.9%.

Итеративная маркировка с человеком в цикле

Чтобы уменьшить усилия по маркировке, попробуйте итеративный подход: Притворитесь, что ecgFrames первоначально набор данных не маркируется, и данные маркируются вручную. В реальности в примере используются метки основной истины, предоставляемые набором данных.

Обучите начальную сеть

Начните, выбрав 25 системы координат из ecgFrames установите и маркируйте их вручную. Обучите сеть BiLSTM с этим начальным маркированным набором, чтобы служить начальным шагом итерационного процесса.

numInitFrames = 25;

currentTrainingSet = ecgFSST(1:numInitFrames,1);
currentTrainingLabels = ecgLabels(1:numInitFrames);

Установите опции обучения, чтобы иметь больше эпох обучения и меньший размер мини-пакета, потому что в исходном наборе обучающих данных есть только 25 системы координат.

options = trainingOptions('adam', ...
    'MaxEpochs',20, ...
    'MiniBatchSize',5, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch', ...
    'Plots','none',...
    'Verbose',0,...
    'DispatchInBackground',true);

Обучите сеть BiLSTM с исходным набором обучающих данных и предсказайте метки с помощью того же набора тестовых данных, используемого для установления базового уровня эффективности. Точность предсказания этой исходной сети составляет около 40%.

initNet = trainNetwork(currentTrainingSet,currentTrainingLabels,layers,options);
initPrediction = classify(initNet,testECGFSST,'MiniBatchSize',50); 
initAccuracy = mean(cellfun(@(x,y)mean(x==y),initPrediction,testLabels));
fprintf('The prediction accuracy is %2.1f%%.\n',initAccuracy*100);
The prediction accuracy is 43.7%.

Маркировка

На следующем шаге выберите 200 новые системы координат данных из ecgFrames установите и отправьте их в предварительно обученную сеть, initNet, чтобы пометить сигналы автоматически.

iteration = 1;
% Number of frames to label at each iteration
numFrames = 200; 
% Select the next set of frames to label
indexNext = numInitFrames+1:numInitFrames+numFrames;
% Use classify to label the new frames
currentPrediction = classify(initNet,ecgFSST(indexNext),'MiniBatchSize',50);

Оцените результаты маркировки, сгенерированные сетью, и сравните их с основной истиной. Найдите индексы сигналов ECG, которые получили бест- и худшую эффективность в этой сети.

errs = cellfun(@(x,y)sum(x~=y),ecgLabels(indexNext),currentPrediction);
[~,bestIndex] = min(errs);
[~,worstIndex] = max(errs);

Для наилучшего сценария постройте график первых 750 выборок, наложенных метками основной истины и метками, предсказанными сетью.

ecgSignalOfInterest = ecgSignals{indexNext(bestIndex)};
groundTruthLabels = ecgLabels{indexNext(bestIndex)};
predictedLabels = currentPrediction{bestIndex};

MGroundTruth = signalMask(groundTruthLabels);
figure
plotsigroi(MGroundTruth,ecgSignalOfInterest(1:750))
title('Ground Truth - best-case scenario')

MPredicted = signalMask(predictedLabels);
figure
plotsigroi(MPredicted,ecgSignalOfInterest(1:750))
title('Labeling by Network - best-case scenario')

Сеть хорошо справилась с маркировкой этой системы координат. В результате человек, проверяющий результаты сети, может исправить предсказанные метки с небольшими усилиями.

Однако существуют случаи, когда эффективность маркировки сети не так сильна. Постройте график результатов, полученных в наихудшем сценарии.

ecgSignalOfInterest = ecgSignals{indexNext(worstIndex)};
groundTruthLabels = ecgLabels{indexNext(worstIndex)};
predictedLabels = currentPrediction{worstIndex};

MGroundTruth = signalMask(groundTruthLabels);
figure
plotsigroi(MGroundTruth,ecgSignalOfInterest(1:750))
title('Ground Truth - worst-case scenario')

MPredicted = signalMask(predictedLabels);
figure
plotsigroi(MPredicted,ecgSignalOfInterest(1:750))
title('Labeling by Network - worst-case scenario')

Эффективность сети на этом сигнале не так хороша. В этом случае человек-маркер должен внести несколько коррекций в предсказанные метки.

Чтобы количественно оценить усилия по коррекции для 200 систем координат данных, вычислите частоту ошибок маркировки сети и среднее количество выборок на систему координат, которые должны быть исправлены маркером человека.

numSamplesPerFrame = 5000;
networkLabelingErrorRate(iteration) = 1-mean(cellfun(@(x,y)mean(x==y),currentPrediction,ecgLabels(indexNext)));
averageNumOfCorrectionsPerFrame(iteration) = networkLabelingErrorRate(iteration) * numSamplesPerFrame;
fprintf('The average number of corrections per frame is %2.1f.\n',averageNumOfCorrectionsPerFrame(iteration));
The average number of corrections per frame is 2211.3.

Для первой итерации существуют в среднем около 2200 выборки на систему координат, который должен быть исправлен человеком. Скорректированные выборки по системам координат являются удобной метрикой, чтобы показать усилия человека. Однако обратите внимание, что на практике человек-маркер не должен корректировать метку каждой выборки. Вместо этого человек-маркер должен только расширить или сократить пределы области.

В конце первой итерации человек будет просматривать 200 системы координат и изменять любую метку с неправильными значениями. С помощью сети и человеческого маркера системы координат данных имеют правильные метки в конце итерации.

При следующей итерации 200 вновь маркированных систем координат могут быть добавлены к currentTrainingSet установлено, чтобы переобучить сеть и повторить итерацию маркировки. Этот график иллюстрирует рабочий процесс в каждой итерации после первой итерации:

Повторите итерации маркировки

Расширьте набор обучающих данных путем добавления недавно исправленных маркированных систем координат, выберите еще 200 системы координат данных, которые будут маркироваться, и повторите итерацию маркировки, пока эффективность не будет удовлетворительным.

% Include the initial training set and the 200 newly labeled data frames
maxIter = 15;
indexTraining = 1:numInitFrames+numFrames;

networkAccuracy = zeros(1,15);
networkAccuracy(iteration) = initAccuracy;

options = trainingOptions('adam', ...
    'MaxEpochs',20, ...
    'MiniBatchSize',50, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch', ...
    'Plots','none', ...
    'Verbose',0);

for iteration = 2:maxIter
    % Extended training data set
    currentTrainingSet = ecgFSST(indexTraining,1);    
    % Emulate human correction by assigning ground-truth labels to the
    % extended training set
    currentTrainingLabels = ecgLabels(indexTraining);

    % Train network with extended training set
    currentNet = trainNetwork(currentTrainingSet,currentTrainingLabels,layers,options);
    
    % Predict labels for the test data set and calculate the accuracy to
    % compare to baseline performance
    currentTestSetPrediction = classify(currentNet,testECGFSST,'MiniBatchSize',50);
    networkAccuracy(iteration) = mean(cellfun(@(x,y)mean(x==y),currentTestSetPrediction,testLabels));
    
    % Get another numFrames data frames for human labeler
    indexNext = indexTraining(end)+1:indexTraining(end)+numFrames;
    
    % Measure average number of human corrections per frame in this iteration
    currentPrediction = classify(currentNet,ecgFSST(indexNext),'MiniBatchSize',50);
    networkLabelingErrorRate(iteration) = 1-mean(cellfun(@(x,y)mean(x==y),currentPrediction,ecgLabels(indexNext)));
    averageNumOfCorrectionsPerFrame(iteration) = networkLabelingErrorRate(iteration) * numSamplesPerFrame;
    
    indexTraining = 1:indexNext(end);
end

Эффективность маркировки

После 15 итераций маркировки существует 2825 системы координат данных в currentTrainingSet, соответствующий примерно половине из 6543 систем координат данных, содержащихся в полном ecgDataset установите. Точность предсказания сети, обученной с 2825 систем координат, уже очень близка к исходной точности.

accuDiff = accuracyAll-networkAccuracy(end);
fprintf('The accuracy difference is %2.1f%%.\n',accuDiff*100);
The accuracy difference is 2.1%.

Постройте график точности предсказания сети для тестовых данных набора относительно размера обучающих данных при каждой итерации. Отобразите верхнюю границу точности, полученной с набором полностью маркированных данных. Когда проверяются больше систем координат данных, точность предсказания сети улучшается.

figure
examinedDataSize = 25:200:2825;
plot(examinedDataSize,networkAccuracy,'*-')
hold on
% Prediction accuracy upper bound
plot(examinedDataSize,ones(1,15)*accuracyAll,'r--')
grid on
xlabel('Training set size')
title('Accuracy for the test data set')
xlim([25 2825])
legend('Labeling Network','Upper Bound','Location','southeast')

По мере прогресса итераций среднее количество человеческих исправлений на систему координат уменьшается, когда увеличения размер обучающего набора данных. Поскольку больше системы координат данных проверяются и используются для обучения сети, для исправления меток выбранных систем координат требуется меньше человеческих усилий.

figure
plot(examinedDataSize,averageNumOfCorrectionsPerFrame,'*-')
grid on
xlabel('Training set size')
title('Average number of human corrections per frame')
xlim([25 2825])

На протяжении всех 15 итераций маркировки среднее значение около 700 выборок сигнала на систему координат требовались коррекции человеком. Как упоминалось ранее, на практике человек корректирует маркированные области путем расширения или сокращения пределов области, а не путем изменения отдельных меток выборки.

fprintf('The average number of corrections per frame is %2.1f.\n',mean(averageNumOfCorrectionsPerFrame));
The average number of corrections per frame is 716.9.

Заключение

Этот пример показал, что маркировка только половины набора данных ЭКГ позволяет глубокой сети достичь точности предсказания, подобной той, которая достигается той же сетью при обучении с набором полностью маркированных данных. При предлагаемом рабочем процессе итерационной маркировки человек-маркер должен просмотреть только половину набора данных и исправить в среднем 700 выборок сигнала на систему координат. С другой стороны, маркировка грубой силы требует просмотра каждой системы координат в наборе данных и маркировки всех его выборок с нуля.

Ссылки

[1] Голдбергер, Ари Л., Луис А. Н. Амарал, Леон Гласс, Джеффри М. Хаусдорф, Пламен Ч. Иванов, Роджер Г. Марк, Джозеф Е. Миетус, Джордж Б. Муди, Чунг-Канг Пенг PhysioBank, PhysioToolkit и PhysioNet: компоненты нового исследовательского ресурса комплексных физиологических сигналов. Циркуляция. Том 101, № 23, 2000, pp. e215-e220. [Тиражные электронные страницы; http://circ.ahajournals.org/content/101/23/e215.full].

[2] Лагуна, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. «База данных для оценки алгоритмов измерения интервалов QT и других сигналов в ЭКГ». Компьютеры в кардиологии. Vol.24, 1997, стр 673–676.

[3] Лагуна, Пабло, Раймон Жане и Пере Каминаль. «Автоматическое обнаружение контуров волны в многоуровневых сигналах ЭКГ: валидация с базой данных CSE». Компьютеры и биомедицинские исследования. Том 27, № 1, 1994, стр. 45-60.

См. также

|

Для просмотра документации необходимо авторизоваться на сайте