Основанная на акустике генерация кода распознавания отказа машины с Intel MKL-DNN

Этот пример демонстрирует генерацию кода для Основанного на акустике Распознавания Отказа Машины с помощью долгой краткосрочной памяти (LSTM) сетевые и спектральные дескрипторы. Этот пример использует MATLAB® Coder™ с поддержкой глубокого обучения, чтобы сгенерировать MEX (исполняемый файл MATLAB) функция, которая усиливает эффективность библиотеки Intel® MKL-DNN. Входные данные состоят из записей timeseries акустики от неисправных или здоровых воздушных компрессоров, и выход является состоянием механической машины, предсказанной сетью LSTM. Для получения дополнительной информации на предварительной обработке аудио и сетевом обучении, смотрите Основанное на акустике Распознавание Отказа Машины.

Требования в качестве примера

  • Интерфейс MATLAB Coder f или Пакет поддержки Библиотек Глубокого обучения

  • Процессор Intel с поддержкой Intel Усовершенствованные Векторные Расширения 2 (Intel AVX2)

  • Библиотека глубоких нейронных сетей Intel (MKL-DNN)

  • Переменные окружения для Intel MKL-DNN

Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder)

Подготовьте входной набор данных

Задайте частоту дискретизации fs из 16 кГц и windowLength из 512 выборок, как задано в Основанном на акустике Распознавании Отказа Машины. Установите numFrames к 100.

fs = 16000;
windowLength = 512;
numFrames = 100;

Чтобы запустить Пример на тестовом сигнале, сгенерируйте розовый шумовой сигнал. Чтобы проверить производительность системы на действительном наборе данных, загрузите воздушный набор данных компрессора [1].

downloadDataset = false;

if ~downloadDataset
    pinkNoiseSignal = pinknoise (windowLength*numFrames);
else
    % Download AirCompressorDataset.zip 
    компонент = 'audio';
    имя файла = 'AirCompressorDataset/AirCompressorDataset.zip';
    localfile = matlab.internal.examples.downloadSupportFile (компонент, имя файла);
    
    % Unzip the downloaded zip file to the downloadFolder
    downloadFolder = fileparts (localfile);
    if ~exist (fullfile (downloadFolder,'AirCompressorDataset'),'dir')
        разархивируйте (localfile, downloadFolder)
    end
    
    % Create an audioDatastore object dataStore, to manage, the data.
    dataStore = audioDatastore (downloadFolder,'IncludeSubfolders'TRUE,'LabelSource','foldernames');

    % Use countEachLabel to get the number of samples of each category in the dataset.
    countEachLabel (dataStore)
end

Распознайте отказ машины в MATLAB

Чтобы запустить классификатор потоковой передачи в MATLAB, загрузите и разархивируйте систему, разработанную в Основанном на акустике Распознавании Отказа Машины.

component = 'audio';
filename = 'AcousticsBasedMachineFaultRecognition/AcousticsBasedMachineFaultRecognition.zip';
localfile = matlab.internal.examples.downloadSupportFile(component,filename);

downloadFolder = fullfile(fileparts(localfile),'system');
if ~exist(downloadFolder,'dir')    
    unzip(localfile,downloadFolder)
end

Получить доступ к recognizeAirCompressorFault функция системы, добавляет downloadFolder к пути поиска файлов.

addpath(downloadFolder)

Создайте dsp.AsyncBuffer возразите, чтобы считать аудио способом потоковой передачи и dsp.AsyncBuffer объект накопить баллы.

audioSource = dsp.AsyncBuffer;
scoreBuffer = dsp.AsyncBuffer;

Загрузите предварительно обученную сеть и извлеките метки из сети.

airCompNet = coder.loadDeepLearningNetwork('AirCompressorFaultRecognitionModel.mat');
labels = string(airCompNet.Layers(end).Classes);

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

if ~downloadDataset
    signalToBeTested = pinkNoiseSignal;
else
    [allFiles,~] = splitEachLabel(dataStore,1);
    allData = readall(allFiles);
    signalToBeTested = allData(6);
    signalToBeTested = cell2mat (signalToBeTested);
end

Передайте одну аудио систему координат потоком за один раз, чтобы представлять систему, когда это было бы развернуто во встроенной системе реального времени. Используйте recognizeAirCompressorFault разработанный в Основанном на акустике Распознавании Отказа Машины, чтобы вычислить функции аудио и выполнить классификацию глубокого обучения.

write(audioSource,signalToBeTested);
resetNetworkState = true;

while audioSource.NumUnreadSamples >= windowLength

    % Get a frame of audio data
    x = read(audioSource,windowLength);

    % Apply streaming classifier function
    score = recognizeAirCompressorFault(x,resetNetworkState);
    
    % Store score for analysis
    write(scoreBuffer,score);
    
    resetNetworkState = false;
end

Вычислите распознанный отказ из баллов и отобразите его.

scores = read(scoreBuffer);
[~,labelIndex] = max(scores(end,:),[],2);
detectedFault = labels(labelIndex)
detectedFault = 
"Flywheel"

Постройте множество каждой метки для каждой системы координат.

plot(scores)
legend("" + labels,'Location','northwest') 
xlabel("Time Step")
ylabel("Score")
str = sprintf("Predicted Scores Over Time Steps.\nPredicted Class: %s",detectedFault);
title(str)

Сгенерируйте исполняемый файл MATLAB

Создайте объект настройки генерации кода сгенерировать исполняемый файл. Задайте выходной язык как C++.

cfg = coder.config('mex');
cfg.TargetLang = 'C++';

Создайте объект настройки для генерации кода глубокого обучения с библиотекой MKL-DNN. Присоедините объект настройки глубокого обучения к объекту настройки генерации кода.

dlcfg = coder.DeepLearningConfig('mkldnn');
cfg.DeepLearningConfig = dlcfg;

Создайте систему координат аудиоданных длины windowLength.

audioFrame = ones(windowLength,1);

Вызовите codegen (MATLAB Coder) функция от MATLAB Coder, чтобы сгенерировать Код С++ для recognizeAirCompressorFault функция. Задайте объект настройки и моделируйте аргументы. Файл MEX под названием recognizeAirCompressorFault_mex сгенерирован к вашей текущей папке.

codegen -config cfg recognizeAirCompressorFault -args {audioFrame,resetNetworkState} -report
Code generation successful: View report

Выполните распознавание отказа машины Используя исполняемый файл MATLAB

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

if ~downloadDataset
    signalToBeTested = pinkNoiseSignal;
else
    [allFiles,~] = splitEachLabel(dataStore,1);
    allData = readall(allFiles);
    signalToBeTested = allData(8);
    signalToBeTested = cell2mat (signalToBeTested);
end

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

write(audioSource,signalToBeTested);
resetNetworkState = true;

while audioSource.NumUnreadSamples >= windowLength

    % Get a frame of audio data
    x = read(audioSource,windowLength);

    % Apply streaming classifier function
    score = recognizeAirCompressorFault_mex(x,resetNetworkState);
    
    % Store score for analysis
    write(scoreBuffer,score);

    resetNetworkState = false;
end

Вычислите распознанный отказ из баллов и отобразите его.

scores = read(scoreBuffer);
[~,labelIndex] = max(scores(end,:),[],2);
detectedFault = labels(labelIndex)
detectedFault = 
"Flywheel"

Постройте множество каждой метки для каждой системы координат.

plot(scores)
legend("" + labels,'Location','northwest')
xlabel("Time Step")
ylabel("Score")
str = sprintf("Predicted Scores Over Time Steps.\nPredicted Class: %s",detectedFault);
title(str)

Оцените время выполнения альтернативного рабочего процесса MEX-функции

Используйте tic и toc измерять время выполнения функции MATLAB recognizeAirCompressorFault и исполняемый файл MATLAB (MEX) recognizeAirCompressorFault_mex.

Создайте dsp.AsyncBuffer возразите, чтобы записать время выполнения.

timingBufferMATLAB = dsp.AsyncBuffer;
timingBufferMEX = dsp.AsyncBuffer;

Используйте ту же запись, которую вы выбрали в предыдущем разделе в качестве входа к recognizeAirCompressorFault функционируйте и его MEX эквивалентный recognizeAirCompressorFault_mex.

write(audioSource,signalToBeTested);

Измерьте время выполнения кода MATLAB.

resetNetworkState = true;
while audioSource.NumUnreadSamples >= windowLength

    % Get a frame of audio data
    x = read(audioSource,windowLength);

    % Apply streaming classifier function
    tic
    scoreMATLAB = recognizeAirCompressorFault(x,resetNetworkState);
    write(timingBufferMATLAB,toc);

    % Apply streaming classifier MEX function
    tic
    scoreMEX = recognizeAirCompressorFault_mex(x,resetNetworkState);
    write(timingBufferMEX,toc);

    resetNetworkState = false;

end

Постройте время выполнения для каждой системы координат и анализируйте профиль. Первый вызов recognizeAirCompressorFault_mex использует приблизительно четыре раза бюджета, когда он включает загрузку сети и сброс состояний. Однако в действительной, развернутой системе, то время инициализации только понесено однажды. Время выполнения функции MATLAB составляет приблизительно 10 мс, и та из MEX-функции составляет ~1 мс, который является значительно ниже бюджета на 32 мс для эффективности в реальном времени.

budget = (windowLength/fs)*1000;
timingMATLAB = read(timingBufferMATLAB)*1000;
timingMEX = read(timingBufferMEX)*1000;
frameNumber = 1:numel(timingMATLAB);
perfGain = timingMATLAB./timingMEX;
plot(frameNumber,timingMATLAB,frameNumber,timingMEX,'LineWidth',2)
grid on
yline(budget,'',{'Budget'},'LineWidth',2)
legend('MATLAB Function','MEX Function','Location','northwest')
xlabel("Time Step")
ylabel("Execution Time (in ms)")
title("Execution Time Profile of MATLAB and MEX Function")

Вычислите увеличение производительности MEX по функции MATLAB, исключая первый вызов. Этот тест производительности сделан на машине с помощью P620 NVIDIA QUADRо (Версия 26) графический процессор и центральный процессор Intel® Xeon® W-2133, достигающий 3,60 ГГц.

PerformanceGain = sum(timingMATLAB(2:end))/sum(timingMEX(2:end))
PerformanceGain = 15.5501

Этот пример заканчивается здесь. Для развертывания распознавания отказа машины на Raspberry Pi смотрите Основанную на акустике Генерацию кода Распознавания Отказа Машины на Raspberry Pi.

Ссылки

[1] Verma, Нищел К., и др. "Интеллектуальный основанный на условии Контроль Используя Акустические Сигналы для Воздушных Компрессоров". Транзакции IEEE на Надежности, издании 65, № 1, март 2016, стр 291–309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.