Як побудувати детектор маски для обличчя за допомогою Jetson Nano 2GB та AlwaysAI

Як побудувати детектор маски для обличчя за допомогою Jetson Nano 2GB та AlwaysAI

Це було захоплююче, коли Nvidia оголосила про нову низьку ціну на свої розробницькі версії - Jetson Nano на 2 Гб за 59 доларів. Я великий шанувальник лінійки продуктів Jetson, і дуже дивно, скільки програмного забезпечення працює на них. Однак, переглянувши версію на 4 Гб, версію AGX та саморобку Jetbot, я не хотів просто запускати стандартні демонстраційні програми та щось писати. Я вирішив вирішити завдання побудови датчика маски для обличчя «зроби сам» та підключити до набору червоних, зелених та синіх світлофорів.

Проект, як і багато інших, мав багато поворотів, а також доклав приблизно 10-кратних зусиль, на які я сподівався. Але врешті-решт це спрацювало. Для тих, хто цікавиться, що можливо з бюджетом менше 200 доларів, ось що я зробив.

Необхідне обладнання, особливо вражаючі світлофори

Для початку вам знадобиться Jetson Nano (або щось подібне, яке можна використовувати таким же чином). Я використовував новітню і найменш дорогу модель, але будь-який інший Jetson також повинен працювати. Тоді, звичайно, потрібна камера. Камера USB, як веб-камера, ідеально підходить. Або підключена стрічкою камера, така як камера Raspberry Pi. Я впевнений, що ви також можете використовувати потік камер на основі IP, але я не спробував.

Для виходу в більшості веб-проектів "Направи сам" для Nano використовуються деякі крихітні крихітні світлодіоди. Це не здавалося гідним wfoojjaec, тому я вирішив піти більше. Виявляється, використані світлофори - так, ті, які ви бачите на перехрестях - досить легко знайти на eBay. Я купив набір 12-дюймових вогнів червоного, зеленого та жовтого кольорів, які були скасовані з системи Арізонське шосе - доставка була найдорожчою частиною.

Світлофори, на жаль для наших цілей, побудовані для роботи на 120 вольт. Це тому, що, незважаючи на те, що вони є світлодіодними, вони призначені для заміни штекера на традиційні лампи. Це означало або операцію на них, щоб обійти трансформатор, або вимкнення та ввімкнення 120 В. Оскільки світлофори ретельно проклеєні та герметично закриті, я зупинив свій вибір на останньому. Я вже мав два розумні штекери TP-Link / Kasa, тому мені потрібен був ще один. Що стосується апаратного забезпечення, то на цьому етапі вам варто піти, крім розробки системи кріплення для ліхтарів (я все ще працюю над цим), і, можливо, силової стрічки.

Створення нейронної мережі для виявлення маски для обличчя

Як це часто буває, апаратне забезпечення було найпростішою частиною. Моя ідея нейронної мережі, що виявляє маски, полягала в тому, щоб почати з моделі виявлення обличчя, що виявляє обличчя, яка була навчена ідентифікувати обличчя та їхні обмежувальні рамки в різних сценах. Потім я б пройшов додатковий тренінг (він ще називається трансферне навчання), щоб навчити його вирішувати, чи носять ці обличчя маски. В принципі, це не повинно бути надскладним, тим більше, що саме для цієї мети Nvidia має спеціально створений Набір інструментів навчання переносу (TLT). Однак це закінчилося найбільш трудомісткою частиною проекту.

Крок 1: Створення наборів даних, що використовуються

Сумна правда щодо гламурно звучачих проектів ШІ полягає в тому, що основна частина зусиль часто здається буденним збором даних та форматуванням. У випадку з масками існує ряд наборів даних, всі в різних форматах. Я вибрав набір даних про медичну маску та набір даних для обличчя без маски (MAFA та FDDB) для використання в навчанні. На щастя, в Інтернеті був якийсь хороший код Python, який допоміг мені перевести їх у два потрібні формати (KITTI для інструментарію для перенесення Nvidia та Pascal VOC для AlwaysAI). Одне прикрі речі, з якими я зіткнувся, це те, що деякі обмежувальні поля в наборах даних вийшли за межі зображення минулого, де код повторного навчання Tensorflow від Nvidia був готовий мати з ними справу. Отже, це означало більше коду Python, щоб знову обробити дані та обрізати обмежувальні поля, що вказували розташування граней. Я накрутив близько 1000 осіб у масках та без масок. Для більш серйозного проекту мені точно потрібно було б додати трохи більше навчальних даних.

Крок 2: Використання трансферного навчання для створення моделі маски / без маски

На початку проекту я думав, що використання TLT від Nvidia буде плавним плаванням. На жаль, коли я заглибився в деталі, то зрозумів, що цього не буде. Він працює лише на Linux і для навчання вимагає графічний процесор Nvidia. WSL 2 розпочав деяку обмежену підтримку графічних процесорів, але в цьому випадку це не спрацювало. І мій хмарний сервер Paperspace, який я часто використовую для тренувань, не підтримує нову версію драйверів Nvidia, яка потрібна TLT. Тож я завантажив Ubuntu на своєму старому ноутбуці, думаючи, що нарешті знайду рішення. Але 750M графічний процесор на ньому не підтримується TLT. Врешті-решт, я подивився, як провести перенавчання сам, а потім завантажити його в TLT для обрізки та розгортання, але це не підтримується. Він працює лише з певними базовими моделями, що надаються компанією Nvidia.

Як побудувати детектор маски для обличчя за допомогою Jetson Nano 2GB та AlwaysAI
Як побудувати детектор маски для обличчя за допомогою Jetson Nano 2GB та AlwaysAI
Як побудувати детектор маски для обличчя за допомогою Jetson Nano 2GB та AlwaysAI

На щастя, нещодавно я познайомився з AlwaysAI, який пропонує основи для розробки та виконання для проектів із зоровим інтелектуальним інтелектом. Вони збиралися випустити версію свого продукту, яка підтримувала додаткове навчання та розгортання моделей на пристроях, включаючи Nano. Тож я перетворив свої дані з KITTI у необхідний формат Pascal VOC та спробував. Я зіткнувся з парою невеликих збоїв, але їх підтримка була чудовою, і я провів правильний шлях до налаштування необхідного середовища Docker плюс Python та використання інтерфейсу командного рядка. Тепер у мене була робоча модель, яку я бачив як працює.

Крок 3: Управління світлофорами

Легко було вирішити, що хорошим способом управління освітленням будуть мої розумні штекери Kasa, тим більше, що для них була гладка маленька обгортка Python. Тут теж була проблема, оскільки для бібліотеки Kasa потрібен Python 3.7, а для образу Docker AlwaysAI - 3.6. Як відомо кожному, хто використовує Docker, видавати команди поза контейнером нетривіально. Я намагався обійти це, використовуючи ssh назад на ту ж машину, але жодне з обхідних шляхів уникнення запиту пароля для кожної команди не працювало для мене. Тому я створив невеликий веб-сервер (тривіальний у Python), який аналізував отримані команди та пересилав їх до системи. Потім я використовував curl з мого додатка для надсилання команд. Це вдалось чудово, хоча і з невеликою затримкою. Корисно, але люди з AlwaysAI тим часом знайшли мені обхідний шлях, тож я мав два рішення!

Ось детектор маски для обличчя в дії:

Запуск детектора маски

Я почав з базової моделі, яку навчили розпізнавати обличчя на відстані, тому я сподівався, що мій детектор маски також буде працювати на відстані - наприклад, люди, що підходять до нашого будинку. Однак, можливо, через те, що багато моїх додаткових навчальних зображень були крупними планами, або, можливо, тому, що я використовую стару веб-камеру, вона не виявила багато чого, поки людина не знаходилася на відстані декількох футів. Можливо, достатньо діапазону для дзвіночної камери, але не для великої кімнати. Дотепер я не турбувався про те, щоб додавати вишукані таймери та кілька станів до свого коду, тому він просто відображається жовтим, поки не виявить незамасковане обличчя - коли воно червоне - або замасковане обличчя - коли воно відображається зеленим. AlwaysAI зробив базовий код досить простим. Нижче наведено весь цикл обробки кадру. Функція doit () - це та, про яку я писав, яка видає команди curl міні-веб-серверу:

Навіть на $ 59 Nano модель змогла проаналізувати кадр менш ніж за 10/10 секунди, надаючи йому загальну частоту кадрів близько 12 кадрів в секунду. Досить для цього додатка. Загалом, окрім не запланованого «навчального досвіду» необхідності випробовувати кілька підходів на кожному кроці, це показує, що можливо завдяки мінімальному обладнанню та готовому вільному програмному забезпеченню (AlwaysAI наразі є безкоштовним, хоча в майбутньому вони будуть платити за комерційні проекти, а весь інший код, який я використовував, є безкоштовним для особистого користування).

Читати далі

Детектор гравітаційної хвилі LIGO тепер більш потужний, ніж коли-небудь
Детектор гравітаційної хвилі LIGO тепер більш потужний, ніж коли-небудь

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