detectionErrorTradeoff

Оцените бинарную систему классификации

    Описание

    пример

    results = detectionErrorTradeoff(ivs,data,labels) вычисляет ошибочный компромисс обнаружения системы i-вектора ivs для зарегистрированных меток и заданных данных.

    results = detectionErrorTradeoff(ivs) возвращает структуру, содержащую ранее вычисленные результаты порога, развертывающегося для вероятностного линейного дискриминантного анализа (PLDA) и выигрыша подобия косинуса (CSS).

    [results,threshold] = detectionErrorTradeoff(___) также возвращает порог, соответствующий равному коэффициенту ошибок.

    [___] = detectionErrorTradeoff(___,Name,Value) задает дополнительные опции с помощью аргументов name-value. Например, можно выбрать результаты маркера и аппаратный ресурс для извлечения i-векторов.

    detectionErrorTradeoff(___) без выходных аргументов строит равный коэффициент ошибок и ошибочный компромисс обнаружения.

    Примеры

    свернуть все

    Используйте Базу данных Отслеживания Тангажа из Технологического университета Граца (PTDB-TUG) [1]. Набор данных состоит из 20 английских носителей языка, читающих 2 342 фонетически богатых предложения из корпуса TIMIT. Загрузите и извлеките набор данных. В зависимости от вашей системы, загружая и извлекая набор данных может занять приблизительно 1,5 часа.

    url = 'https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip';
    downloadFolder = tempdir;
    datasetFolder = fullfile(downloadFolder,'PTDB-TUG');
    
    if ~exist(datasetFolder,'dir')
        disp('Downloading PTDB-TUG (3.9 G) ...')
        unzip(url,datasetFolder)
    end

    Создайте audioDatastore возразите что точки против набора данных. Набор данных был первоначально предназначен для использования в отслеживающем тангаж обучении и оценке и включает показания ларингографика и базовые решения тангажа. Используйте только исходные аудиозаписи.

    ads = audioDatastore([fullfile(datasetFolder,"SPEECH DATA","FEMALE","MIC"),fullfile(datasetFolder,"SPEECH DATA","MALE","MIC")], ...
                         'IncludeSubfolders',true, ...
                         'FileExtensions','.wav');

    Имена файлов содержат идентификаторы динамика. Декодируйте имена файлов, чтобы установить метки в audioDatastore объект.

    ads.Labels = extractBetween(ads.Files,'mic_','_');
    countEachLabel(ads)
    ans=18×2 table
        Label    Count
        _____    _____
    
         F01      211 
         F02      213 
         F03      213 
         F04      213 
         F05      236 
         F06      213 
         F07      213 
         F08      210 
         F09      213 
         M01      211 
         M02      213 
         M03      213 
         M04      213 
         M05      235 
         M06      213 
         M07      213 
          ⋮
    
    

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

    [audioIn,audioInfo] = read(ads);
    fs = audioInfo.SampleRate;
    
    t = (0:size(audioIn,1)-1)/fs;
    sound(audioIn,fs)
    plot(t,audioIn)
    xlabel('Time (s)')
    ylabel('Amplitude')
    axis([0 t(end) -1 1])
    title('Sample Utterance from Data Set')

    Разделите audioDatastore объект в четыре: один для обучения, один для приема, один, чтобы оценить компромисс ошибки обнаружения, и один для тестирования. Набор обучающих данных содержит 16 динамиков. Прием, компромисс ошибки обнаружения и наборы тестов содержат другие четыре динамика.

    speakersToTest = categorical(["M01","M05","F01","F05"]);
    
    adsTrain = subset(ads,~ismember(ads.Labels,speakersToTest));
    
    ads = subset(ads,ismember(ads.Labels,speakersToTest));
    [adsEnroll,adsTest,adsDET] = splitEachLabel(ads,3,1);

    Отобразите распределения метки audioDatastore объекты.

    countEachLabel(adsTrain)
    ans=14×2 table
        Label    Count
        _____    _____
    
         F02      213 
         F03      213 
         F04      213 
         F06      213 
         F07      213 
         F08      210 
         F09      213 
         M02      213 
         M03      213 
         M04      213 
         M06      213 
         M07      213 
         M08      213 
         M09      213 
    
    
    countEachLabel(adsEnroll)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01       3  
         F05       3  
         M01       3  
         M05       3  
    
    
    countEachLabel(adsTest)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01       1  
         F05       1  
         M01       1  
         M05       1  
    
    
    countEachLabel(adsDET)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01      207 
         F05      232 
         M01      207 
         M05      231 
    
    

    Создайте систему i-вектора. По умолчанию система i-вектора принимает, что вход к системе является моно звуковыми сигналами.

    speakerVerification = ivectorSystem('SampleRate',fs)
    speakerVerification = 
      ivectorSystem with properties:
    
             InputType: 'audio'
            SampleRate: 48000
          DetectSpeech: 1
        EnrolledLabels: [0×2 table]
    
    

    Чтобы обучить экстрактор системы i-вектора, вызовите trainExtractor. Задайте количество компонентов универсальной фоновой модели (UBM) как 128 и количество итераций максимизации ожидания как 5. Задайте ранг общего пробела изменчивости (TVS) как 64 и количество итераций как 3.

    trainExtractor(speakerVerification,adsTrain, ...
        'UBMNumComponents',128,'UBMNumIterations',5, ...
        'TVSRank',64,'TVSNumIterations',3)
    Calculating standardization factors ....done.
    Training universal background model ........done.
    Training total variability space ......done.
    i-vector extractor training complete.
    

    Чтобы обучить классификатор системы i-вектора, используйте trainClassifier. Чтобы уменьшать размерность i-векторов, задайте количество собственных векторов в матрице проекции как 16. Задайте количество размерностей в модели вероятностного линейного дискриминантного анализа (PLDA) как 16 и количество итераций как 3.

    trainClassifier(speakerVerification,adsTrain,adsTrain.Labels, ...
        'NumEigenvectors',16, ...
        'PLDANumDimensions',16,'PLDANumIterations',3)
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model ......done.
    i-vector classifier training complete.
    

    Смотреть параметры раньше ранее обучало систему i-вектора, использовало info.

    info(speakerVerification)
    i-vector system input
      Input feature vector length: 60
      Input data type: double
    
    trainExtractor
      Train signals: 2979
      UBMNumComponents: 128
      UBMNumIterations: 5
      TVSRank: 64
      TVSNumIterations: 3
    
    trainClassifier
      Train signals: 2979
      Train labels: F02 (213), F03 (213) ... and 12 more
      NumEigenvectors: 16
      PLDANumDimensions: 16
      PLDANumIterations: 3
    

    Разделите набор приема.

    [adsEnrollPart1,adsEnrollPart2] = splitEachLabel(adsEnroll,1,2);

    Чтобы зарегистрировать докладчиков в системе i-вектора, вызовите enroll.

    enroll(speakerVerification,adsEnrollPart1,adsEnrollPart1.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .......done.
    Enrollment complete.
    

    Когда вы регистрируете докладчиков, EnrolledLabels только для чтения свойство обновляется с зарегистрированными метками и соответствующими i-векторами шаблона. Таблица также отслеживает количество сигналов, используемых, чтобы создать i-вектор шаблона. Обычно использование большего количества сигналов приводит к лучшему шаблону.

    speakerVerification.EnrolledLabels
    ans=4×2 table
                  ivector       NumSamples
               _____________    __________
    
        F01    {16×1 double}        1     
        F05    {16×1 double}        1     
        M01    {16×1 double}        1     
        M05    {16×1 double}        1     
    
    

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

    enroll(speakerVerification,adsEnrollPart2,adsEnrollPart2.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .......done.
    Enrollment complete.
    
    speakerVerification.EnrolledLabels
    ans=4×2 table
                  ivector       NumSamples
               _____________    __________
    
        F01    {16×1 double}        3     
        F05    {16×1 double}        3     
        M01    {16×1 double}        3     
        M05    {16×1 double}        3     
    
    

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

    [results, eerThreshold] = detectionErrorTradeoff(speakerVerification,adsDET,adsDET.Labels);
    Extracting i-vectors ...done.
    Scoring i-vector pairs ...done.
    Detection error tradeoff evaluation complete.
    

    Первый выход от detectionErrorTradeoff структура с двумя полями: CSS и PLDA. Каждое поле содержит таблицу. Каждая строка таблицы содержит возможный порог решения для задач верификации динамика, и соответствующий ложный сигнальный уровень (FAR) и ложный уровень отклонения (FRR). FAR и FRR определяются с помощью зарегистрированных марок докладчика и ввода данных к detectionErrorTradeoff функция.

    results
    results = struct with fields:
        PLDA: [1000×3 table]
         CSS: [1000×3 table]
    
    
    results.CSS
    ans=1000×3 table
        Threshold      FAR      FRR
        _________    _______    ___
    
        0.030207           1     0 
        0.031161     0.99962     0 
        0.032115     0.99962     0 
        0.033069     0.99962     0 
        0.034023     0.99962     0 
        0.034977     0.99962     0 
        0.035931     0.99962     0 
        0.036885     0.99962     0 
        0.037839     0.99962     0 
        0.038793     0.99962     0 
        0.039747     0.99962     0 
        0.040701     0.99962     0 
        0.041655     0.99962     0 
        0.042609     0.99962     0 
        0.043563     0.99962     0 
        0.044517     0.99962     0 
          ⋮
    
    
    results.PLDA
    ans=1000×3 table
        Threshold      FAR      FRR
        _________    _______    ___
    
         -217.63           1     0 
          -217.4     0.99962     0 
         -217.17     0.99962     0 
         -216.95     0.99962     0 
         -216.72     0.99962     0 
         -216.49     0.99962     0 
         -216.27     0.99962     0 
         -216.04     0.99962     0 
         -215.81     0.99962     0 
         -215.59     0.99962     0 
         -215.36     0.99962     0 
         -215.13     0.99962     0 
         -214.91     0.99962     0 
         -214.68     0.99962     0 
         -214.45     0.99962     0 
         -214.23     0.99962     0 
          ⋮
    
    

    Второй выход от detectionErrorTradeoff структура с двумя полями: CSS и PLDA. Соответствующее значение является порогом решения, который приводит к равному коэффициенту ошибок (когда FAR и FRR равны).

    eerThreshold
    eerThreshold = struct with fields:
        PLDA: -34.3083
         CSS: 0.7991
    
    

    В первый раз вы вызываете detectionErrorTradeoff, необходимо обеспечить данные и соответствующие метки, чтобы оценить. Впоследствии, можно получить ту же информацию или различный анализ с помощью тех же базовых данных, путем вызова detectionErrorTradeoff без данных и меток.

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

    detectionErrorTradeoff(speakerVerification)

    Вызовите detectionErrorTradeoff снова. На этот раз визуализируйте только компромисс ошибки обнаружения для маркера PLDA.

    detectionErrorTradeoff(speakerVerification,'Scorer',"plda")

    В зависимости от вашего приложения можно хотеть использовать порог, который взвешивает ошибочную стоимость ложного предупреждения выше или ниже, чем ошибочная стоимость ложного отклонения. Можно также использовать данные, которые не являются представительными для априорной вероятности динамика, присутствующего. Можно использовать minDCF параметр, чтобы задать пользовательские затраты и априорную вероятность. Вызовите detectionErrorTradeoff снова, на этот раз задайте стоимость ложного отклонения как 1, стоимость ложного принятия как 2, и априорная вероятность, что динамик присутствует как 0,1.

    costFR = 1;
    costFA = 2;
    priorProb = 0.1;
    detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])

    Вызовите detectionErrorTradeoff снова. На этот раз получите minDCF порог для маркера PLDA и параметров функции стоимости обнаружения.

    [~,minDCFThreshold] = detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])
    minDCFThreshold = -23.4316
    

    Протестируйте систему верификации динамика

    Считайте сигнал из набора тестов.

    adsTest = shuffle(adsTest);
    [audioIn,audioInfo] = read(adsTest);
    knownSpeakerID = audioInfo.Label
    knownSpeakerID = 1×1 cell array
        {'F05'}
    
    

    Чтобы выполнить верификацию динамика, вызовите verify со звуковым сигналом и задают ID динамика, маркер и порог для маркера. verify функция возвращает логическое значение, указывающее, принята ли идентичность динамика или отклонена, и счет, указывающий на подобие входного аудио и i-вектора шаблона, соответствующего зарегистрированной метке.

    [tf,score] = verify(speakerVerification,audioIn,knownSpeakerID,"plda",eerThreshold.PLDA);
    if tf
        fprintf('Success!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score)
    else
        fprinf('Failure!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score)
    end
    Success!
    Speaker accepted.
    Similarity score = -4.19
    

    Вызовите верификацию динамика снова. На этот раз задайте неправильный ID динамика.

    possibleSpeakers = speakerVerification.EnrolledLabels.Properties.RowNames;
    imposterIdx = find(~ismember(possibleSpeakers,knownSpeakerID));
    imposter = possibleSpeakers(imposterIdx(randperm(numel(imposterIdx),1)))
    imposter = 1×1 cell array
        {'F01'}
    
    
    [tf,score] = verify(speakerVerification,audioIn,imposter,"plda",eerThreshold.PLDA);
    if tf
        fprintf('Failure!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score)
    else
        fprintf('Success!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score)
    end
    Success!
    Speaker rejected.
    Similarity score = -63.44
    

    Ссылки

    [1] Обработка сигналов и Речевая Коммуникационная Лаборатория. https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html. Полученный доступ 12 декабря 2019.

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

    свернуть все

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

    Помеченные данные об оценке в виде массива ячеек или как audioDatastore, signalDatastore, или TransformedDatastore объект.

    • Если InputType установлен в 'audio' когда система i-вектора будет создана, задайте data как один из них:

      • Массив ячеек одноканальных звуковых сигналов, каждый заданный как вектор-столбец с базовым типом single или double.

      • audioDatastore возразите или signalDatastore возразите что точки против набора данных моно звуковых сигналов.

      • TransformedDatastore с базовым audioDatastore или signalDatastore это указывает на набор данных моно звуковых сигналов. Выход от вызовов до read от преобразования datastore должен быть моно звуковыми сигналами с базовым типом данных single или double.

    • Если InputType установлен в 'features' когда система i-вектора будет создана, задайте data как один из них:

      • Массив ячеек матриц с базовым типом single или double. Матрицы должны состоять из функций аудио, где количество функций (столбцы) заблокировано в первый раз trainExtractor называется и количество транзитных участков (строки) переменного размера. Количество входа функций в любых последующих вызовах любой из объектных функций должно быть равно количеству функций, использованных при вызове trainExtractor.

      • TransformedDatastore объект с базовым audioDatastore или signalDatastore чей read функция вывела как описано в предыдущем маркере.

      • signalDatastore объект, чей read функция вывела как описано в первом маркере.

    Типы данных: cell | audioDatastore | signalDatastore

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

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

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

    • Массив строк

    Примечание

    Количество звуковых сигналов в data должен совпадать с количеством labels.

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

    Аргументы name-value

    Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

    Пример: detectionErrorTradeoff(ivs,'Scorer','css')

    Результаты маркера, возвращенные от системы i-вектора в виде 'plda', который соответствует вероятностному линейному дискриминантному анализу (PLDA), 'css', который соответствует счету подобия косинуса (CSS) или 'all'.

    Типы данных: char | string

    Параметры функции стоимости обнаружения в виде трехэлементного вектора, состоящего из стоимости ложного отклонения, стоимости ложного принятия и априорной вероятности зарегистрированной присутствующей метки, в том порядке.

    Когда вы задаете параметры функции стоимости обнаружения, detectionErrorTradeoff возвращает threshold соответствие минимуму функции стоимости [1] обнаружения. Функция стоимости обнаружения задана как

    Det C (P FR, FA P) = C FR × P FR × P представляют + FA C × FA P × (1 – существующий P),

    где

    • Det C — функция стоимости Обнаружения

    • FR C — Стоимость ложного отклонения

    • FA C — Стоимость ложного принятия

    • Существующий P — Априорная вероятность зарегистрированной присутствующей метки

    • FR P — Наблюдаемая вероятность ложного отклонения, учитывая data введите к detectionErrorTradeoff

    • FA P — Наблюдаемая вероятность ложного принятия, учитывая data введите к detectionErrorTradeoff

    Типы данных: single | double

    Аппаратный ресурс для выполнения в виде одного из них:

    • "auto" — Используйте графический процессор, если это доступно. В противном случае используйте центральный процессор.

    • "cpu" — Используйте центральный процессор.

    • "gpu" — Используйте графический процессор. Эта опция требует Parallel Computing Toolbox™.

    • "multi-gpu" — Используйте несколько графических процессоров на одной машине, с помощью локального параллельного пула на основе кластерного профиля по умолчанию. Если нет никакого текущего параллельного пула, программное обеспечение начинает параллельный пул с размера пула, равного количеству доступных графических процессоров. Эта опция требует Parallel Computing Toolbox.

    • "parallel" — Используйте локальный или удаленный параллельный пул на основе своего кластерного профиля по умолчанию. Если нет никакого текущего параллельного пула, программное обеспечение запускает тот с помощью кластерного профиля по умолчанию. Если пул имеет доступ к графическим процессорам, то только рабочие с помощью уникального графического процессора выполняют учебный расчет. Если пул не имеет графических процессоров, то обучение происходит на всех доступных рабочих центрального процессора. Эта опция требует Parallel Computing Toolbox.

    Типы данных: char | string

    Опция, чтобы использовать постановку в очередь упреждающей выборки при чтении из datastore в виде логического значения. Этот аргумент требует Parallel Computing Toolbox.

    Типы данных: логический

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

    свернуть все

    FAR и FRR на протестированный порог, возвратились как структура или таблица.

    • Если 'Scorer' задан как 'all', затем results возвращен как структура с полями PLDA и CSS и значения, содержащие таблицы. Каждая таблица имеет три переменные: Threshold, FAR, и FRR.

    • Если 'Scorer' задан как 'plda' или 'css', затем results возвращен как таблица, соответствующая заданному маркеру.

    Типы данных: struct | table

    Порог, соответствующий равному коэффициенту ошибок (EER) или минимуму функции стоимости обнаружения (minDCF), возвратился как скаляр или структура. Если minDCF задан, затем threshold соответствует minDCF. В противном случае, threshold соответствует EER.

    • Если 'Scorer' задан как 'all', затем threshold возвращен как структура с полями PLDA и CSS и значения равняются соответствующим порогам.

    • Если 'Scorer' задан как 'plda' или 'css', затем threshold возвращен как скаляр, соответствующий заданному маркеру.

    Типы данных: single | double | struct

    Ссылки

    [1] Leeuwen, фургон Дэвида А. и Нико Брюммер. “Введение в Не зависящую от приложения Оценку Систем Распознавания Динамика”. В Классификации I Динамиков, отредактированной Кристианом Мюллером, 4343:330–53. Берлин, Гейдельберг: Спрингер Берлин Гейдельберг, 2007. https://doi.org/10.1007/978-3-540-74200-5_19.

    Введенный в R2021a