Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Як працює детектор виразу обличчя в мобільному додатку — реалізація проєкту від 0 до готового рішення

Усі статті, обговорення, новини про Mobile — в одному місці. Підписуйтеся на телеграм-канал!

Привіт! Я Віталій Шевчук, і разом з Володимиром Ковенко, колегою з компанії LOOQME, ми підготували цикл матеріалів про роботу ML-моделей з даними. До цього ми опублікували першу та другу частини наших досліджень.

Сьогодні ж розповімо про реалізацію ідеї з computer vision від старту до готового рішення. А саме — про pet проєкт для визначення виразу обличчя. Остаточний продукт працює on edge майже в реальному часі. Стаття покриває деякі особливості збору й обробки даних для CV.

Опис задачі та постановка цілей

Почнемо з постановки задачі, у цьому нам допоможе Пол Екман, найвідоміший своєю роботою з людськими емоціями. Його теорія полягає в тому, що всі емоції та відповідні вирази обличчя не є наслідком культури та цивілізації, а універсальні та однакові для абсолютно всіх людей. В описі його базової роботи налічуються такі емоції як: здивування, сум, радість, відраза, гнів, страх. Ми додали ще два вирази обличчя — нейтральний і ахеґао.

Наш новий набір даних є унікальним, адже міксує біологічні вирази облич з навіяними інтернет-культурою. Думаю варто наголосити, що всі дослідження проводилися виключно у наукових цілях. І назва проєкту: O+ahega = ahega+o.

Ціль проєкту — прокачати навички створення data science продукту, починаючи від пошуку даних, їх обробки й нормалізації, та закінчуючи тренуванням алгоритмів машинного навчання й створенням фінального продукту. Основною ідеєю додатка було розпізнавання емоцій й детекція людських тіл й облич. Загалом ми визначили для себе наступні фічі, які хочемо реалізувати:

  1. Детекція людини та обличчя.
  2. Визначення виразу обличчя.
  3. Визначення віку. (Ми не говоримо про це в статті, тому що було вирішено прибрати цю модель з остаточного рішення через незадовільну точність.)
  4. Модель повинна використовуватися в мобільному додатку, а передбачення повинні працювати у режимі «near real time».

Збір, розмітка та обробка датасету

Зважаючи на описані фічі, було зібрано два набори даних:

  • для детекції людей та облич;
  • для класифікації виразу обличчя.

Для першого було використано WIDER FACE та автоматизовано процес анотування даних за допомогою автоматичної розмітки, як це показано на рисунку.

Для локалізації об’єктів було застосовано модель Yolo V3, натреновану на WIDER FACE, та Yolo V3, натреновану на COCO. У результаті ми отримали датасет з двома лейблами: обличчя і тіло.

Для другого процес був складнішим. Ми знайшли FER датасет. Головна проблема датасету полягала у тому, що він був поданий у чорно-білому кольорі. Інша — що датасет не містив усіх потрібних нам емоцій. Два аспекти змусили нас зібрати новий набір даних:

  • проблема коваріантних зсувів через зображення з емоцією «ахеґао»;
  • невизначеність емоцій та низька якість зображень.

Для цього було використано наступні джерела:

  1. YouTube → відео.
  2. Instagram → фото.
  3. Pornhub → відео.
  4. AffectNet → фото.

Детальніше по кожному з пунктів:
1. AffectNet має найгіршу якість розмітки. Дані поділяються на дві категорії: проанотовані людьми й проанотовані автоматично. Ми використовували лише ті, що були проанотовані людьми й виправляли помилкові анотації.
2. Pornhub використовували для пошуку емоції ахеґао. Знайшли близько десятка відео з нарізками з Instagram, які наповнили 80% інформації для цього класу.
3. Instagram за відповідними хештегами дав непогану варіативність по всім класам, найбільше — по ахеґао та по емоції радості.
4. YouTube був використаний для пошуку емоційних відео. Наприклад, шукали відео за запитами «sad people», «happy thing», «birthday», «interview after tragedy», «surprise», etc.

Важливо наголосити на процесі нормалізації облич щодо їхнього положення. Процес полягав у тому, що якщо зображення включало повернене обличчя, воно нормалізувалося наступним чином:

Створений алгоритм оптимізації є стійкішим до різних виразів обличчя, адже базується не лише на позиції очей, а й на позиції носа.

Нормалізація облич була використана під час початкової обробки тренувальних даних й у прототипі додатка на ПК (більше інформації є тут).

Загальний пайплайн був схожим до вже описаного під час роботи над даними для детекції людей та облич:

Дані були проанотовані мануально, в результаті чого було отримано наступний датасет:

Якщо ви хочете побачити датасет «зсередини» через проєкцію ембедінгів зображень, tensorflow projector допоможе в цьому:

Зібрані дані мали наступний розподіл:

Наскільки видно з графіку, зображеного вище, зібраний набір даних є незбалансованим. Це може призвести до проблеми перенавчання. Аби уникнути цієї проблеми, було використано ваги для незбалансованих класів.

Основна ідея полягає у тому, що функція втрат матиме додатковий множник, який відповідає за вагу окремого класу. Ті класи, що мають невелику кількість зображень відносно інших, матимуть більшу вагу. Таким чином алгоритм надаватиме більше уваги правильному розпізнаванню тих класів, що мають менше зображень.

Іншою важливою річчю є використання аугментації даних. Хоча проблема нормалізації облич була вирішена на рівні обробки даних, проблема віддаленості все ще залишалася. Для її вирішення було використано аугментації даних, а саме випадкове масштабування лиця, як показано на малюнку нижче:

Пайплайн та архітектура

У паплайні варто звернути увагу, що це — moving average за фреймами. Якщо не накласти фільтр за попередніми емоціями, то кінцевий користувач буде отримувати надзвичайно різні передбачення емоцій, наприклад:

  1. Без застосування moving average: sad, neutral, sad, happy, sad, angry... Проте юзер зображував тільки sad. Це станеться, тому що мережа чутлива до освітлення та інших динамічних факторів, які складно врахувати при тренуванні.
  2. Із застосуванням moving average: sad, sad, sad, sad, sad, sad... Оскільки результатом є усереднені передбачення моделі на декількох фреймах, що робить її менш чутливою до описаних ефектів.

Щодо моделі локалізації людей й облич було використано SSD MobileNetV1.

Human baseline та наші результати

Ми орієнтувалися на дані з різних джерел по тому, як добре люди розмічають кожну з емоцій.

Наші результати за тренуваннями:

Висновок

Що ж, ми почали з NLP, продовжили рекомендаціями та завершили CV. На прикладах побачили, які трансформації проходять дані в залежності від сфери застосування.

Узагальнюючи, можна сказати, що у всіх проєктах найбільша частина часу приділялася саме даним, їхній трансформації та застосуванню похідних від цих даних у різні форми для покращень як моделі, так і системи в цілому.

Ми вирішили багато проблем, включно з data drift. Працювали в парадигмі data-centric AI, шукали помилки за допомогою EAI, знаходити та генерували додаткові дані для моделей, застосовували аугментації зображень та ефективну вибірку за метаданими, впоралися з незбалансованістю даних, які були в кожному проєкті.

Щоб перевірити роботу наших моделей, можна скористатись наступними джерелами: онлайн є увесь датасет (потрібно логінитись), а мобільний додаток Oahega — Emotion detector наразі доступний для Android.

Додаткові корисні лінки, які стали нам у пригоді:

  1. YoloV3 original paper
  2. MobilenetV1 original paper
  3. SSD (Single shot MultiBox detector) original paper
  4. Tensorflow object detection zoo
  5. Knowledge distillation original paper
  6. Age-gender model repository
  7. Tensorflow object_detection Android
  8. Tensorflow image_classification Android
  9. Tool used for management
👍ПодобаєтьсяСподобалось8
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А можете закачати для перевірки датасет із порнухи? Завдання — відрізнити штучну міміку від справжньої емоції. Якщо цей бар′єр не пройдете, то прога залишиться одноразовою, погралися та й забули.

якщо зможеш зробити такий датасет, думаю він буде популярним)

Підписатись на коментарі