yamnet

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

    Синтаксис

    Описание

    пример

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

    Эта функция требует и Audio 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 Объект (Deep Learning Toolbox).

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

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

    Используйте yamnet загружать предварительно обученную сеть YAMNet. Сетевым выходом является SeriesNetwork Объект (Deep Learning Toolbox).

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

    Просмотрите сетевую архитектуру с помощью Layers свойство. Сеть имеет 86 слоев. Существует 28 слоев с learnable весами: 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 требует, чтобы вы предварительно обработали и извлекли функции из звуковых сигналов путем преобразования их в частоту дискретизации, сеть была обучена на, и затем извлекающий перекрывающий логарифмические-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');

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

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

    Считайте звуковой файл из 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

    Создайте 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 (Deep Learning Toolbox).

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

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

    Ссылки

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

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

    свернуть все

    Предварительно обученная нейронная сеть YAMNet, возвращенная как SeriesNetwork Объект (Deep Learning Toolbox).

    Ссылки

    [1] Gemmeke, Джорт Ф., и др. “Аудио Набор: Онтология и Помеченный Человеком Набор данных для Аудио Событий”. 2 017 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2017, стр 776–80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.

    [2] Херши, Шон, и др. “Архитектуры CNN для Крупномасштабной Аудио Классификации”. 2 017 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2017, стр 131–35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.

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

    Введенный в R2020b