Изменение количества проверок с Tevian Provider
Автор Maksim Efanov, Last modified by Dmitry Bukreev на 22 сентября 2026 11:12 AM

Вопрос:
Можно ли изменить количество проверок при использовании Tevian Provider?

Ответ:
Да, для этого в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Indeed-ID\IndeedID.Tevian.BSP измените значения параметров LivenessStagesMin (минимальное число проверок) и LivenessStagesMax (максимальное число проверок) на необходимые.


Также можно настроить частоту тех или иных способов проверки. Допускаются значения от 0 до 1. За это отвечают следующие ключи:
LivenessWeightSmile - Частота проверки по улыбке.
LivenessWeightBlink - Частота проверки по морганию.
LivenessWeightTurnL - Частота проверки по повороту головы влево.
LivenessWeightTurnR - Частота проверки по повороту головы вправо.
LivenessWeightTurn - Частота проверки по повороту головы.

Диапазоны значений и смысл параметров ключа HKLM\Software\Policies\Indeed-ID\IndeedID.Tevian.BSP

Общие правила

  • Единственный обязательный параметр — TevianConfigFileName (ставит инсталлер). Все остальные опциональны: при отсутствии или ошибке чтения используется зашитое значение по умолчанию (константы Settings.h BSP).
  • Типы и границы: REG_SZ — пути/текст; float в REG_SZ — число с десятичной точкой . (GPO: строка, maxlen=6); REG_DWORD — беззнаковое 32-битное, 0..4294967295; bool в REG_DWORD — 0/1.
  • GPO-шаблон IndeedID.Tevian.BSP.adm покрывает все настройки (ru/en); «Не задан/Отключен» не записывает значения → BSP работает на дефолтах.
  • VideoFileName*, VideoFps*, DebugMessage*, LivenessScript* — отладочные/демо-настройки: в промышленной GPO-версии их будет минимум.
  • Настройки сравнения (в первую очередь ThresholdEquality) из-за кеш-сервера нужны и на клиенте, и на сервере; видеонастройки — только на клиенте.

Параметры: что можно указать и что значит

Параметр Тип Диапазон Значение
TevianConfigFileName REG_SZ путь к файлу Конфигурация FaceSDK (classifiers.ini, FaceSDK::ConfigManager). Единственный обязательный
VideoFileNameEnroll / VideoFileNameVerify REG_SZ путь; пусто = камера Файл видеовхода вместо камеры для обучения/проверки. Отладочная настройка
VideoFpsEnroll / VideoFpsVerify DWORD по смыслу фактический fps (напр. 1..60); техн. 0..4294967295 FPS видеопотока (файла или камеры), по которому считаются timestamp'ы для FaceSDK. На поток не влияет, но должен примерно (лучше точно) совпадать с реальным fps
ThresholdQualityBluriness, ThresholdQualityOverexposure, ThresholdQualityUnderexposure float 0..1 Пороги качества кадра (FaceSDK::FaceQuality): кандидат на лучший кадр отбрасывается, если размытость/пере-/недоэкспозиция выше порога. «Смягчение» = увеличение значения
ThresholdAngleYaw, ThresholdAnglePitch, ThresholdAngleRoll float градусы (зашитый дефолт — <10°) Кадр приемлем, если угол поворота лица ниже порога (roll в BSP пока не учитывается). Больше — допускает более «косое» лицо
ThresholdSmileAbsent, ThresholdSmilePresent float 0..1 Вероятность улыбки (FaceSDK::Emotions, happiness): «нет улыбки» при ≤ ThresholdSmileAbsent, «улыбка есть» при ≥ ThresholdSmilePresent
ThresholdEyeOpened, ThresholdEyeClosed float 0..1 Вероятность закрытости глаз (FaceSDK::EyesCloseness): открыты при ≤ ThresholdEyeOpened, закрыты при ≥ ThresholdEyeClosed
SmilePresentTimeLimitMs DWORD, мс >0 Макс. длительность состояния «улыбка» на этапе liveness; превышение перезапускает этап с сообщением «долго улыбаетесь»
ClosedEyesBlinkStageTimeLimitMs DWORD, мс >0 Предел времени состояния «глаза закрыты» в этапе моргания (открыто-закрыто-открыто)
LivenessTimeLimitMs DWORD, мс >0 «Предел времени» — общий бюджет liveness-проверки; этапы при генерации распределяются в [0, LivenessTimeLimitMs − LivenessStageTimeLimitMs]
LivenessStageTimeLimitMs DWORD, мс >0 Макс. время одного этапа liveness; превышение → перезапуск всей liveness-проверки
LivenessStageTypicalTimeMs DWORD, мс >0 Внутренний параметр: гарантирует последнему этапу разумное время (напр. бюджет 5 с, типичное 1 с → последний этап ставится до начала 5-й секунды). Типично не настраивать
LivenessStagesMin, LivenessStagesMax DWORD логически 1..N, Min ≤ Max (техн. 0..4294967295) Мин/макс число этапов генерируемого liveness-скрипта; число этапов — равномерное случайное из [Min, Max]
LivenessScriptIsGenerate bool 0/1 1 = применять предопределённый скрипт (LivenessScript*), 0 = генерировать случайный при каждой сессии (обучении и проверке)
LivenessScriptEnroll / LivenessScriptVerify REG_SZ текст скрипта; пустое = пустой скрипт; <none> = грузить из файла Прямой liveness-скрипт: строки разделяются ;, | или переводом строки; пустые и комментарии пропускаются; строка = метка типа проверки + timestamp начала (мс от начала скрипта)
LivenessScriptFileNameEnroll / LivenessScriptFileNameVerify REG_SZ путь к файлу Файл liveness-скрипта; используется, если прямой скрипт не задан
TevianFaceMinX, TevianFaceMinY DWORD, пиксели >0 (напр. для 640×480 обсуждалось 384×288 ≈ 0.6 кадра) Минимальный размер лица для самого FaceSDK (setMinFaceSize): ниже этого FaceSDK вообще перестаёт отслеживать лицо, пользователя о нарушении не информируют
FaceMinX, FaceMinY DWORD, пиксели >0; зависят от разрешения камеры Наше ограничение (r56041) при выборе лучшего кадра: rect обнаружения лица должен быть не меньше этих значений, иначе кадр отбрасывается с подсказкой «лицо слишком маленькое, подойдите ближе». Действует при выборе лучшего кадра, не при проверке живости. Отличается от TevianFaceMin*: ниже FaceMin лицо FaceSDK всё ещё отслеживает
FaceFrameFractionX, FaceFrameFractionY float 0..1 (дефолт 0.1 → для 640×480 это 64×48) Минимальная доля ширины/высоты rect лица от разрешения кадра; накладывается вместе с FaceMinX/Y на этапе выбора лучшего кадра
ThresholdEquality float 0..1 (дефолт 0.7) Порог равенства по score FaceSDK::IMatcher::match в CompareTemplate. Выше — строже; 0.7 «слишком мягко», для строгих режимов обсуждали 0.99, для шанса ложного совпадения 10⁻⁵..10⁻⁶ — 0.999999 (зависимость от шанса ошибки может быть нелинейной)
DebugMessageIsEnabled bool 0/1 On-screen отладочный вывод: качество кадра q, blur/oexp/uexp, yaw/pitch (градусы), эмоция, вероятность улыбки sml, закрытость глаз l/r, текущий этап liveness. «Не задано» → выключено (баг с включённым выводом по умолчанию исправлен в провайдере 1.0.0.3 — AMProv-722)
DebugMessageColor DWORD 24-битный RGB (COLORREF 0x00RRGGBB), каждый канал 0..255 Цвет отладочного вывода (собирается cv::Color через CV_RGB); работает только при DebugMessageIsEnabled=1
  • Разделение ответственности: ThresholdQuality*/Angle*/Smile*/Eye* — пороги выбора лучшего кадра; FaceMin*, FaceFrameFraction* — ограничения размера лица; тайм-лимиты TimeLimitMs и LivenessStages — параметры liveness-скрипта; ThresholdEquality — сравнение шаблонов (клиент + сервер).
  • При LivenessScriptIsGenerate=0 сценарий генерируется заново при каждой сессии: случайное число этапов между Min и Max, случайно распределённое по «Пределу времени»; типы проверок в текущей реализации — smile и blink.
  • Оговорка: конкретные зашитые дефолты большинства порогов (константы Settings.h / defaults.reg) в локальных источниках не раскрываются — файлы лежат в старом SVN BSP; приводить их в статье без сверки с разработчиком не стоит.

Что означают float-значения 0..1 в настройках Tevian BSP

Общий принцип

Все параметры Threshold* в диапазоне 0..1 — это вероятности (confidence scores), которые возвращает FaceSDK при классификации кадра. BSP сравнивает возвращённую вероятность с порогом из реестра и принимает бинарное решение. Чем выше порог — тем строже требование (кроме порогов качества кадра, где логика обратная — см. ниже).

Пороги качества кадра (выбор лучшего кадра)

ThresholdQualityBluriness, ThresholdQualityOverexposure, ThresholdQualityUnderexposure

FaceSDK::IQualityEvaluator возвращает для каждого кадра значение 0..1:

  • 0 = идеально чёткий/экспонированный кадр
  • 1 = максимально размыт / пересвечен / неосвещён

BSP отбрасывает кадр-кандидата на «лучший», если значение выше порога.

Значение Эффект
0 Строже всего: любой кадр, где SDK увидел хоть какую-то размытость/пере-/недоэкспозицию (даже 0.01), отбрасывается. На практике почти ни один реальный кадр с вебкамеры не пройдёт
0.1 Очень строго: пройдёт только кадр с почти нулевыми дефектами
0.8 (регр. файл) Умеренно строго: кадр отбрасывается, если размытость/переэкспозиция > 80%
0.9 Слегка: отбрасываются только кадры с экстремально плохим качеством (> 90%)
1 Отключено: качество не проверяется, любой кадр проходит

«Смягчение» = увеличение значения; «затягивание» = уменьшение.

Пороги улыбки (liveness: этап «улыбка»)

ThresholdSmileAbsent, ThresholdSmilePresent

FaceSDK::IEmotionsClassifier (happiness) возвращает вероятность улыбки 0..1: 0 = совсем нет улыбки, 1 = максимально выраженная улыбка.

BSP использует гистерезис (два порога с «мёртвой зоной» между ними):

Состояние Условие
«Улыбки нет» вероятность ≤ ThresholdSmileAbsent
«Улыбка есть» вероятность ≥ ThresholdSmilePresent
Мёртвая зона между Absent и Present — ни то, ни другое

Пример из reg-файлов: Absent = 0.3, Present = 0.7:

  • вероятность 0.1 → «улыбки нет»
  • вероятность 0.5 → мёртвая зона (никакого действия)
  • вероятность 0.9 → «улыбка есть» → liveness-этап «улыбка» засчитан
Экстремумы Эффект
Absent = 0, Present = 1 Мёртвая зона почти вся шкала; улыбка засчитывается только при вероятности ≈ 1.0, а «нет улыбки» — только при ≈ 0.0. Liveness-этап «улыбка» практически невозможно пройти
Absent = 1, Present = 0 Полная инверсия: «улыбки нет» при любой вероятности < 1, «улыбка есть» при любой > 0. Liveness-этап засчитывается при малейшем намёке на улыбку
Absent = Present = 0.5 Мёртвая зона нулевая: резкий переключатель на 0.5

Пороги открытия/закрытия глаз (liveness: этап «моргание»)

ThresholdEyeOpened, ThresholdEyeClosed

FaceSDK::IEyesClosenessClassifier возвращает вероятность закрытости глаз 0..1: 0 = глаза полностью открыты, 1 = глаза полностью закрыты.

Аналогичный гистерезис:

Состояние Условие
«Глаза открыты» вероятность закрытости ≤ ThresholdEyeOpened
«Глаза закрыты» вероятность закрытости ≥ ThresholdEyeClosed

Пример из reg-файлов: Opened = 0.2, Closed = 0.7:

  • вероятность 0.1 → «открыты»
  • вероятность 0.5 → мёртвая зона
  • вероятность 0.9 → «закрыты» → liveness-этап «моргание» засчитан (открыто → закрыто → открыто)
Экстремумы Эффект
Opened = 0, Closed = 1 Глаза считаются «открытыми» только при вероятности 0.0, «закрытыми» только при 1.0. Моргание практически невозможно засчитать
Opened = 1, Closed = 0 Глаза «открыты» при любой вероятности < 1, «закрыты» при любой > 0. Моргание засчитывается при малейшем прищуре
Opened = Closed = 0.5 Резкий переключатель: ≤ 0.5 — открыты, ≥ 0.5 — закрыты

Известная проблема (из DA-2551): при прищуривании вероятность закрытости может быть довольно большой (превышает порог открытости), что усугубляется при небольшом размере лица (белки видны неидеально).

Порог равенства шаблонов (сравнение / верификация)

ThresholdEquality

FaceSDK::IMatcher::match возвращает score равенства 0..1: 0 = шаблоны совершенно разные (разные люди), 1 = шаблоны идентичны (один и тот же человек, идеально).

BSP считает верификацию успешной, если score ≥ порога.

Значение Эффект
0 Любое лицо проходит. Безопасность нулевая
0.7 (дефолт) Разработчик назвал «слишком мягко»: разные люди могут пройти
0.9 Строго: большинство людей, не являющихся владельцем, не пройдут
0.99 (reg-файл 3st) Очень строго: ложное совпадение маловероятно, но возможны ложные отказы
0.999999 Максимально строго: разработчик оценивал шанс ложного совпадения ~10⁻⁵…10⁻⁶, но предупреждал, что зависимость от шанса ошибки может быть нелинейной
1 Идеальное совпадение (на практике недостижимо — даже один и тот же человек в разных условиях даёт score < 1)

Из-за кеш-сервера этот параметр обязателен и на клиенте, и на сервере.

Доля кадра, занимаемая лицом (выбор лучшего кадра)

FaceFrameFractionX, FaceFrameFractionY

Не вероятность, а доля (fraction) ширины/высоты кадра, которую rect лица должен занимать минимально.

Значение Эффект (для кадра 640×480)
0 Минимальный размер не ограничивается (любой размер лица проходит)
0.1 (дефолт) Лицо должно быть ≥ 64×48 px
0.5 (reg-файлы) Лицо должно быть ≥ 320×240 px (половина кадра)
0.6 (обсуждалось) Лицо должно быть ≥ 384×288 px
1 Лицо должно занимать весь кадр (недостижимо на практике)

Действует только на этапе выбора лучшего кадра; на этапе liveness-проверки уже не накладывается. Накладывается вместе с FaceMinX/Y (абсолютные пиксели) — кадр отбрасывается, если хотя бы одно из ограничений не выполнено.

Сводная таблица: экстремумы 0 и 1

Параметр 0 (минимум) 1 (максимум)
ThresholdQuality* Отбрасываются все кадры (строже всего) Качество не проверяется (отключено)
ThresholdSmileAbsent «Нет улыбки» только при P=0 «Нет улыбки» при любой P<1 (почти всегда)
ThresholdSmilePresent «Улыбка» при любой P>0 (почти всегда) «Улыбка» только при P=1 (практически никогда)
ThresholdEyeOpened «Открыты» только при P=0 «Открыты» при любой P<1 (почти всегда)
ThresholdEyeClosed «Закрыты» при любой P>0 (почти всегда) «Закрыты» только при P=1 (практически никогда)
ThresholdEquality Любое лицо проходит Только идеальное совпадение (недостижимо)
FaceFrameFraction* Размер лица не ограничен Лицо должно занимать весь кадр

Для каждого float-параметра рекомендуется структура:

  1. Что измеряет (вероятность улыбки / закрытости глаз / размытости / score равенства / доля кадра).
  2. Диапазон: 0..1 (или градусы для углов).
  3. Направление: «выше = строже» или «выше = мягче» (у качества — выше = мягче; у остальных — выше = строже).
  4. Эффект 0 и 1 (что происходит на экстремумах).
  5. Рекомендуемые значения из reg-файлов (0.2/0.3/0.7/0.8/0.99) с пометкой «выбраны под стандартную веб-камеру ноутбука с HD-разрешением».
  6. Оговорка: зашитые дефолты (константы Settings.h BSP) в локальных источниках не раскрываются (исходники в старом SVN), приводить их без сверки с разработчиком не стоит.
(3 голос(а))
Эта статья полезна
Эта статья бесполезна