exponenta event banner

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. Укажите 128 компонентов универсальной фоновой модели (UBM) и 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-vector вызовите 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 с помощью звукового сигнала и указать идентификатор громкоговорителя, бомбардир и порог для бомбардира. 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 из хранилища данных преобразования должны быть монозвуковые сигналы с базовым типом данных single или double.

    • Если для InputType установлено значение 'features' при создании i-векторной системы укажите data как одно из следующих:

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

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

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

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

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

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

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

    • Строковый массив

    Примечание

    Количество звуковых сигналов в 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]. Функция затрат на обнаружение определяется как

    Cdet (PFR, PFA) = CFR × PFR × Ppresent + CFA × PFA × (1 - Ppresent),

    где

    • Cdet - Функция определения затрат

    • CFR - Стоимость ложного отклонения

    • CFA - Стоимость ложной приемки

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

    • PFR - Наблюдаемая вероятность ложного отклонения с учетом data вход в detectionErrorTradeoff

    • PFA - наблюдаемая вероятность ложного принятия дает 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] Леувен, Давид А. ван и Нико Брюммер. «Введение в независимую от приложений оценку систем распознавания ораторов». В классификации спикеров I под редакцией Кристиана Мюллера 4343: 330-53. Берлин, Гейдельберг: Springer Berlin Heidelberg, 2007. https://doi.org/10.1007/978-3-540-74200-5_19.

    Представлен в R2021a