Этот пример демонстрирует генерацию кода для Основанного на акустике Распознавания Отказа Машины (Audio Toolbox) с помощью долгой краткосрочной памяти (LSTM) сетевые и спектральные дескрипторы. Этот пример использует MATLAB® Coder™ с поддержкой глубокого обучения, чтобы сгенерировать MEX (исполняемый файл MATLAB) функция, которая усиливает эффективность библиотеки Intel® MKL-DNN. Входные данные состоят из записей timeseries акустики от неисправных или здоровых воздушных компрессоров, и выход является состоянием механической машины, предсказанной сетью LSTM. Для получения дополнительной информации на предварительной обработке аудио и сетевом обучении, смотрите Основанное на акустике Распознавание Отказа Машины (Audio Toolbox).
Интерфейс MATLAB Coder f или Пакет поддержки Библиотек Глубокого обучения
Процессор Intel с поддержкой Intel Усовершенствованные Векторные Расширения 2 (Intel AVX2)
Библиотека глубоких нейронных сетей Intel (MKL-DNN)
Переменные окружения для Intel MKL-DNN
Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder)
Задайте частоту дискретизации fs
из 16 кГц и windowLength
из 512 выборок, как задано в Основанном на акустике Распознавании Отказа Машины (Audio Toolbox). Установите 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, загрузите и разархивируйте систему, разработанную в Основанном на акустике Распознавании Отказа Машины (Audio Toolbox).
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 System Toolbox) считать аудио способом потоковой передачи и dsp.AsyncBuffer
Объект (DSP System Toolbox) накопить баллы.
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
разработанный в Основанном на акустике Распознавании Отказа Машины (Audio Toolbox), чтобы вычислить функции аудио и выполнить классификацию глубокого обучения.
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)
Создайте объект настройки генерации кода сгенерировать исполняемый файл. Задайте выходной язык как 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
Инициализируйте 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)
Используйте tic
и toc
измерять время выполнения функции MATLAB recognizeAirCompressorFault
и исполняемый файл MATLAB (MEX) recognizeAirCompressorFault_mex
.
Создайте dsp.AsyncBuffer
Объект (DSP System Toolbox) записать время выполнения.
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 (Audio Toolbox).
[1] Verma, Нищел К., и др. "Интеллектуальный основанный на условии Контроль Используя Акустические Сигналы для Воздушных Компрессоров". Транзакции IEEE на Надежности, издании 65, № 1, март 2016, стр 291–309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.