unenroll

Отменить регистрацию меток

    Описание

    пример

    unenroll(ivs) отменяет запись всех меток и соответствующих i-векторов из i-векторной системы ivs.

    unenroll(ivs,labels) отменяет регистрацию указанных меток и соответствующих i-векторов из i-векторной системы ivs.

    Примеры

    свернуть все

    Загрузите Берлинскую базу данных эмоциональной речи [1]. База данных содержит 535 высказываний 10 актёров, призванных передать одну из следующих эмоций: гнев, скука, отвращение, беспокойство/страх, счастье, грусть или нейтраль. Эмоции являются независимыми от текста.

    url = "http://emodb.bilderbar.info/download/download.zip";
    downloadFolder = tempdir;
    datasetFolder = fullfile(downloadFolder,"Emo-DB");
    
    if ~exist(datasetFolder,'dir')
        disp('Downloading Emo-DB (40.5 MB) ...')
        unzip(url,datasetFolder)
    end

    Создайте audioDatastore это указывает на аудио файлов.

    ads = audioDatastore(fullfile(datasetFolder,"wav"));

    Имена файлов являются кодами, указывающими идентификатор динамика, устный текст, эмоции и версию. Веб-сайт содержит ключ для интерпретации кода и дополнительную информацию о докладчиках, таких как пол и возраст. Составьте таблицу с переменными Speaker и Emotion. Декодируйте имена файлов в таблицу.

    filepaths = ads.Files;
    emotionCodes = cellfun(@(x)x(end-5),filepaths,'UniformOutput',false);
    emotions = replace(emotionCodes,{'W','L','E','A','F','T','N'}, ...
        {'Anger','Boredom','Disgust','Anxiety','Happiness','Sadness','Neutral'});
    
    speakerCodes = cellfun(@(x)x(end-10:end-9),filepaths,'UniformOutput',false);
    labelTable = table(categorical(speakerCodes),categorical(emotions),'VariableNames',{'Speaker','Emotion'});
    summary(labelTable)
    Variables:
    
        Speaker: 535×1 categorical
    
            Values:
    
                03       49   
                08       58   
                09       43   
                10       38   
                11       55   
                12       35   
                13       61   
                14       69   
                15       56   
                16       71   
    
        Emotion: 535×1 categorical
    
            Values:
    
                Anger          127   
                Anxiety         69   
                Boredom         81   
                Disgust         46   
                Happiness       71   
                Neutral         79   
                Sadness         62   
    

    labelTable находится в том же порядке, что и файлы в audioDatastore. Установите Labels свойство audioDatastore на labelTable.

    ads.Labels = labelTable;

    Считайте сигнал от datastore и слушайте его. Отобразите идентификатор динамика и эмоции аудиосигнала.

    [audioIn,audioInfo] = read(ads);
    fs = audioInfo.SampleRate;
    sound(audioIn,fs)
    audioInfo.Label
    ans=1×2 table
        Speaker     Emotion 
        _______    _________
    
          03       Happiness
    
    

    Разделите datastore на набор обучающих данных и тестовый набор. Назначьте два динамика для тестового набора и оставшиеся для набора обучающих данных.

    testSpeakerIdx = ads.Labels.Speaker=="12" | ads.Labels.Speaker=="13";
    adsTrain = subset(ads,~testSpeakerIdx);
    adsTest = subset(ads,testSpeakerIdx);

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

    trainSet = readall(adsTrain);
    trainLabels = adsTrain.Labels.Emotion;
    testSet = readall(adsTest);
    testLabels = adsTest.Labels.Emotion;

    Создайте i-векторную систему, которая не применяет обнаружение речи. Когда DetectSpeech установлено в true (по умолчанию), только области обнаруженной речи используются для обучения i-векторной системы. Когда DetectSpeech установлено в false, весь входной аудио используется для обучения i-векторной системы. Полезность применения обнаружения речи зависит от входов в систему.

    emotionRecognizer = ivectorSystem('SampleRate',fs,'DetectSpeech',false)
    emotionRecognizer = 
      ivectorSystem with properties:
    
             InputType: 'audio'
            SampleRate: 16000
          DetectSpeech: 0
        EnrolledLabels: [0×2 table]
    
    

    Функции trainExtractor использование набора обучающих данных.

    trainExtractor(emotionRecognizer,trainSet, ...
        'UBMNumComponents',256, ...
        'UBMNumIterations',5, ...
        ...
        'TVSRank',128, ...
        'TVSNumIterations',2);
    Calculating standardization factors .....done.
    Training universal background model ........done.
    Training total variability space .....done.
    i-vector extractor training complete.
    

    Функции trainClassifier использование набора обучающих данных.

    trainClassifier(emotionRecognizer,trainSet,trainLabels, ...
        'NumEigenvectors',64, ...
        ...
        'PLDANumDimensions',64, ...
        'PLDANumIterations',10);
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model .............done.
    i-vector classifier training complete.
    

    Зарегистрируйте метки обучения в i-векторной системе.

    enroll(emotionRecognizer,trainSet,trainLabels)
    Extracting i-vectors ...done.
    Enrolling i-vectors ..........done.
    Enrollment complete.
    

    Можно использовать detectionErrorTradeoff как быстрая проверка работоспособности на эффективность мультиметки системы классификации закрытого набора. Однако detectionErrorTradeoff предоставляет больше информации, подходящей для открытой установки двоичных задач классификации, например, задач верификации диктора.

    detectionErrorTradeoff(emotionRecognizer,testSet,testLabels)
    Extracting i-vectors ...done.
    Scoring i-vector pairs ...done.
    Detection error tradeoff evaluation complete.
    

    Для более подробного представления эффективности i-векторной системы в многослойном приложении закрытого набора можно использовать identify и создайте матрицу неточностей. Матрица неточностей позволяет вам идентифицировать, какие эмоции неправильно идентифицированы, а какие - неправильно идентифицированы. Используйте вспомогательную функцию plotConfusion для отображения результатов.

    trueLabels = testLabels;
    predictedLabels = trueLabels;
    scorer = "css";
    for ii = 1: numel (testSet)
        tableOut = identify (emotionRecognizer, testSet {ii}, scorer);
        predictedLabels (ii) = tableOut.Label (1);
    end
    
    plotConfusion (trueLabels, predictedLabels)

    Функции info чтобы проверить, как emotionRecognizer был обучен и оценен.

    info(emotionRecognizer)
    i-vector system input
      Input feature vector length: 60
      Input data type: double
    
    trainExtractor
      Train signals: 439
      UBMNumComponents: 256
      UBMNumIterations: 5
      TVSRank: 128
      TVSNumIterations: 2
    
    trainClassifier
      Train signals: 439
      Train labels: Anger (103), Anxiety (56) ... and 5 more
      NumEigenvectors: 64
      PLDANumDimensions: 64
      PLDANumIterations: 10
    
    detectionErrorTradeoff
      Evaluation signals: 96
      Evaluation labels: Anger (24), Anxiety (13) ... and 5 more
    

    Затем измените систему i-векторов, чтобы распознать эмоции как положительные, нейтральные или отрицательные. Обновите метки, включив только отрицательные, положительные и категориальные категории.

    trainLabelsSentiment = trainLabels;
    trainLabelsSentiment(ismember(trainLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative");
    trainLabelsSentiment(ismember(trainLabels,categorical("Happiness"))) = categorical("Postive");
    trainLabelsSentiment = removecats(trainLabelsSentiment);
    
    testLabelsSentiment = testLabels;
    testLabelsSentiment(ismember(testLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative");
    testLabelsSentiment(ismember(testLabels,categorical("Happiness"))) = categorical("Postive");
    testLabelsSentiment = removecats(testLabelsSentiment);

    Переобучите классификатор i-векторной системы с помощью обновленных меток. Вам не нужно переобучать экстрактор.

    trainClassifier(emotionRecognizer,trainSet,trainLabelsSentiment, ...
        'NumEigenvectors',64, ...
        ...
        'PLDANumDimensions',64, ...
        'PLDANumIterations',10);
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model .............done.
    i-vector classifier training complete.
    

    Зарегистрируйте обучающие метки в системе, а затем постройте матрицу неточностей для тестового набора.

    enroll(emotionRecognizer,trainSet,trainLabelsSentiment)
    Extracting i-vectors ...done.
    Enrolling i-vectors ......done.
    Enrollment complete.
    
    trueLabels = testLabelsSentiment;
    predictedLabels = trueLabels;
    scorer = "css";
    for ii = 1: numel (testSet)
        tableOut = identify (emotionRecognizer, testSet {ii}, scorer);
        predictedLabels (ii) = tableOut.Label (1);
    end
    
    plotConfusion (trueLabels, predictedLabels)

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

    Отмените регистрацию меток настроения из системы и затем зарегистрируйте исходные категории эмоций в системе. Анализ классификационной эффективности системы.

    unenroll(emotionRecognizer)
    enroll(emotionRecognizer,trainSet,trainLabels)
    Extracting i-vectors ...done.
    Enrolling i-vectors ..........done.
    Enrollment complete.
    
    trueLabels = testLabels;
    predictedLabels = trueLabels;
    scorer = "css";
    for ii = 1: numel (testSet)
        tableOut = identify (emotionRecognizer, testSet {ii}, scorer);
        predictedLabels (ii) = tableOut.Label (1);
    end
    
    plotConfusion (trueLabels, predictedLabels)

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

    function plotConfusion(trueLabels,predictedLabels)
    uniqueLabels = unique(trueLabels);
    cm = zeros(numel(uniqueLabels));
    for ii = 1:numel(uniqueLabels)
        for jj = 1:numel(uniqueLabels)
            cm(ii,jj) = sum((trueLabels==uniqueLabels(ii)) & (predictedLabels==uniqueLabels(jj)));
        end
    end
    
    heatmap(uniqueLabels,uniqueLabels,cm)
    colorbar off
    ylabel('True Labels')
    xlabel('Predicted Labels')
    accuracy = mean(trueLabels==predictedLabels);
    title(sprintf("Accuracy = %0.2f %%",accuracy*100))
    end

    Ссылки

    [1] Burkhardt, F., A. Paeschke, M. Rolfes, W.F. Sendlmeier, and B. Weiss, «A Database of Немецкая эмоциональная речь». В Proceedings Interspeech 2005. Лиссабон, Португалия: Международная ассоциация речевых коммуникаций, 2005 год.

    Входные параметры

    свернуть все

    i-векторная система, заданная как объект типа ivectorSystem.

    Классификационные метки, используемые i-векторной системой, заданные как одно из следующего:

    • Категориальный массив

    • Массив ячеек из векторов символов

    • A строковых массивов

    Типы данных: categorical | cell | string

    Введенный в R2021a