• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Пишем программу распознавания лиц на Go

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Технология распознавание лиц не является чем-то сложным или недоступным.

В настоящее время мы наблюдаем распространение систем распознавания лиц. Многим может казаться что такие системы сложны в реализации и требуют знаний в области машинного обучения или компьютерного зрения. Но в действительности, реализовать такую систему, даже в домашних условиях, не сложно.

В данной статье мы напишем программу распознавания лиц на Go с помощью библиотек dlib и opencv. Наша программа будет отображать видеопоток, рисовать прямоугольник вокруг лица и подписывать лицо в случае распознавания.

Для начала рассмотрим наши библиотеки.

Dlib - это свободная библиотека, включающая алгоритмы машинного обучения и программные средства для создания сложного программного обеспечения для решения практических задач. Прелесть этой библиотеки в том, что на ней реализованы и натренированы нейросети, позволяющих выявлять и векторизовывать лица на изображениях. Притом между получаемые векторами можно находить евклидовые расстояния и, таким-образом, судить о схожести лиц. Мы будем использовать обёртку на Go github.com/dimuls/face.

Opencv - это свободная библиотека машинного обучения и компьютерного зрения. Данная библиотека, как и dlib, включает алгоритмы и нейросети для выявления лиц, однако мы не будем использовать их в нашей программу. Нам она нужна для подключения к источникам видеопотоков. Мы будем использовать Go обёртку gocv.

Перед написанием и запуском программы необходимо правильным образом собрать и установить библиотеки dlib и opencv, а так-же установить Go обёртки github.com/dimuls/face и gocv. Как это сделать ― тема отдельной статьи. Так-же желательно наличие видеокарты с поддержкой технологии CUDA для ускорения алгоритмов нейросетей.

Опишем основной алгоритм работы нашей программы:
22444.gif

Ядро любой программы или системы распознавания лиц работаем примерно по этому алгоритму. Разница лишь в действиях, предпринимаемых при выявлении лица и нахождении известного лица.

Давайте посмотрим на реализацию. Ниже приведён код main функции программы. Полный код можно найти тут.

В начале мы инициализируем основные объекты, которые будут использоваться в нашей программе.

Инициализация детектора лиц, который будет выявлять лица.
image003.jpg


Инициализация распознавателя лиц, который будет векторизовывать лица.
image004.jpg


Инициализация базы персон.
image005.jpg


Инициализация видеопотока.
image006.jpg


Инициализация окна программы.
image007.jpg


Инициализация изображения для очередного кадра.
image008.jpg


Далее у нас идёт бесконечный цикл обработки кадров со следующим содержанием.

Ждём 1 миллисекунду нажатия клавиши на клавиатуре. Если нажата Esc, то выходим из приложения
image009.jpg


Пока не получим кадр продолжаем цикл.
image010.jpg


Выявляем лица в кадре. Получаем массив выявленных лиц.
image011.jpg


Для каждого выявленного лица.
image012.jpg


Получаем вектор выявленного лица. Вектор лица представляет собой массив из 128 32-битных чисел с плавающей запятой.
image013.jpg


Ищем в массиве векторов известных лиц наиболее близкое (по евклиду) лицо.
image014.jpg


Рисуем прямоугольник выявленного лица.
image015.jpg


Если расстояние между найденным известным лицом и выявленным лицом меньше какого-то порога, то пишем имя найденного известного лица над нарисованным прямоугольником.
image016.jpg


После цикла выявленных лиц рисуем кадр в окне.
image017.jpg


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

Автор: Чернов Вадим Игоревич, ведущий программист, победитель хакатона Fintech&Security Superhero
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх