exponenta event banner

vggish

Нейронная сеть VGGish

    Синтаксис

    Описание

    пример

    net = vggish возвращает предварительно подготовленную модель VGGish.

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

    Примеры

    свернуть все

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

    Напечатать vggish в окне команд. Если модель 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'))

    Убедитесь, что установка выполнена успешно, введя vggish в окне команд. Если сеть установлена, то функция возвращает SeriesNetwork(Панель инструментов глубокого обучения).

    vggish
    ans = 
      SeriesNetwork with properties:
    
             Layers: [24×1 nnet.cnn.layer.Layer]
         InputNames: {'InputBatch'}
        OutputNames: {'regressionoutput'}
    
    

    Загрузите предварительно обученную сверточную нейронную сеть VGGish и изучите слои и классы.

    Использовать vggish для загрузки предварительно обученной сети VGGish. Продукция net является SeriesNetwork(Панель инструментов глубокого обучения).

    net = vggish
    net = 
      SeriesNetwork with properties:
    
             Layers: [24×1 nnet.cnn.layer.Layer]
         InputNames: {'InputBatch'}
        OutputNames: {'regressionoutput'}
    
    

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

    net.Layers
    ans = 
      24×1 Layer array with layers:
    
         1   'InputBatch'         Image Input         96×64×1 images
         2   'conv1'              Convolution         64 3×3×1 convolutions with stride [1  1] and padding 'same'
         3   'relu'               ReLU                ReLU
         4   'pool1'              Max Pooling         2×2 max pooling with stride [2  2] and padding 'same'
         5   'conv2'              Convolution         128 3×3×64 convolutions with stride [1  1] and padding 'same'
         6   'relu2'              ReLU                ReLU
         7   'pool2'              Max Pooling         2×2 max pooling with stride [2  2] and padding 'same'
         8   'conv3_1'            Convolution         256 3×3×128 convolutions with stride [1  1] and padding 'same'
         9   'relu3_1'            ReLU                ReLU
        10   'conv3_2'            Convolution         256 3×3×256 convolutions with stride [1  1] and padding 'same'
        11   'relu3_2'            ReLU                ReLU
        12   'pool3'              Max Pooling         2×2 max pooling with stride [2  2] and padding 'same'
        13   'conv4_1'            Convolution         512 3×3×256 convolutions with stride [1  1] and padding 'same'
        14   'relu4_1'            ReLU                ReLU
        15   'conv4_2'            Convolution         512 3×3×512 convolutions with stride [1  1] and padding 'same'
        16   'relu4_2'            ReLU                ReLU
        17   'pool4'              Max Pooling         2×2 max pooling with stride [2  2] and padding 'same'
        18   'fc1_1'              Fully Connected     4096 fully connected layer
        19   'relu5_1'            ReLU                ReLU
        20   'fc1_2'              Fully Connected     4096 fully connected layer
        21   'relu5_2'            ReLU                ReLU
        22   'fc2'                Fully Connected     128 fully connected layer
        23   'EmbeddingBatch'     ReLU                ReLU
        24   'regressionoutput'   Regression Output   mean-squared-error
    

    Использовать analyzeNetwork (Deep Learning Toolbox) для визуального изучения сети.

    analyzeNetwork(net)

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

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

    [audioIn,fs0] = audioread('Ambiance-16-44p1-mono-12secs.wav');
    
    fs = 16e3;
    audioIn = resample(audioIn,fs,fs0);
    
    audioIn = single(audioIn);

    Определите параметры спектрограммы mel и извлеките элементы с помощью melSpectrogram функция.

    FFTLength = 512;
    numBands = 64;
    frequencyRange = [125 7500];
    windowLength = 0.025*fs;
    overlapLength = 0.015*fs;
    
    melSpect = melSpectrogram(audioIn,fs, ...
        'Window',hann(windowLength,'periodic'), ...
        'OverlapLength',overlapLength, ...
        'FFTLength',FFTLength, ...
        'FrequencyRange',frequencyRange, ...
        'NumBands',numBands, ...
        'FilterBankNormalization','none', ...
        'WindowNormalization',false, ...
        'SpectrumType','magnitude', ...
        'FilterBankDesignDomain','warped');

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

    melSpect = log(melSpect + single(0.001));

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

    melSpect = melSpect.';
    [numSTFTWindows,numBands] = size(melSpect)
    numSTFTWindows = 1222
    
    numBands = 64
    

    Разбейте спектрограмму на кадры длиной 96 с перекрытием 48. Разместите рамки вдоль четвертого размера.

    frameWindowLength = 96;
    frameOverlapLength = 48;
    
    hopLength = frameWindowLength - frameOverlapLength;
    numHops = floor((numSTFTWindows - frameWindowLength)/hopLength) + 1;
    
    frames = zeros(frameWindowLength,numBands,1,numHops,'like',melSpect);
    for hop = 1:numHops
        range = 1 + hopLength*(hop-1):hopLength*(hop - 1) + frameWindowLength;
        frames(:,:,1,hop) = melSpect(range,:);
    end

    Создайте сеть VGGish.

    net = vggish;

    Звонить predict для извлечения вложенных элементов из изображений спектрограммы. Вложение элемента возвращается как numFrames-by-128 матрица, где numFrames - количество отдельных спектрограмм, а 128 - число элементов в каждом векторе признаков.

    features = predict(net,frames);
    
    [numFrames,numFeatures] = size(features)
    numFrames = 24
    
    numFeatures = 128
    

    Сравните визуализации спектрограммы mel и встраивания функций VGGish.

    melSpectrogram(audioIn,fs, ...
        'Window',hann(windowLength,'periodic'), ...
        'OverlapLength',overlapLength, ...
        'FFTLength',FFTLength, ...
        'FrequencyRange',frequencyRange, ...
        'NumBands',numBands, ...
        'FilterBankNormalization','none', ...
        'WindowNormalization',false, ...
        'SpectrumType','magnitude', ...
        'FilterBankDesignDomain','warped');

    surf(features,'EdgeColor','none')
    view([90,-90])
    axis([1 numFeatures 1 numFrames])
    xlabel('Feature')
    ylabel('Frame')
    title('VGGish Feature Embeddings')

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

    Загрузите и распакуйте набор данных классификации экологического звука. Этот набор данных состоит из записей, помеченных как один из 10 различных классов звука (ESC-10).

    url = 'http://ssd.mathworks.com/supportfiles/audio/ESC-10.zip';
    downloadFolder = fullfile(tempdir,'ESC-10');
    datasetLocation = tempdir;
    
    if ~exist(fullfile(tempdir,'ESC-10'),'dir')
        loc = websave(downloadFolder,url);
        unzip(loc,fullfile(tempdir,'ESC-10'))
    end

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

    ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames');
    labelTable = countEachLabel(ads)
    labelTable=10×2 table
            Label         Count
        ______________    _____
    
        chainsaw           40  
        clock_tick         40  
        crackling_fire     40  
        crying_baby        40  
        dog                40  
        helicopter         40  
        rain               40  
        rooster            38  
        sea_waves          40  
        sneezing           40  
    
    

    Определите общее количество классов.

    numClasses = size(labelTable,1);

    Звонить splitEachLabel для разделения набора данных на наборы обучения и проверки. Проверьте распределение меток в наборах обучения и проверки.

    [adsTrain, adsValidation] = splitEachLabel(ads,0.8);
    
    countEachLabel(adsTrain)
    ans=10×2 table
            Label         Count
        ______________    _____
    
        chainsaw           32  
        clock_tick         32  
        crackling_fire     32  
        crying_baby        32  
        dog                32  
        helicopter         32  
        rain               32  
        rooster            30  
        sea_waves          32  
        sneezing           32  
    
    
    countEachLabel(adsValidation)
    ans=10×2 table
            Label         Count
        ______________    _____
    
        chainsaw            8  
        clock_tick          8  
        crackling_fire      8  
        crying_baby         8  
        dog                 8  
        helicopter          8  
        rain                8  
        rooster             8  
        sea_waves           8  
        sneezing            8  
    
    

    Сеть VGGish ожидает предварительной обработки звука в спектрограммах log mel. Вспомогательная функция vggishPreprocess принимает audioDatastore объект и процент перекрытия между логарифмическими спектрограммами в качестве входных данных и возвращает матрицы предикторов и откликов, подходящие в качестве входных данных для сети VGGish.

    overlapPercentage = 75;
    
    [trainFeatures,trainLabels] = vggishPreprocess(adsTrain,overlapPercentage);
    [validationFeatures,validationLabels,segmentsPerFile] = vggishPreprocess(adsValidation,overlapPercentage);

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

    net = vggish;
    
    lgraph = layerGraph(net.Layers);

    Использовать removeLayers (Deep Learning Toolbox) для удаления конечного выходного слоя регрессии из графика. После удаления регрессионного слоя новым конечным слоем графа является слой ReLU с именем 'EmbeddingBatch'.

    lgraph = removeLayers(lgraph,'regressionoutput');
    lgraph.Layers(end)
    ans = 
      ReLULayer with properties:
    
        Name: 'EmbeddingBatch'
    
    

    Использовать addLayers(Панель инструментов глубокого обучения) для добавления fullyConnectedLayer (инструментарий глубокого обучения), softmaxLayer (инструментарий глубокого обучения) и classificationLayer (Deep Learning Toolbox) на графике.

    lgraph = addLayers(lgraph,fullyConnectedLayer(numClasses,'Name','FCFinal'));
    lgraph = addLayers(lgraph,softmaxLayer('Name','softmax'));
    lgraph = addLayers(lgraph,classificationLayer('Name','classOut'));

    Использовать connectLayers (Deep Learning Toolbox) для добавления к графу слоев полностью соединенных слоев, слоев softmax и слоев классификации.

    lgraph = connectLayers(lgraph,'EmbeddingBatch','FCFinal');
    lgraph = connectLayers(lgraph,'FCFinal','softmax');
    lgraph = connectLayers(lgraph,'softmax','classOut');

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

    miniBatchSize = 128;
    options = trainingOptions('adam', ...
        'MaxEpochs',5, ...
        'MiniBatchSize',miniBatchSize, ...
        'Shuffle','every-epoch', ...
        'ValidationData',{validationFeatures,validationLabels}, ...
        'ValidationFrequency',50, ...
        'LearnRateSchedule','piecewise', ...
        'LearnRateDropFactor',0.5, ...
        'LearnRateDropPeriod',2);

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

    [trainedNet, netInfo] = trainNetwork(trainFeatures,trainLabels,lgraph,options);
    Training on single GPU.
    |======================================================================================================================|
    |  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Validation  |  Mini-batch  |  Validation  |  Base Learning  |
    |         |             |   (hh:mm:ss)   |   Accuracy   |   Accuracy   |     Loss     |     Loss     |      Rate       |
    |======================================================================================================================|
    |       1 |           1 |       00:00:00 |       10.94% |       26.03% |       2.2253 |       2.0317 |          0.0010 |
    |       2 |          50 |       00:00:05 |       93.75% |       83.75% |       0.1884 |       0.7001 |          0.0010 |
    |       3 |         100 |       00:00:10 |       96.88% |       80.07% |       0.1150 |       0.7838 |          0.0005 |
    |       4 |         150 |       00:00:15 |       92.97% |       81.99% |       0.1656 |       0.7612 |          0.0005 |
    |       5 |         200 |       00:00:20 |       92.19% |       79.04% |       0.1738 |       0.8192 |          0.0003 |
    |       5 |         210 |       00:00:21 |       95.31% |       80.15% |       0.1389 |       0.8581 |          0.0003 |
    |======================================================================================================================|
    

    Каждый аудиофайл был разделён на несколько сегментов для подачи в сеть VGGish. Объедините прогнозы для каждого файла в наборе проверки с помощью решения мажоритарного правила.

    validationPredictions = classify(trainedNet,validationFeatures);
    
    idx = 1;
    validationPredictionsPerFile = categorical;
    for ii = 1:numel(adsValidation.Files)
        validationPredictionsPerFile(ii,1) = mode(validationPredictions(idx:idx+segmentsPerFile(ii)-1));
        idx = idx + segmentsPerFile(ii);
    end

    Использовать confusionchart (Deep Learning Toolbox) для оценки производительности сети в наборе проверки.

    figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]);
    cm = confusionchart(adsValidation.Labels,validationPredictionsPerFile);
    cm.Title = sprintf('Confusion Matrix for Validation Data \nAccuracy = %0.2f %%',mean(validationPredictionsPerFile==adsValidation.Labels)*100);
    cm.ColumnSummary = 'column-normalized';
    cm.RowSummary = 'row-normalized';

    Вспомогательные функции

    function [predictor,response,segmentsPerFile] = vggishPreprocess(ads,overlap)
    % This function is for example purposes only and may be changed or removed
    % in a future release.
    
    % Create filter bank
    FFTLength = 512;
    numBands = 64;
    fs0 = 16e3;
    filterBank = designAuditoryFilterBank(fs0, ...
        'FrequencyScale','mel', ...
        'FFTLength',FFTLength, ...
        'FrequencyRange',[125 7500], ...
        'NumBands',numBands, ...
        'Normalization','none', ...
        'FilterBankDesignDomain','warped');
    
    % Define STFT parameters
    windowLength = 0.025 * fs0;
    hopLength = 0.01 * fs0;
    win = hann(windowLength,'periodic');
    
    % Define spectrogram segmentation parameters
    segmentDuration = 0.96; % seconds
    segmentRate = 100; % hertz
    segmentLength = segmentDuration*segmentRate; % Number of spectrums per auditory spectrograms
    segmentHopDuration = (100-overlap) * segmentDuration / 100; % Duration (s) advanced between auditory spectrograms
    segmentHopLength = round(segmentHopDuration * segmentRate); % Number of spectrums advanced between auditory spectrograms
    
    % Preallocate cell arrays for the predictors and responses
    numFiles = numel(ads.Files);
    predictor = cell(numFiles,1);
    response = predictor;
    segmentsPerFile = zeros(numFiles,1);
    
    % Extract predictors and responses for each file
    for ii = 1:numFiles
        [audioIn,info] = read(ads);
    
        x = single(resample(audioIn,fs0,info.SampleRate));
    
        Y = stft(x, ...
            'Window',win, ...
            'OverlapLength',windowLength-hopLength, ...
            'FFTLength',FFTLength, ...
            'FrequencyRange','onesided');
        Y = abs(Y);
    
        logMelSpectrogram = log(filterBank*Y + single(0.01))';
        
        % Segment log-mel spectrogram
        numHops = floor((size(Y,2)-segmentLength)/segmentHopLength) + 1;
        segmentedLogMelSpectrogram = zeros(segmentLength,numBands,1,numHops);
        for hop = 1:numHops
            segmentedLogMelSpectrogram(:,:,1,hop) = logMelSpectrogram(1+segmentHopLength*(hop-1):segmentLength+segmentHopLength*(hop-1),:);
        end
    
        predictor{ii} = segmentedLogMelSpectrogram;
        response{ii} = repelem(info.Label,numHops);
        segmentsPerFile(ii) = numHops;
    end
    
    % Concatenate predictors and responses into arrays
    predictor = cat(4,predictor{:});
    response = cat(2,response{:});
    end

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

    свернуть все

    Подготовленная нейронная сеть VGGish, возвращенная в качестве SeriesNetwork(Панель инструментов глубокого обучения).

    Ссылки

    [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