|
Изменение количества проверок с Tevian Provider
Автор Maksim Efanov, Last modified by Dmitry Bukreev на 22 сентября 2026 11:12 AM
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Вопрос: Диапазоны значений и смысл параметров ключа
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Параметр | Тип | Диапазон | Значение |
|---|---|---|---|
| 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-параметра рекомендуется структура:
- Что измеряет (вероятность улыбки / закрытости глаз / размытости / score равенства / доля кадра).
- Диапазон: 0..1 (или градусы для углов).
- Направление: «выше = строже» или «выше = мягче» (у качества — выше = мягче; у остальных — выше = строже).
- Эффект 0 и 1 (что происходит на экстремумах).
- Рекомендуемые значения из reg-файлов (0.2/0.3/0.7/0.8/0.99) с пометкой «выбраны под стандартную веб-камеру ноутбука с HD-разрешением».
- Оговорка: зашитые дефолты (константы Settings.h BSP) в локальных источниках не раскрываются (исходники в старом SVN), приводить их без сверки с разработчиком не стоит.