Node.js + face-recognition.js: простое и надёжное распознавание лиц с помощью глубокого обучения |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-03-20 11:10 реализация нейронной сети, распознавание образов, искусственный интеллект, алгоритмы машинного обучения Перевод статьи Node.js + face-recognition.js: Simple and Robust Face Recognition using Deep Learning.
В этой статье мы расскажем, как реализовать надёжную систему распознавания лиц с использованием face-recognition.js. Мы искали подходящую Node.js-библиотеку, которая умела бы аккуратно распознавать лица, но ничего не нашли. Пришлось писать самостоятельно! В этом npm-пакете используется библиотека dlib, предоставляющая Node.js-биндинги для очень хорошо зарекомендовавших себя инструментов распознавания внутри этой библиотеки. Dlib использует методы глубокого обучения и поставляется с уже обученными моделями, которые продемонстрировали точность распознавания на уровне 99,38% при прогоне бенчмарка LFW. Зачем? В последнее время мы пытаемся создать приложение для распознавания лиц на основе Node.js, которое выделяло бы и распознавало лица персонажей из сериала «Теория Большого взрыва». Сначала планировалось сделать приложение с использованием средств распознавания OpenCV, как описано в статье Node.js + OpenCV for Face Recognition. И что такое face-recognition.js? Хотелось сделать пакет на основе face-recogntion.js, который:
Хотя пакет ещё не закончен, вы уже можете скачать некоторые инструменты. Face Detection (определение лиц) Для быстрого и не слишком надёжного определения лиц на изображении вы можете использовать нейросеть глубокого обучения или простой фронтальный распознаватель: Face Recognizer (распознавание лиц) Распознаватель — это нейросеть глубокого обучения, использующая для вычисления уникальных дескрипторов лиц упомянутые выше модели. Обучать распознаватель можно на массиве тэгированных изображений лиц, после чего он сможет помечать лица на входном изображении: Face Landmarks (опорные точки) С помощью этого пакета вы также можете определять от 5 до 68 опорных точек на лицах: Отличная история, покажи теперь, как это работает! Итак, решить задачу с помощью OpenCV не удалось. У нас осталась пачка лиц Шелдона, Раджеша, Леонард, Говарда и Стюарта размером 150 х 150 пикселей каждое. С помощью этих данных можно с лёгкостью научить Face Recognizer распознавать новые лица. Код этого примера лежит в репозитории. Подготовка данных Мы собрали примерно по 20 лиц каждого персонажа в разных ракурсах:
В каждом имени файла указано имя персонажа, так что мы с лёгкостью сопоставим наши имена классов: ['sheldon', 'lennard', 'raj', 'howard', 'stuart'] с массивами изображений по каждому классу. С помощью fr.loadImage(fp) вы можете считать изображение, указанное в пути к файлу.Определение лиц Изображения лиц размером 150 х 150 пикселей были заранее вырезаны с помощью opencv4nodejs. Но вы можете определить лица, вырезать, сохранить и маркировать их таким образом:
Обучение распознавателя Теперь можно приступать к обучению:
Этот код скармливает лица нейросети, которая выдаёт для каждого лица дескриптор и сохраняет его в соответствующем классе. Задав в качестве третьего аргумента numJitters , вы можете применять вращение, масштабирование и зеркалирование, создавая разные версии каждого из входных лиц. Увеличение количества модификаций может повысить точность распознавания, но при этом нейросеть учится дольше.Также вы можете сохранять состояние распознавателя, чтобы не обучать его заново каждый раз, а просто загружать из файла: Сохранение:
Загрузка:
Распознавание новых лиц Теперь с помощью контрольных данных проверим точность распознавания и сохраним результаты в лог:
Сейчас распознавание выполняется так: сначала у входного лица вычисляется евклидово расстояние дескрипторного вектора до каждого дескриптора класса, а затем вычисляется среднее значение всех расстояний. Вы можете возразить, что для этой задачи лучше подойдёт кластеризация методом k-средних или SVM-классификатор. Возможно, в будущем они тоже будут реализованы, но скорости и эффективности евклидова расстояния пока что вполне достаточно. При вызове predictBest мы получим результат с наименьшим евклидовым расстоянием, то есть с наибольшей похожестью. Примерно так:{ className: 'sheldon', distance: 0.5 } Если вам нужно для конкретного лица получить расстояния дескрипторов всех классов, то можете просто использовать recognizer.predict(image) , который для каждого класса выдаст массивы расстояний:
Результаты Если выполнить вышеприведённый код, то получим такие результаты.
Обучим только на 5 лицах каждого персонажа:
А вот как это выглядит на видео:
Заключение Судя по результатам, даже небольшая выборка обучающих данных позволяет получить довольно точное распознавание. И это несмотря на то, что некоторые из входных изображений очень размыты из-за маленького размера. Источник: habrahabr.ru Комментарии: |
|