Бесплатно Экспресс-аудит сайта:

18.08.2020

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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