Генерация кода распознавания речевых команд с Intel MKL-DNN

В этом примере показано, как развернуть редукцию данных и сверточную нейронную сеть (CNN) для распознавания речевых команд на процессорах Intel ®. Чтобы сгенерировать редукцию данных и сетевой код, вы используете MATLAB Coder и библиотеку Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN). В этом примере сгенерированный код является исполняемой функцией MATLAB (MEX), которая вызывается скриптом MATLAB, который отображает предсказанную речевую команду вместе с сигналом временного интервала и слуховой спектрограммой. Для получения дополнительной информации о предварительной обработке аудио и сетевом обучении смотрите Распознание речевых команд с использованием глубокого обучения (Audio Toolbox).

Необходимые условия

  • MATLAB Coder Interface для пакета поддержки глубокого обучения

  • Процессор Xeon с поддержкой Intel Advanced Vector Extensions 2 (Intel AVX2)

  • Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)

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

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

Потоковая демонстрация в MATLAB

Используйте те же параметры для конвейера редукции данных и классификации, что и в Распознание речевых команд с использованием глубокого обучения (Audio Toolbox).

Определите ту же частоту дискретизации, на которой обучалась сеть (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 (Audio Toolbox) объект для извлечения 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 (Audio Toolbox), чтобы считать аудио с вашего устройства. Создайте dsp.AsyncBuffer (DSP System Toolbox) для буферизации звука в фрагменты.

adr = audioDeviceReader('SampleRate',fs,'SamplesPerFrame',samplesPerCapture,'OutputDataType','single');
audioBuffer = dsp.AsyncBuffer(fs);

Создайте dsp.MatrixViewer (DSP System Toolbox) объект и timescope (DSP System Toolbox) для отображения результатов.

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)

Подготовка кода MATLAB к развертыванию

Чтобы создать функцию для выполнения редукции данных, совместимых с генерацией кода, вызовите generateMATLABFunction (Audio Toolbox) на 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)

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

Создайте объект строения генерации кода для генерации исполняемой программы. Задайте целевой язык как 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)

Оценка времени выполнения MEX

Использование 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