exponenta event banner

yamnet

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

    Синтаксис

    Описание

    пример

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

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

    Примеры

    свернуть все

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

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

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

    downloadFolder = fullfile(tempdir,'YAMNetDownload');
    loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/yamnet.zip');
    YAMNetLocation = tempdir;
    unzip(loc,YAMNetLocation)
    addpath(fullfile(YAMNetLocation,'yamnet'))

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

    yamnet
    ans = 
      SeriesNetwork with properties:
    
             Layers: [86×1 nnet.cnn.layer.Layer]
         InputNames: {'input_1'}
        OutputNames: {'Sound'}
    
    

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

    Использовать yamnet для загрузки предварительно обученной сети YAMNet. Выходная сетка представляет собой SeriesNetwork(Панель инструментов глубокого обучения).

    net = yamnet
    net = 
      SeriesNetwork with properties:
    
             Layers: [86×1 nnet.cnn.layer.Layer]
         InputNames: {'input_1'}
        OutputNames: {'Sound'}
    
    

    Просмотр сетевой архитектуры с помощью Layers собственность. Сеть насчитывает 86 уровней. Существует 28 слоев с обучаемыми весами: 27 сверточных слоев и 1 полностью связанный слой.

    net.Layers
    ans = 
      86x1 Layer array with layers:
    
         1   'input_1'                    Image Input              96×64×1 images
         2   'conv2d'                     Convolution              32 3×3×1 convolutions with stride [2  2] and padding 'same'
         3   'b'                          Batch Normalization      Batch normalization with 32 channels
         4   'activation'                 ReLU                     ReLU
         5   'depthwise_conv2d'           Grouped Convolution      32 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
         6   'L11'                        Batch Normalization      Batch normalization with 32 channels
         7   'activation_1'               ReLU                     ReLU
         8   'conv2d_1'                   Convolution              64 1×1×32 convolutions with stride [1  1] and padding 'same'
         9   'L12'                        Batch Normalization      Batch normalization with 64 channels
        10   'activation_2'               ReLU                     ReLU
        11   'depthwise_conv2d_1'         Grouped Convolution      64 groups of 1 3×3×1 convolutions with stride [2  2] and padding 'same'
        12   'L21'                        Batch Normalization      Batch normalization with 64 channels
        13   'activation_3'               ReLU                     ReLU
        14   'conv2d_2'                   Convolution              128 1×1×64 convolutions with stride [1  1] and padding 'same'
        15   'L22'                        Batch Normalization      Batch normalization with 128 channels
        16   'activation_4'               ReLU                     ReLU
        17   'depthwise_conv2d_2'         Grouped Convolution      128 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        18   'L31'                        Batch Normalization      Batch normalization with 128 channels
        19   'activation_5'               ReLU                     ReLU
        20   'conv2d_3'                   Convolution              128 1×1×128 convolutions with stride [1  1] and padding 'same'
        21   'L32'                        Batch Normalization      Batch normalization with 128 channels
        22   'activation_6'               ReLU                     ReLU
        23   'depthwise_conv2d_3'         Grouped Convolution      128 groups of 1 3×3×1 convolutions with stride [2  2] and padding 'same'
        24   'L41'                        Batch Normalization      Batch normalization with 128 channels
        25   'activation_7'               ReLU                     ReLU
        26   'conv2d_4'                   Convolution              256 1×1×128 convolutions with stride [1  1] and padding 'same'
        27   'L42'                        Batch Normalization      Batch normalization with 256 channels
        28   'activation_8'               ReLU                     ReLU
        29   'depthwise_conv2d_4'         Grouped Convolution      256 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        30   'L51'                        Batch Normalization      Batch normalization with 256 channels
        31   'activation_9'               ReLU                     ReLU
        32   'conv2d_5'                   Convolution              256 1×1×256 convolutions with stride [1  1] and padding 'same'
        33   'L52'                        Batch Normalization      Batch normalization with 256 channels
        34   'activation_10'              ReLU                     ReLU
        35   'depthwise_conv2d_5'         Grouped Convolution      256 groups of 1 3×3×1 convolutions with stride [2  2] and padding 'same'
        36   'L61'                        Batch Normalization      Batch normalization with 256 channels
        37   'activation_11'              ReLU                     ReLU
        38   'conv2d_6'                   Convolution              512 1×1×256 convolutions with stride [1  1] and padding 'same'
        39   'L62'                        Batch Normalization      Batch normalization with 512 channels
        40   'activation_12'              ReLU                     ReLU
        41   'depthwise_conv2d_6'         Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        42   'L71'                        Batch Normalization      Batch normalization with 512 channels
        43   'activation_13'              ReLU                     ReLU
        44   'conv2d_7'                   Convolution              512 1×1×512 convolutions with stride [1  1] and padding 'same'
        45   'L72'                        Batch Normalization      Batch normalization with 512 channels
        46   'activation_14'              ReLU                     ReLU
        47   'depthwise_conv2d_7'         Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        48   'L81'                        Batch Normalization      Batch normalization with 512 channels
        49   'activation_15'              ReLU                     ReLU
        50   'conv2d_8'                   Convolution              512 1×1×512 convolutions with stride [1  1] and padding 'same'
        51   'L82'                        Batch Normalization      Batch normalization with 512 channels
        52   'activation_16'              ReLU                     ReLU
        53   'depthwise_conv2d_8'         Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        54   'L91'                        Batch Normalization      Batch normalization with 512 channels
        55   'activation_17'              ReLU                     ReLU
        56   'conv2d_9'                   Convolution              512 1×1×512 convolutions with stride [1  1] and padding 'same'
        57   'L92'                        Batch Normalization      Batch normalization with 512 channels
        58   'activation_18'              ReLU                     ReLU
        59   'depthwise_conv2d_9'         Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        60   'L101'                       Batch Normalization      Batch normalization with 512 channels
        61   'activation_19'              ReLU                     ReLU
        62   'conv2d_10'                  Convolution              512 1×1×512 convolutions with stride [1  1] and padding 'same'
        63   'L102'                       Batch Normalization      Batch normalization with 512 channels
        64   'activation_20'              ReLU                     ReLU
        65   'depthwise_conv2d_10'        Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        66   'L111'                       Batch Normalization      Batch normalization with 512 channels
        67   'activation_21'              ReLU                     ReLU
        68   'conv2d_11'                  Convolution              512 1×1×512 convolutions with stride [1  1] and padding 'same'
        69   'L112'                       Batch Normalization      Batch normalization with 512 channels
        70   'activation_22'              ReLU                     ReLU
        71   'depthwise_conv2d_11'        Grouped Convolution      512 groups of 1 3×3×1 convolutions with stride [2  2] and padding 'same'
        72   'L121'                       Batch Normalization      Batch normalization with 512 channels
        73   'activation_23'              ReLU                     ReLU
        74   'conv2d_12'                  Convolution              1024 1×1×512 convolutions with stride [1  1] and padding 'same'
        75   'L122'                       Batch Normalization      Batch normalization with 1024 channels
        76   'activation_24'              ReLU                     ReLU
        77   'depthwise_conv2d_12'        Grouped Convolution      1024 groups of 1 3×3×1 convolutions with stride [1  1] and padding 'same'
        78   'L131'                       Batch Normalization      Batch normalization with 1024 channels
        79   'activation_25'              ReLU                     ReLU
        80   'conv2d_13'                  Convolution              1024 1×1×1024 convolutions with stride [1  1] and padding 'same'
        81   'L132'                       Batch Normalization      Batch normalization with 1024 channels
        82   'activation_26'              ReLU                     ReLU
        83   'global_average_pooling2d'   Global Average Pooling   Global average pooling
        84   'dense'                      Fully Connected          521 fully connected layer
        85   'softmax'                    Softmax                  softmax
        86   'Sound'                      Classification Output    crossentropyex with 'Speech' and 520 other classes
    

    Для просмотра имен классов, полученных сетью, можно просмотреть Classes свойство выходного уровня классификации (конечный уровень). Просмотрите первые 10 классов, указав первые 10 элементов.

    net.Layers(end).Classes(1:10)
    ans = 10×1 categorical
         Speech 
         Child speech, kid speaking 
         Conversation 
         Narration, monologue 
         Babbling 
         Speech synthesizer 
         Shout 
         Bellow 
         Whoop 
         Yell 
    
    

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

    analyzeNetwork(net)

    YAMNet был выпущен с соответствующей онтологией звукового класса, которую можно исследовать с помощью yamnetGraph объект.

    ygraph = yamnetGraph;
    p = plot(ygraph);
    layout(p,'layered')

    Граф онтологии строит график всех 521 возможных классов звука. Постройте подграф звуков, связанных с дыхательными звуками.

    allRespiratorySounds = dfsearch(ygraph,"Respiratory sounds");
    ygraphSpeech = subgraph(ygraph,allRespiratorySounds);
    plot(ygraphSpeech)

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

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

    [audioIn,fs0] = audioread('Counting-16-44p1-mono-15secs.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 = 1551
    
    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

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

    net = yamnet();

    Классифицируйте изображения спектрограммы.

    classes = classify(net,frames);

    Классифицируйте звуковой сигнал как наиболее часто встречающийся звук.

      mySound = mode(classes)
    mySound = categorical
         Speech 
    
    

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

    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

    Создание audioFeatureExtractor изобретение позволяет извлечь спектр Барка из звуковых сигналов. Используйте то же окно, длину перекрытия, диапазон частот и количество полос, на которых обучался YAMNet. В зависимости от задачи обучения трансферу, вы можете изменить функции ввода более или менее из функций ввода, на которых был обучен YAMNet.

    afe = audioFeatureExtractor('SampleRate',fs, ...
        'Window',hann(0.025*fs,'periodic'), ...
        'OverlapLength',round(0.015*fs), ...
        'barkSpectrum',true);
    setExtractorParams(afe,'barkSpectrum','NumBands',64);

    Извлеките спектрограммы Барка из состава поезда. Для каждого звукового сигнала имеется несколько спектрограмм Барка. Реплицируйте метки так, чтобы они соответствовали спектрограммам один к одному.

    numSpectrumsPerSpectrogram = 96;
    numSpectrumsOverlapBetweenSpectrograms = 48;
    numSpectrumsHopBetweenSpectrograms = numSpectrumsPerSpectrogram - numSpectrumsOverlapBetweenSpectrograms;
    
    emptyLabelVector = adsTrain.Labels;
    emptyLabelVector(:) = [];
    
    trainFeatures = [];
    trainLabels = emptyLabelVector;
    while hasdata(adsTrain)
        [audioIn,fileInfo] = read(adsTrain);
        features = extract(afe,audioIn);
        features = log10(features + single(0.001));
        [numSpectrums,numBands] = size(features);
        numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1;
        for hop = 1:numSpectrograms
            range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram;
            trainFeatures = cat(4,trainFeatures,features(range,:));
            trainLabels = cat(1,trainLabels,fileInfo.Label);
        end
    end

    Извлеките элементы из набора проверки и реплицируйте метки.

    validationFeatures = [];
    validationLabels = emptyLabelVector;
    while hasdata(adsValidation)
        [audioIn,fileInfo] = read(adsValidation);
        features = extract(afe,audioIn);
        features = log10(features + single(0.001));
        [numSpectrums,numBands] = size(features);
        numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1;
        for hop = 1:numSpectrograms
            range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram;
            validationFeatures = cat(4,validationFeatures,features(range,:));
            validationLabels = cat(1,validationLabels,fileInfo.Label);
        end
    end

    Набор данных воздушного компрессора имеет только восемь классов. Прочитайте в YAMNet, преобразуйте его в layerGraph (Deep Learning Toolbox), а затем замените окончательный вариант fullyConnectedLayer (Deep Learning Toolbox) и окончательный вариант classificationLayer (Deep Learning Toolbox) для отражения новой задачи.

    uniqueLabels = unique(adsTrain.Labels);
    numLabels = numel(uniqueLabels);
    
    net = yamnet;
    
    lgraph = layerGraph(net.Layers);
    
    newDenseLayer = fullyConnectedLayer(numLabels,"Name","dense");
    lgraph = replaceLayer(lgraph,"dense",newDenseLayer);
    
    newClassificationLayer = classificationLayer("Name","Sounds","Classes",uniqueLabels);
    lgraph = replaceLayer(lgraph,"Sound",newClassificationLayer);

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

    miniBatchSize = 128;
    validationFrequency = floor(numel(trainLabels)/miniBatchSize);
    options = trainingOptions('adam', ...
        'InitialLearnRate',3e-4, ...
        'MaxEpochs',2, ...
        'MiniBatchSize',miniBatchSize, ...
        'Shuffle','every-epoch', ...
        'Plots','training-progress', ...
        'Verbose',false, ...
        'ValidationData',{single(validationFeatures),validationLabels}, ...
        'ValidationFrequency',validationFrequency);

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

    trainNetwork(single(trainFeatures),trainLabels,lgraph,options);

    Ссылки

    [1] Верма, Nishal K., et al. «Интеллектуальный мониторинг состояния с использованием акустических сигналов для воздушных компрессоров». Сделки IEEE по надежности, том 65, № 1, март 2016 г., стр. 291-309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.

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

    свернуть все

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

    Ссылки

    [1] Gemmeke, Джорт Ф., и др. 2017 IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 776-80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.

    [2] Херши, Шон и др. Международная конференция IEEE 2017 по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 131-35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.

    Расширенные возможности

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