Детектор посмішок

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

Я вважаю себе ще не дуже старим, аби вивчати щось нове і цьогоріч на Різдво я подарував собі платку з MAX78000 аби мотивувати себе оволодіти машинним навчанням (спойлер: це не найкращий спосіб).

Цей мікроконтроллер має CNN прискорювач. Оскільки значення абревіатури CNN на той момент я не знав, я пішов на курсеру слухати спеціалізацію Deep Learning. Перші три курси були ріденькі, а от останні два були цікаві. Це в мене зайняло трохи більше місяця часу, але дало змогу зрозуміти робочий жаргон своїх колег.

Коли руки дійшли до заліза, то виявилось, що все трохи складніше. Принципова відмінність від моделей, що виконуються на комп'ютері є обчислювальні можливості і пам'ять мікроконтроллера. В принципі нейронну мережу можна запустити і на Arduino, але час обрахунку буде великим, як і споживання (що не припустимо для модерних, переносних девайсів) і до того ж обмеження по пам'яті ніхто не відміняв. MAX78000 має ж оптимізований CNN прискорювач з 64 паралельними risc-v 8 бітними процесорами. Крім того, на борту є Cortex-M4F, 32-bit RISC-V та купа інших смаколиків.

Розробка нейронних мереж для цього мікроконтроллера має ряд обмежень, а отже і певний ритуал розробки, який варто дотримуватись. Спершу я рекомендує ознайомитись з readme. Там 99% всієї потрібної інформації. Загалом процедура розробки є наступною:

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

  1. Класифікатор. Один такий приклад буде розглянуто нижче. Загалом досить поширена задача.
  2. FaceID. На вхідні двері я б не ставив цю штуку, але цікаво що такий маленький мікроконтроллер може вирішувати цю задачу
  3. Keyword spotter. МК працює не тільки зі зображеннями, але і зі звуком і досить ефективно. Отже і рухи з акселерометром теж зможе розрізняти.
  4. UNet. Це тип мережі, що використовується для сегментації зображень на зони. Наприклад, зона дороги, інша машина, пішохід, дерево. Вперше застосувалась для виявлення раку в медичних зображеннях.

Папка з прикладами містить чимало імплементованих мереж і тому мінімальні рухи потрібно для переробки (перетренування) мережі під свою потребу. Я вирішив зробити детектор посмішок. Для цього я перетренував cats vs dogs приклад. Загалом процес описаний тут.

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

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

#!/bin/sh
python train.py --epochs 300 --optimizer Adam --lr 0.001 --batch-size 32 --deterministic --compress policies/schedule-catsdogs.yaml --model ai85cdnet --dataset ihappy --confusion --param-hist --embedding --device MAX78000 "$@"
Типовий вивід після завершення тренування. Зверніть увагу на loss & consufion matrix

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

#!/bin/sh
python quantize.py trained/qat_best_ihappy.pth.tar trained/ai85-ihappy-qat8-q.pth.tar --device MAX78000 -v "$@"
Вивід терміналу після успішного округлення

Очікувано, що після округлення модель втратить частину ефективності. Це можна оцінити наступною командою в training директорії.

#!/bin/sh
python train.py --model ai85cdnet --dataset ihappy --confusion --evaluate --batch-size 32 --exp-load-weights-from ../ai8x-synthesis/trained/ai85-ihappy-qat8-q.pth.tar -8 --device MAX78000 "$@"
Оцінка моделі після округлення. Втрата (loss) дещо зросла

Фінальний етап цієї частини це генерування С коду, який можна втавити в проект. Це робиться наступної командою в директорії синтезу. Ключ --fifo тут є ключовим, хоч він і відсутній у прикладі генерації (це в мене забрало трохи часу).

#!/bin/sh
DEVICE="MAX78000"
TARGET="sdk/Examples/$DEVICE/CNN"
COMMON_ARGS="--device $DEVICE --compact-data --mexpress --timer 0 --display-checkpoint --verbose"


python ai8xize.py --test-dir $TARGET --prefix ihappy --checkpoint-file trained/ai85-ihappy-qat8-q.pth.tar --config-file networks/cats-dogs-chw.yaml --softmax --fifo $COMMON_ARGS "$@" --board-name FTHR_RevA --overwrite

Фінальний проект я отримав шляхом копіювання генерованих cnn.h, cnn.c, weights.h та logs у модифіковиний cats-dogs_demo. У цьому демо використовується камера і нейтронна мережа, що мені значно спрощує життя.

Далі йде make компіляція і завантаження. Детальніше читай тут. Я повністю працюю під убунту. Дебагер можна запустити командою

openocd -f interface/cmsis-dap.cfg -f target/max78000.cfg -s/home/kvital/MaximSDK/Tools/OpenOCD/scripts

а далі все так само як на віндоус.

Результат виводиться в термінал і на світлодіоди. Оскільки вони на тій самій стороні, що і камера, то я дублював світлодіод аби показати роботу плати зі своїми гримасами.

Червоний світлодіод сигналізує посмішку

Врешті виникає логічне запитання -- навіщо мені ця дурниця? Відповідь проста -- детектор посмішок є ключовою частиною машини щастя. Ця машина є вкрай необхідною у ці складні часи. Її принцип роботи є наступний: коли людина нещасна, то вона не посміхається, тоді детектор це бачить і через петлю зворотнього зв'язку у кілька кіловольт надсилає людині сигнал, що варто посміхатись.

Хіба можуть бути нещасними усміхнені люди?

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *