Користувач дивиться відеоурок, а додаток не бачить його усмішку — емоційна аналітика в edtech втрачає до 40% даних через погане освітлення та часткову оклюзію. Ми вирішили це завдання для клієнта за допомогою гібридного підходу: геометричні дескриптори плюс тимчасова агрегація. Інтеграція розпізнавання емоцій за обличчям у мобільні додатки включає детекцію обличчя, вилучення мімічних ознак та класифікацію за базовими емоціями (happiness, sadness, anger, surprise, fear, disgust, neutral за моделлю Екмана). Наш досвід — понад 5 років і 30+ інтеграцій CV для edtech, ритейлу та реклами.
Як працює розпізнавання емоцій за обличчям у мобільному додатку
На iOS: VNDetectFaceLandmarksRequest та CoreML — реалізація розпізнавання емоцій
VNDetectFaceLandmarksRequest видає 76 landmarks. Цього достатньо для геометричних дескрипторів: відстань куточків губ, ступінь відкриття очей, кут брів. Поверх них навчаємо невелику CoreML-модель (MLP 3–4 шари). Такий підхід стабільніший за пряму CNN при поганому освітленні, оскільки landmarks нормалізовані під положення голови.
На Android: ML Kit Face Detection
setContourDetectionEnabled(true) дає 468 точок — повний контур обличчя. Це надмірно для емоцій, але дозволяє точніше відстежувати мімічні м'язи. Ми використовуємо subset landmarks для прискорення.
Кроссплатформена альтернатива: MediaPipe Face Landmarker
MediaPipe видає 478 landmarks + 52 blendshapes (наприклад, mouthSmileLeft, eyeBlinkRight). Blendshapes — готові семантичні дескриптори, які можна подавати безпосередньо в класифікатор. Латентність на Pixel 7 — ~15 ms. MediaPipe Face Landmarker працює в 2–3 рази швидше за ML Kit у режимі контуру, що критично для анімації реакції.
| Платформа | Інструмент | Кількість точок | Особливості |
|---|---|---|---|
| iOS | VNDetectFaceLandmarksRequest | 76 | Працює з CoreML, нормалізація пози |
| Android | ML Kit Face Detection | 468 | Контур обличчя, простий в інтеграції |
| Кроссплатформа | MediaPipe Face Landmarker | 478 + 52 blendshapes | Висока швидкість, готові семантичні ознаки |
Чому on-device моделі точніші в реальних умовах?
Готові моделі (HSEmotion TFLite, MobileNet FER2013) на валідації 7 класів дають 65–72%, у реальності — нижче. Це не баг, а обмеження: «нейтральне» та «задумливе» вираження важко розрізнити. Ми вирішуємо проблему двома способами:
- Усереднення за часове вікно 2–5 секунд. Замість класифікації кожного кадру працюємо з відсотком часу позитивної/нейтральної емоції та піками здивування.
- Фільтрація артефактів. Наприклад, низький confidence детекції обличчя (менше 0.5) відкидається, кадри з частковою оклюзією (рука, окуляри) не беруть участі в агрегації.
Порівняння точності різних підходів:
| Підхід | Точність (7 класів) | Латентність | Вимоги до даних |
|---|---|---|---|
| Готова CNN (MobileNet FER2013) | 65–72% | ~5 ms | Тільки картинка |
| Геометричні дескриптори + MLP | 70–78% на валідації | ~2 ms | Need landmarks |
| Тимчасова агрегація + фільтрація | Стабільність у реальних умовах | Дод. ~0 ms | Агрегація 2–5 с |
Навіщо потрібна анімація реакції та як її реалізувати?
Якщо додаток реагує на емоцію користувача (маскот в edtech, інтерактивний персонаж), критична latency. Цикл захоплення → інференс → оновлення анімації повинен вкладатися в 100 ms, інакше реакція сприймається як запізніла.
На iOS використовуємо SwiftUI + withAnimation(.spring()) для плавного переходу стану маскота. Інференс на background queue, результат через @Published в @StateObject на main actor. На Android — Animator + MotionLayout для складних переходів.
Кейс: реакція маскота на усмішку дитини
Освітній додаток для дітей. Персонаж танцює, якщо усмішка утримується >1.5 секунди. Використали MediaPipe Face Landmarker + blendshape mouthSmileLeft/Right > 0.6 як тригер. Проблема: дитина сміється з відкритим ротом — mouthOpen збивав фільтр. Додали умову: mouthSmile > 0.6 AND mouthOpen < 0.4 OR (mouthOpen > 0.4 AND jawOpen > 0.3). Хибних спрацювань стало на 40% менше.
Як впровадити розпізнавання емоцій: покрокова інструкція
- Аудит стеку — визначаємо, які технології вже є (камера, ML-фреймворки).
- Вибір підходу — iOS/Android/кроссплатформа, вибір фреймворку та моделі.
- Інтеграція детектора — підключення VNDetectFaceLandmarksRequest, ML Kit або MediaPipe.
- Калібрування класифікатора — налаштування порогів та часового вікна.
- Розробка анімації — зв'язок емоцій з діями персонажа.
- Тестування на пристроях — мінімум 5 моделей, оцінка точності та latency.
- Запуск аналітики — агрегація emotion scores, дашборд залученості.
Що дає аналітика залученості?
Для A/B-тестування контенту агрегуємо emotion scores по сесії. Дані — тільки числові вектори, не фото. Згода користувача — через явний opt-in (емоції відносяться до чутливих даних). Відправляємо в будь-яку аналітичну систему (Firebase, Amplitude, Яндекс.Метрика) через batch-запити раз на 10 секунд, щоб не витрачати трафік. Вартість впровадження аналітики залежить від складності інтеграції.
Технічні деталі фільтрації артефактів
Для покращення якості в реальних умовах ми застосовуємо каскад фільтрів: відкидаємо кадри з confidence < 0.5, видаляємо дублікати за часовою міткою, згладжуємо emotion scores ковзним середнім (вікно 5 кадрів). Це підвищує точність агрегованих метрик на 15–20%.Що входить в роботу
- Аналіз стеку та консультація щодо оптимального підходу — безкоштовно.
- Інтеграція детектора обличчя та класифікатора емоцій під ключ.
- Кастомізація моделі на вашому датасеті (якщо потрібна висока точність під конкретний сценарій).
- Розробка анімації реакції (маскот, інтерфейсні ефекти).
- Налаштування аналітики залученості з дашбордом.
- Тестування на реальних пристроях — мінімум 5 моделей для кожного форм-фактора.
- Документація та доступ до вихідного коду, моделі та конфігурацій.
Терміни та вартість
Базова інтеграція (детектор + класифікатор + анімація) — 1–2 тижні. Якщо потрібна аналітична панель — ще 1 тиждень. Вартість розраховується індивідуально, залежно від стеку та вимог. Отримайте консультацію щодо впровадження розпізнавання емоцій у ваш мобільний додаток — зв'яжіться з нами. Замовте впровадження вже сьогодні, щоб підвищити залученість користувачів.







