Пишемо веб-додаток для розпізнавання осіб за годину
Розповідає Деван Сабаратнам, розробник з 30-річним стажем
У минулі вихідні, гортаючи Amazon Web Services, я помітив новий сервіс під назвою «Rekognition». Я припустив, що це помилка (recognition - англ. Розпізнавання), але вона привернула мою увагу. Я зацікавився: що це за сервіс? Amazon звик додавати нові сервіси в свою платформу з лякаючою регулярністю, і цей я пропустив.
Раніше я займався технологією розпізнавання осіб, використовуючи сторонні бібліотеки, а також Microsoft Face API. але всі спроби створення подібного програми не увінчалися успіхом. Але, переглядаючи документацію «Rekognition», я зрозумів, що AWS API насправді дуже простий у використанні. Я негайно взявся за роботу.
Мені була потрібна проста веб-сторінка, яка дозволила б робити фотографію за допомогою камери мого iMac і виконувати розпізнавання на фотографії. Зокрема, я хотів би визначати користувача, який сидить перед комп'ютером.
Сервіс Amazon Rekognition дозволяє створювати одну або кілька колекцій. Колекція - це набір лицьових векторів для фотографій, які ви хочете зберегти.
Примітка: Сервіс записує не фотографії, а їх JSON-уявлення.
Після створення колекції ви можете сфотографувати предмет, порівняти його властивості c збереженими і повернути найближчим відповідність. Звучить просто, чи не так? По правді кажучи, розробка фронтенда веб-сторінки для отримання даних з камери зайняла більше часу, ніж написання бекенд для розпізнавання.
Загалом, веб-сторінка дозволяє створювати або видаляти колекцію лицьових даних на Amazon, завантажувати нові дані, отримані з фотографії, в свою колекцію і порівнювати нові фотографії з існуючою колекцією, щоб знайти збіг. А в якості додаткової фичи я також додав в цю демку службу Amazon Polly. щоб після розпізнавання фотографії сторінка вітала користувача.
Для бекенд я використовував Ruby-бібліотеку Sinatra. яка може виконувати всю важку роботу за допомогою AWS. Я часто використовував Sinatra (насправді Padrino) в своїх проектах і настійно рекомендую цю платформу.
Примітка: Amazon Rekognition пропонує спочатку завантажувати вихідні фотографії, які використовує його API, в Amazon S3, а потім обробляти їх. Я хотів уникнути цього непотрібного кроку і замість цього відправляти зображення безпосередньо в API, що мені в підсумку вдалося зробити.
Я зумів зробити те ж саме з їх привітанням Polly. Замість того, щоб зберігати аудіо в MP3-файл і програвати його, у мене вийшло закодувати дані MP3 безпосередньо в тег
Я розмістив весь код цього проекту на моїй сторінці на GitHub. Не соромтеся використовувати і змінювати його. Нижче я постараюся пояснити код більш докладно.
пишемо додаток
Створення користувача AWS IAM
Як тільки ви створили обліковий запис AWS, перше, що нам потрібно зробити, - створити користувача Amazon IAM (Identity Access Management), який має права на використання служби Rekognition. Ми також поставимо права для Amazon Polly.
В консолі Amazon натисніть на кнопку «Сервіси» у верхньому лівому кутку, потім виберіть «IAM». В меню зліва виберіть «Користувачі». Ви повинні побачити список існуючих користувачів IAM, яких ви створили в консолі, якщо ви робили це в минулому.
Натисніть кнопку «Додати користувача», розташовану у верхній частині списку, щоб додати нового користувача IAM.
Дайте користувачеві ім'я і переконайтеся, що ви відзначили пункт «Programmatic Access», так як ви будете використовувати цей IAM у виклику API.
Далі наведені настройки дозволів. Переконайтеся, що ви натискаєте на третьому квадратику на екрані з написом «Attach existing policies directly». Потім в поле пошуку «Filter: Policy Type» введіть «rekognition». Виберіть «AmazonRekognitionFullAccess» зі списку, поставивши поруч з ним галочку.
Потім змініть фільтр пошуку на «polly» і помістіть галочку поруч з «AmazonPollyFullAccess».
Тепер у цього IAM є права, достатні для Amazon Rekognition і Amazon Polly. Натисніть «Next: Review» в правому нижньому кутку.
Ця сторінка важлива. Запишіть ключі AWS Key і AWS Secret, які ви вказали на цій сторінці, оскільки нам необхідно включити їх в наше додаток нижче.
Це єдиний раз, коли вам будуть показані ці ключі, тому збережіть їх і файл CSV з цієї сторінки в надійному місці.
Завантаження коду
Тепер завантажте приклад коду з моєї сторінки GitHub. щоб ви могли змінити його в міру необхідності. Завантажте код у вигляді ZIP-файлу, або клонують його в вашу робочу папку.
Перше, що вам потрібно зробити, - це створити файл з ім'ям .env в робочій папці і ввести ці два рядки, замінивши в них ключі Amazon IAM на свої:
користування програмою
Сама веб-сторінка досить проста. Ви повинні побачити потокове зображення у верхній частині екрану, яке представляє собою канал з вашої веб-камери.
Спершу створіть колекцію, клацнувши по посиланню в самому нижньому лівому кутку сторінки. Це створить порожню колекцію на серверах Amazon для зберігання ваших зображень. Зверніть увагу: ім'я за замовчуванням для цієї колекції - faceapp_test. але ви можете змінити його в коді faceapp.rb (рядок 17).
Після того, як ви створили кілька осіб у своїй базі даних, ви можете попросити випадкову людину сісти перед камерою і натиснути «Порівняти зображення». Якщо ця людина вже доданий в колекцію, на екрані має з'явитися його ім'я.
Зверніть увагу, що звичайний спосіб роботи Amazon Rekognition полягає в тому, щоб завантажувати фотографію в Amazon S3 Bucket, а потім обробляти його звідти, але я хотів обійти цей крок і фактично відправити дані фотографії безпосередньо в Rekognition як потік байтів, закодований в Base64. На щастя, aws-sdk для Ruby дозволяє використовувати обидва методи.
Розбір коду
Перш за все, давайте поглянемо на HTML-сторінку:
Це налаштовує бібліотеку JPEG Camera, щоб відображати канал на екрані і обробляти завантаження зображень.
Функція add_to_collection () захоплює зображення з камери, а потім виконує запис в кінцеву точку / upload разом з ім'ям користувача в якості параметра. Функція перевіряє, чи дійсно ви ввели ім'я, яке потрібно в якості унікального ідентифікатора цих даних.
Функція завантаження перевіряє виклик і виводить повідомлення про успішне завершення або помилку.
Функція compare_image () викликається, коли ви натискаєте кнопку «Порівняти зображення». Вона захоплює кадр з камери і передає POST-дані в / compare. Ця кінцева точка поверне або помилку, або структуру JSON, що містить id (ім'я) знайденого особи, а також відсоток схожості.
Якщо особа співпаде з даними з колекції, функція відправить ім'я знайденого особи в / speech. Ця кінцева точка викликає службу Amazon Polly, щоб перетворити вітання в файл MP3, який можна відтворити користувачеві.
Служба Amazon Polly повертає вітання у вигляді бінарного потоку MP3, тому ми беремо цей потік введення-виведення, шифруємо його в форматі Base64 і поміщаємо в якості закодованої вихідної посилання в теги
Прим. перев. Ви можете дізнатися про Web Audio побільше, прочитавши нашу серію статей по цій темі.
Нарешті, в JS-файлі додатки є функція greetingTime (). Вона вирішує, чи варто говорити «доброго ранку / день / вечір» в залежності від часу доби користувача.
Тепер поглянемо на код Ruby: