detectionErrorTradeoff

Оцените систему двоичной классификации

    Описание

    пример

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

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

    results = detectionErrorTradeoff(___,'Scorer',A) возвращает результаты только для заданного счетчика.

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

    [results,threshold] = detectionErrorTradeoff(___,'minDCF',W) вычисляет порог как минимум функции затрат на обнаружение.

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

    Примеры

    свернуть все

    Используйте базу данных отслеживания тангажа из Технологического университета Граца (PTDB-TUG) [1]. Набор данных состоит из 20 носителей английского языка, читающих 2342 фонетически богатых предложения из корпуса 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=20×2 table
        Label    Count
        _____    _____
    
         F01      236 
         F02      236 
         F03      236 
         F04      236 
         F05      236 
         F06      236 
         F07      236 
         F08      234 
         F09      236 
         F10      236 
         M01      236 
         M02      236 
         M03      236 
         M04      236 
         M05      236 
         M06      236 
          ⋮
    
    

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

    [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=16×2 table
        Label    Count
        _____    _____
    
         F02      236 
         F03      236 
         F04      236 
         F06      236 
         F07      236 
         F08      234 
         F09      236 
         F10      236 
         M02      236 
         M03      236 
         M04      236 
         M06      236 
         M07      236 
         M08      236 
         M09      236 
         M10      236 
    
    
    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      232 
         F05      232 
         M01      232 
         M05      232 
    
    

    Создайте 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: 3774
      UBMNumComponents: 128
      UBMNumIterations: 5
      TVSRank: 64
      TVSNumIterations: 3
    
    trainClassifier
      Train signals: 3774
      Train labels: F02 (236), F03 (236) ... and 14 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.25324           1     0 
         0.25398     0.99964     0 
         0.25472     0.99964     0 
         0.25546     0.99928     0 
          0.2562     0.99928     0 
         0.25694     0.99928     0 
         0.25768     0.99928     0 
         0.25842     0.99928     0 
         0.25916     0.99928     0 
         0.25991     0.99928     0 
         0.26065     0.99928     0 
         0.26139     0.99928     0 
         0.26213     0.99928     0 
         0.26287     0.99928     0 
         0.26361     0.99928     0 
         0.26435     0.99928     0 
          ⋮
    
    
    results.PLDA
    ans=1000×3 table
        Threshold    FAR      FRR  
        _________    ___    _______
    
         -11.389      0     0.99892
         -11.124      0     0.99892
         -10.858      0     0.99892
         -10.593      0     0.99892
         -10.327      0     0.99892
         -10.061      0     0.99784
         -9.7958      0     0.99784
         -9.5303      0     0.99784
         -9.2647      0     0.99784
         -8.9991      0     0.99784
         -8.7335      0     0.99784
         -8.4679      0     0.99784
         -8.2023      0     0.99784
         -7.9367      0     0.99569
         -7.6712      0     0.99353
         -7.4056      0     0.99353
          ⋮
    
    

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

    eerThreshold
    eerThreshold = struct with fields:
        PLDA: 30.3075
         CSS: 0.8682
    
    

    Первый звонок 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 = 22.3400
    

    Система верификации тестовых динамиков

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

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

    Чтобы выполнить верификацию динамика, вызовите verify со звуковым сигналом и указанием идентификатора динамика, бомбардира и порога для бомбардира. The 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 = 0.97
    

    Еще раз вызовите верификацию динамика. На этот раз укажите неправильный идентификатор динамика.

    possibleSpeakers = speakerVerification.EnrolledLabels.Properties.RowNames;
    imposterIdx = find(~ismember(possibleSpeakers,knownSpeakerID));
    imposter = possibleSpeakers(imposterIdx(randperm(numel(imposterIdx),1)))
    imposter = 1×1 cell array
        {'M05'}
    
    
    [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 = 0.48
    

    Ссылки

    [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 объект, который указывает на набор данных моно аудиосигналов.

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

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

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

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

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

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

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

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

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

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

    Примечание

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

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

    Аргументы в виде пар имя-значение

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

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

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

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

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

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

    <reservedrangesplaceholder8> det (P FR, <reservedrangesplaceholder6> FA) = <reservedrangesplaceholder5> FR × <reservedrangesplaceholder4> FR × <reservedrangesplaceholder3> представляют + <reservedrangesplaceholder2> FA × <reservedrangesplaceholder1> FA × (1 - P существующий),

    где

    • C det - Функция затрат на обнаружение

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

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

    • P настоящее время - Предварительная вероятность присутствия зарегистрированной метки

    • P FR - Наблюдаемая вероятность ложного отклонения, заданная data вход в detectionErrorTradeoff

    • P FA - Наблюдаемая вероятность ложного принятия дает data вход в detectionErrorTradeoff

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

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

    свернуть все

    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, David A. van, and Niko Brümmer. «Введение в независимую от приложений оценку систем распознавания спикеров». В «Speaker Classification I» под редакцией Кристиана Мюллера, 4343: 330-53. Берлин, Гейдельберг: Спрингер Берлин Гейдельберг, 2007. https://doi.org/10.1007/978-3-540-74200-5_19.

    Введенный в R2021a
    Для просмотра документации необходимо авторизоваться на сайте