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-битных чисел с плавающей запятой.
Ищем в массиве векторов известных лиц наиболее близкое (по евклиду) лицо.
Рисуем прямоугольник выявленного лица.
Если расстояние между найденным известным лицом и выявленным лицом меньше какого-то порога, то пишем имя найденного известного лица над нарисованным прямоугольником.
После цикла выявленных лиц рисуем кадр в окне.
Таким образом, в данной статье, мы рассмотрели библиотеки, которые используются в системах распознавания лиц, рассмотрели базовый алгоритм работы любой такой системы, написали простую программу распознавания лиц, которая может работать даже на домашнем компьютере. Можно сделать вывод о том, что технология распознавания лиц не является чем-то сложным или недоступным. |
Проверить безопасность сайта