vggishFeatures

Извлечение функций VGGish

    Описание

    пример

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

    пример

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

    Эта функция требует как Audio 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);

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

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

    Создайте 10-секундный сигнал розового шума и затем извлеките функции VGGish. The 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;
    функции = vggishFeatures (audioIn, fs,'OverlapPercentage', overlapPercent);
    
    surf (функции,'EdgeColor','none')
    просмотр ([30 65])
    ось tight
    xlabel ('Feature Index')
    ylabel ('Frame')
    zlabel ('Feature Value')
    заголовок ('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);

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

    [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 (Deep Learning Toolbox).

    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 (Deep Learning Toolbox).

    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');

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

    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 (Statistics and Machine Learning Toolbox). Чтобы исследовать другие классификаторы и их показатели, используйте 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 к audio embeddings, заданный как разделенная разделенными запятой парами, состоящая из 'ApplyPCA' и любой из них true или false.

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

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

    свернуть все

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

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

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

    • N -- Представляет количество каналов.

    Алгоритмы

    свернуть все

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

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

    1. Повторная выборка audioIn до 16 кГц и приведение к одинарной точности.

    2. Вычислите одностороннее кратковременное преобразование Фурье с помощью периодического окна Ханна 25 мс с скачком 10 мс и ДПФ с 512 точками. Теперь аудио представлено массивом 257- L, где 257 - количество интервалов в односторонних спектрах, и L зависит от длины входа.

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

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

    5. Преобразуйте спектрограмму mel в журнал шкалу.

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

    Редукция данных

    Передайте массив mel spectrogram 96 на 64 K 1 через VGGish, чтобы вернуть матрицу K на 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] Gemmeke, Jort F., Daniel P. W. Ellis, Dylan Freedman, Are Jansen, Wade Lawrence, R. Channing Moore, Manoj Plakal и Marvin Ritter. 2017. Audio Set: An Ontology and Human-Labeled Dataset for Audio Events (неопр.) (недоступная ссылка). В 2017 году IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 776-80. Новый Орлеан, LA: IEEE. https://doi.org/10.1109/ICASSP.2017.7952261.

    [2] Hershey, Shawn, Sourish Chaudhuri, Daniel P. W. Ellis, Jort F. Gemmeke, Are Jansen, R. Channing Moore, Manoj Plakal, et al. 2017. CNN Архитектур для крупномасштабной классификации аудио. В 2017 году IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 131-35. Новый Орлеан, LA: IEEE. https://doi.org/10.1109/ICASSP.2017.7952132.

    Введенный в R2020b