В этом примере показано, как развернуть редукцию данных и сверточную нейронную сеть (CNN) для распознавания речевых команд на процессорах Intel ®. Чтобы сгенерировать редукцию данных и сетевой код, вы используете MATLAB Coder и библиотеку Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN). В этом примере сгенерированный код является исполняемой функцией MATLAB (MEX), которая вызывается скриптом MATLAB, который отображает предсказанную речевую команду вместе с сигналом временного интервала и слуховой спектрограммой. Для получения дополнительной информации о предварительной обработке аудио и сетевом обучении, смотрите Распознание речевых команд с использованием глубокого обучения.
MATLAB Coder Interface для пакета поддержки глубокого обучения
Процессор Xeon с поддержкой Intel Advanced Vector Extensions 2 (Intel AVX2)
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Переменные окружения для Intel MKL-DNN
Для поддерживаемых версий библиотек и для получения информации о настройке переменных окружения смотрите Необходимые условия для глубокого обучения с MATLAB Coder (MATLAB Coder).
Используйте те же параметры для редукции данных трубопровода и классификации, что и в Распознание речевых команд с использованием глубокого обучения.
Определите ту же частоту дискретизации, на которой обучалась сеть (16 кГц). Задайте частоту классификации и количество аудио выборок входа в систему координат. Функцией, входом к сети, является спектрограмма Bark, которая соответствует 1 секунде аудио данных. Спектрограмма Коры рассчитана для окон 25 мс с хмелем 10 мс.
fs = 16000; classificationRate = 20; samplesPerCapture = fs/classificationRate; segmentDuration = 1; segmentSamples = round(segmentDuration*fs); frameDuration = 0.025; frameSamples = round(frameDuration*fs); hopDuration = 0.010; hopSamples = round(hopDuration*fs);
Создайте audioFeatureExtractor
объект для извлечения 50-диапазонных спектрограмм коры без нормализации окна.
afe = audioFeatureExtractor( ... 'SampleRate',fs, ... 'FFTLength',512, ... 'Window',hann(frameSamples,'periodic'), ... 'OverlapLength',frameSamples - hopSamples, ... 'barkSpectrum',true); numBands = 50; setExtractorParams(afe,'barkSpectrum','NumBands',numBands,'WindowNormalization',false);
Загрузите предварительно обученную сверточную нейронную сеть и метки.
load('commandNet.mat') labels = trainedNet.Layers(end).Classes; numLabels = numel(labels); backgroundIdx = find(labels == 'background');
Задайте буферы и пороги принятия решений для постпроцессных предсказаний сети.
probBuffer = single(zeros([numLabels,classificationRate/2])); YBuffer = single(numLabels * ones(1, classificationRate/2)); countThreshold = ceil(classificationRate*0.2); probThreshold = single(0.7);
Создайте audioDeviceReader
объект, чтобы считать аудио с вашего устройства. Создайте dsp.AsyncBuffer
объект для буферизации звука в фрагменты.
adr = audioDeviceReader('SampleRate',fs,'SamplesPerFrame',samplesPerCapture,'OutputDataType','single'); audioBuffer = dsp.AsyncBuffer(fs);
Создайте dsp.MatrixViewer
объект и timescope
объект для отображения результатов.
matrixViewer = dsp.MatrixViewer("ColorBarLabel","Power per band (dB/Band)", ... "XLabel","Frames", ... "YLabel","Bark Bands", ... "Position",[400 100 600 250], ... "ColorLimits",[-4 2.6445], ... "AxisOrigin",'Lower left corner', ... "Name","Speech Command Recognition Using Deep Learning"); timeScope = timescope('SampleRate', fs, ... 'YLimits',[-1 1], 'Position', [400 380 600 250], ... 'Name','Speech Command Recognition Using Deep Learning', ... 'TimeSpanSource','Property', ... 'TimeSpan',1, ... 'BufferLength',fs); timeScope.YLabel = 'Amplitude'; timeScope.ShowGrid = true;
Показать возможности времени и средство просмотра матриц. Обнаруживайте команды, пока открыты программа средства просмотра возможностей и матрицы или пока не достигнут предел времени. Чтобы остановить обнаружение в реальном времени до достижения предела времени, закройте окно временных возможностей или окно средства просмотра матрицы.
show(timeScope) show(matrixViewer) timeLimit = 10; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit %% Capture Audio x = adr(); write(audioBuffer,x); y = read(audioBuffer,fs,fs-samplesPerCapture); % Compute auditory features features = extract(afe,y); auditory_features = log10(features + 1e-6); % Transpose to get the auditory spectrum auditorySpectrum = auditory_features'; % Perform prediction probs = predict(trainedNet, auditory_features); [~, YPredicted] = max(probs); % Perform statistical post processing YBuffer = [YBuffer(2:end),YPredicted]; probBuffer = [probBuffer(:,2:end),probs(:)]; [YMode_idx, count] = mode(YBuffer); count = single(count); maxProb = max(probBuffer(YMode_idx,:)); if (YMode_idx == single(backgroundIdx) || count < countThreshold || maxProb < probThreshold) speechCommandIdx = backgroundIdx; else speechCommandIdx = YMode_idx; end % Update plots matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end
Скрыть возможности.
hide(matrixViewer) hide(timeScope)
Чтобы создать функцию для выполнения редукции данных, совместимых с генерацией кода, вызовите generateMATLABFunction
на audioFeatureExtractor
объект. The generateMATLABFunction
объект создаёт автономную функцию, которая выполняет эквивалентную редукцию данных и совместима с генерацией кода.
generateMATLABFunction(afe,'extractSpeechFeatures')
Вспомогательная функция HelperSpeechCommandRecognition инкапсулирует редукцию данных и процесс сетевого предсказания, продемонстрированный ранее. Чтобы редукция данных была совместима с генерацией кода, редукция данных обрабатывается сгенерированным extractSpeechFeatures
функция. Чтобы сеть была совместима с генерацией кода, вспомогательная функция использует coder.loadDeepLearningNetwork
(MATLAB Coder) для загрузки сети.
Используйте функцию HelperSpeechCommandRecognition, чтобы выполнить живое обнаружение речевых команд.
show(timeScope) show(matrixViewer) timeLimit = 10; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit x = adr(); [speechCommandIdx, auditorySpectrum] = HelperSpeechCommandRecognition(x); matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end
Скрыть возможности.
hide(timeScope) hide(matrixViewer)
Создайте объект строения генерации кода для генерации исполняемой программы. Задайте целевой язык как C++.
cfg = coder.config('mex'); cfg.TargetLang = 'C++';
Создайте объект строения для генерации кода глубокого обучения с библиотекой MKL-DNN. Присоедините объект строения к объекту строения генерации кода.
dlcfg = coder.DeepLearningConfig('mkldnn');
cfg.DeepLearningConfig = dlcfg;
Функции codegen
(MATLAB Coder), чтобы сгенерировать код С++ для HelperSpeechCommandRecognition
функция. Задайте объект строения и аргументы прототипа. Файл MEX с именем HelperSpeechCommandRecognition_mex
сгенерирован в текущую папку.
codegen HelperSpeechCommandRecognition -config cfg -args {rand(samplesPerCapture, 1, 'single')} -profile -report -v
Code generation successful: View report
Показать возможности времени и средство просмотра матриц. Обнаруживайте команды, используя сгенерированный MEX, до тех пор, пока и область возможностей, и средство просмотра матриц не будут открыты или пока не будет достигнут предел времени. Чтобы остановить обнаружение в реальном времени до достижения предела времени, закройте окно временных возможностей или окно средства просмотра матрицы.
show(timeScope) show(matrixViewer) timeLimit = 20; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit x = adr(); [speechCommandIdx, auditorySpectrum] = HelperSpeechCommandRecognition_mex(x); matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end hide(matrixViewer) hide(timeScope)
Использование tic
и toc
сравнить время выполнения, чтобы запустить симуляцию полностью в MATLAB со временем выполнения MEX-функции.
Измерьте эффективность кода симуляции.
testDur = 50e-3; x = pinknoise(fs*testDur,'single'); numLoops = 100; tic for k = 1:numLoops [speechCommandIdx, auditory_features] = HelperSpeechCommandRecognition(x); end exeTime = toc; fprintf('SIM execution time per 50 ms of audio = %0.4f ms\n',(exeTime/numLoops)*1000);
SIM execution time per 50 ms of audio = 6.6746 ms
Измерьте эффективность кода MEX.
tic for k = 1:numLoops [speechCommandIdx, auditory_features] = HelperSpeechCommandRecognition_mex(x); end exeTimeMex = toc; fprintf('MEX execution time per 50 ms of audio = %0.4f ms\n',(exeTimeMex/numLoops)*1000);
MEX execution time per 50 ms of audio = 1.5188 ms
Оцените эффективность, полученную при использовании MEX-функции. Этот тест эффективности выполняется на компьютере с использованием графического процессора NVIDIA Quadro P620 (версия 26) и процессора Intel (R) Xeon (R) W-2133 работающего на частоте 3,60 ГГц.
PerformanceGain = exeTime/exeTimeMex
PerformanceGain = 4.3945