exponenta event banner

vggishFeatures

Извлечение элементов VGGish

    Описание

    пример

    embeddings = vggishFeatures(audioIn,fs) возвращает встраиваемые функции VGGish с течением времени для ввода звука audioIn с частотой выборки fs. Столбцы ввода обрабатываются как отдельные каналы.

    пример

    embeddings = vggishFeatures(audioIn,fs,Name,Value) указывает параметры, использующие один или несколько Name,Value аргументы пары. Например, embeddings = vggishFeatures(audioIn,fs,'ApplyPCA',true) применяет преобразование анализа основных компонентов (PCA) к вложениям звука.

    Эта функция требует как Toolbox™ аудио, так и Deep Learning Toolbox™.

    Примеры

    свернуть все

    Загрузите и распакуйте модель Audio Toolbox™ для VGGish.

    Напечатать vggishFeatures в командной строке. Если модель Audio Toolbox для VGGish не установлена, то функция предоставляет ссылку на расположение весов сети. Чтобы загрузить модель, щелкните ссылку. Распакуйте файл в папку по пути MATLAB.

    Либо выполните следующие команды для загрузки и распаковки модели VGGish во временный каталог.

    downloadFolder = fullfile(tempdir,'VGGishDownload');
    loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/vggish.zip');
    VGGishLocation = tempdir;
    unzip(loc,VGGishLocation)
    addpath(fullfile(VGGishLocation,'vggish'))

    Чтение в аудиофайле.

    [audioIn,fs] = audioread('MainStreetOne-16-16-mono-12secs.wav');

    Позвоните в vggishFeatures функция со скоростью передачи звука и дискретизации для извлечения встраиваемых функций VGGish из звука.

    featureVectors = vggishFeatures(audioIn,fs);

    vggishFeatures функция возвращает матрицу 128-элементных векторов признаков с течением времени.

    [numHops,numElementsPerHop,numChannels] = size(featureVectors)
    numHops = 23
    
    numElementsPerHop = 128
    
    numChannels = 1
    

    Создайте 10-секундный сигнал розового шума, а затем извлеките элементы VGGish. vggishFeatures функция извлекает признаки из спектрограмм mel с 50% перекрытием.

    fs = 16e3;
    dur = 10;
    
    audioIn = pinknoise(dur*fs,1,'single');
    
    features = vggishFeatures(audioIn,fs);

    Постройте график элементов VGGish с течением времени.

    surf(features,'EdgeColor','none')
    view([30 65])
    axis tight
    xlabel('Feature Index')
    ylabel('Frame')
    xlabel('Feature Value')
    title('VGGish Features')

    Для увеличения разрешающей способности элементов VGGish с течением времени укажите процент перекрытия между спектрограммами mel. Постройте график результатов.

    overlapPercentage = 75;
    features = vggishFeatures(audioIn,fs,'OverlapPercentage',overlapPercentage);
    
    surf(features,'EdgeColor','none')
    view([30 65])
    axis tight
    xlabel('Feature Index')
    ylabel('Frame')
    zlabel('Feature Value')
    title('VGGish Features')

    Прочитайте аудиофайл, прослушайте его, а затем извлеките функции VGGish из аудиофайла.

    [audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
    
    sound(audioIn,fs)
    
    features = vggishFeatures(audioIn,fs);

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

    surf(features,'EdgeColor','none')
    view([90,-90])
    axis tight
    xlabel('Feature Index')
    ylabel('Frame Index')
    title('VGGish Features')

    Можно применить анализ главных компонентов (PCA) для отображения векторов элементов в пространство, которое подчеркивает вариации между вложениями. Позвоните в vggishFeatures снова выполнить функцию и указать ApplyPCA как true. Визуализация функций VGGish после PCA.

    features = vggishFeatures(audioIn,fs,'ApplyPCA',true);
    
    surf(features,'EdgeColor','none')
    view([90,-90])
    axis tight
    xlabel('Feature Index')
    ylabel('Frame Index')
    title('VGGish Features + PCA')

    Загрузите и распакуйте набор данных воздушного компрессора. Этот набор данных состоит из записей с воздушных компрессоров в исправном состоянии или в одном из семи неисправных состояний.

    url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip';
    downloadFolder = fullfile(tempdir,'aircompressordataset');
    datasetLocation = tempdir;
    
    if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir')
        loc = websave(downloadFolder,url);
        unzip(loc,fullfile(tempdir,'AirCompressorDataSet'))
    end

    Создание audioDatastore объект для управления данными и их разделения на наборы обучения и проверки.

    ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames');
    
    [adsTrain,adsValidation] = splitEachLabel(ads,0.8,0.2);

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

    [x,fileInfo] = read(adsTrain);
    fs = fileInfo.SampleRate;
    
    reset(adsTrain)
    
    sound(x,fs)
    
    figure
    t = (0:size(x,1)-1)/fs;
    plot(t,x)
    xlabel('Time (s)')
    title('State = ' + string(fileInfo.Label))
    axis tight

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

    trainFeatures = cell(1,numel(adsTrain.Files));
    for idx = 1:numel(adsTrain.Files)
        [audioIn,fileInfo] = read(adsTrain);
        features = vggishFeatures(audioIn,fileInfo.SampleRate);
        trainFeatures{idx} = features';
    end
    
    validationFeatures = cell(1,numel(adsValidation.Files));
    for idx = 1:numel(adsValidation.Files)
        [audioIn,fileInfo] = read(adsValidation);
        features = vggishFeatures(audioIn,fileInfo.SampleRate);
        validationFeatures{idx} = features';
    end

    Определите сеть сетей долговременной памяти (Deep Learning Toolbox).

    layers = [
        sequenceInputLayer(128)
        lstmLayer(100,'OutputMode','last')
        fullyConnectedLayer(8)
        softmaxLayer
        classificationLayer];

    Для определения вариантов обучения используйте trainingOptions (инструментарий глубокого обучения).

    miniBatchSize = 64;
    validationFrequency = 5*floor(numel(trainFeatures)/miniBatchSize);
    options = trainingOptions("adam", ...
        "MaxEpochs",12, ...
        "MiniBatchSize",miniBatchSize, ...
        "Plots","training-progress", ...
        "Shuffle","every-epoch", ...
        "LearnRateSchedule","piecewise", ...
        "LearnRateDropPeriod",6, ...
        "LearnRateDropFactor",0.1, ...
        "ValidationData",{validationFeatures,adsValidation.Labels}, ...
        "ValidationFrequency",validationFrequency, ...
        'Verbose',false);

    Для обучения сети используйте trainNetwork (инструментарий глубокого обучения).

    net = trainNetwork(trainFeatures,adsTrain.Labels,layers,options)

    net = 
      SeriesNetwork with properties:
    
             Layers: [5×1 nnet.cnn.layer.Layer]
         InputNames: {'sequenceinput'}
        OutputNames: {'classoutput'}
    
    

    Визуализируйте матрицу путаницы для набора проверки.

    predictedClass = classify(net,validationFeatures);
    confusionchart(adsValidation.Labels,predictedClass)

    Загрузите и распакуйте набор данных воздушного компрессора [1]. Этот набор данных состоит из записей с воздушных компрессоров в исправном состоянии или в одном из семи неисправных состояний.

    url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip';
    downloadFolder = fullfile(tempdir,'aircompressordataset');
    datasetLocation = tempdir;
    
    if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir')
        loc = websave(downloadFolder,url);
        unzip(loc,fullfile(tempdir,'AirCompressorDataSet'))
    end

    Создание audioDatastore объект для управления данными и их разделения на наборы обучения и проверки.

    ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames');

    В этом примере сигналы классифицируются как исправные или неисправные. Объедините все неисправные метки в одну. Разбейте хранилище данных на обучающие и проверочные наборы.

    labels = ads.Labels;
    labels(labels~=categorical("Healthy")) = categorical("Faulty");
    ads.Labels = removecats(labels);
    
    [adsTrain,adsValidation] = splitEachLabel(ads,0.8,0.2);

    Извлеките функции VGGish из обучающего набора. Каждый аудиофайл соответствует множеству функций VGGish. Реплицируйте метки таким образом, чтобы они соответствовали элементам один к одному.

    trainFeatures = [];
    trainLabels = [];
    for idx = 1:numel(adsTrain.Files)
        [audioIn,fileInfo] = read(adsTrain);
        features = vggishFeatures(audioIn,fileInfo.SampleRate);
        trainFeatures = [trainFeatures;features];
        trainLabels = [trainLabels;repelem(fileInfo.Label,size(features,1))'];
    end

    Обучение машины кубических векторов поддержки (SVM) с помощью fitcsvm (Статистика и инструментарий машинного обучения). Для изучения других классификаторов и их характеристик используйте Classification Learner (Statistics and Machine Learning Toolbox).

    faultDetector = fitcsvm( ...
        trainFeatures, ...
        trainLabels, ...
        'KernelFunction','polynomial', ...
        'PolynomialOrder',3, ...
        'KernelScale','auto', ...
        'BoxConstraint',1, ...
        'Standardize',true, ...
        'ClassNames',categories(trainLabels));

    Для каждого файла в наборе проверки:

    1. Извлеките элементы VGGish.

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

    3. Выберите режим прогнозирования для каждого файла.

    predictions = [];
    for idx = 1:numel(adsValidation.Files)
        [audioIn,fileInfo] = read(adsValidation);
        
        features = vggishFeatures(audioIn,fileInfo.SampleRate);
        
        predictionsPerFile = categorical(predict(faultDetector,features));
        
        predictions = [predictions;mode(predictionsPerFile)];
    end

    Использовать confusionchart (Statistics and Machine Learning Toolbox) для отображения производительности классификатора.

    accuracy = sum(predictions==adsValidation.Labels)/numel(adsValidation.Labels);
    cc = confusionchart(predictions,adsValidation.Labels);
    cc.Title = sprintf('Accuracy = %0.2f %',accuracy*100);

    Ссылки

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

    Входные аргументы

    свернуть все

    Входной сигнал, заданный как вектор столбца или матрица. Если указать матрицу, vggishFeatures обрабатывает столбцы матрицы как отдельные аудиоканалы.

    Продолжительность audioIn не должно превышать 0,975 секунды.

    Типы данных: single | double

    Частота дискретизации входного сигнала в Гц, заданная как положительный скаляр.

    Типы данных: single | double

    Аргументы пары «имя-значение»

    Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

    Пример: 'OverlapPercentage',75

    Процентное перекрытие между последовательными аудиокадрами, заданными как пара, разделенная запятыми, состоящая из 'OverlapPercentage' и скаляр в диапазоне [0,100).

    Типы данных: single | double

    Флаг для применения преобразования PCA к вложениям звука, указанный как пара, разделенная запятыми, состоящая из 'ApplyPCA' и либо true или false.

    Типы данных: logical

    Выходные аргументы

    свернуть все

    Компактное представление аудиоданных, возвращаемых в виде массива L-by-128-by-N, где:

    • L - количество кадров, на которые разделен звуковой сигнал. Это определяется OverlapPercentage.

    • 128 - Представляет длину встраивания звука.

    • N - количество каналов.

    Алгоритмы

    свернуть все

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

    Предварительно обработать

    1. Передискретизировать audioIn до 16 кГц и отливка с единственной точностью.

    2. Вычислите одностороннее короткое преобразование Фурье, используя 25-миллисекундное периодическое окно Ханна с 10-миллисекундным прыжком и 512-точечным DFT. Звук теперь представлен 257-by-L матрицей, где 257 - количество элементов в односторонних спектрах, и L зависит от длины входа.

    3. Преобразуйте комплексные спектральные значения в величину и отбрасывайте информацию о фазе.

    4. Пропускают односторонний спектр амплитуд через 64-полосный блок фильтров с промежутками, затем суммируют величины в каждой полосе. Аудио теперь представлено единственными 64 L mel спектрограмма.

    5. Преобразование спектрограммы в логарифмическую шкалу.

    6. Буферизуют мель-спектрограмму в перекрывающиеся сегменты, состоящие из 96 спектров каждый. Звук теперь представлен 96-by-64-by-1-by-K матрицей, где 96 - количество спектров в отдельных спектрограммах mel, 64 - количество полос mel, и спектрограммы разнесены вдоль четвертого измерения для совместимости с моделью VGGish. Число спектрограмм mel, K, зависит от длины входа и OverlapPercentage.

    Извлечение элементов

    Пропустите 96-by-64-by-1-by-K массив спектрограмм mel через VGGish, чтобы вернуть K-by-128 матрицу. Выходные данные VGGish представляют собой функциональные вложения, соответствующие каждому кадру аудиоданных длиной 0,975 мс.

    Постпроцесс

    Если ApplyPCA имеет значение true, встраиваемые элементы подвергаются постобработке в соответствии с постобработкой выпущенных встраиваемых элементов AudioSet. Модель VGGish была выпущена с предварительно вычисленной матрицей анализа основных компонентов (PCA) и средним вектором для применения преобразования PCA и отбеливания во время вывода. Постобработка включает в себя применение PCA, отбеливание и квантование.

    1. Вычтите предварительно вычисленный средний вектор 1 на 128 PCA из матрицы признаков K-by-128, а затем предварительно умножьте результат на предварительно вычисленную матрицу 128 на 128 PCA.

    2. Подрезать преобразованные и отбеленные вложения между -2 и 2, затем квантовать результат до значений, которые могут быть представлены uint8.

    Ссылки

    [1] Геммеке, Йорт Ф., Даниэль В. Эллис, Дилан Фридман, Арен Янсен, Уэйд Лоуренс, Р. Ченнинг Мур, Манодж Плакал и Марвин Риттер. 2017. «Аудиозапись: онтология и набор данных, помеченных человеком, для аудиовыходов». В 2017 году IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), 776-80. Новый Орлеан, ЛА: IEEE. https://doi.org/10.1109/ICASSP.2017.7952261.

    [2] Херши, Шон, Суриш Чаудхури, Даниэль В. Эллис, Йорт Ф. Геммеке, Арен Янсен, Р. Ченнинг Мур, Манодж Плакал и др. 2017. «Архитектуры CNN для крупномасштабной классификации звука». В 2017 году IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), 131-35. Новый Орлеан, ЛА: IEEE. https://doi.org/10.1109/ICASSP.2017.7952132.

    Представлен в R2020b