Время прочтения: 5 мин.

В этом посте рассмотрим, как использовать библиотеку Facerecognition для распознавания лиц на изображениях. Комбинируя ее с веб-фреймворком Django, мы покажем этапы создания веб-приложения пропускной системы.

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

В процессе решения задачи было выделено 3 основных фреймворка для создания веб-приложений: Django, Flask и FastAPI. Рассмотрим особенности каждого из них.

Одним из плюсов фреймворка FastAPI является поддержка асинхронных процессов. Такие процессы позволяют увеличить скорость обработки данных в разы. Также плюсом данного фреймворка является поддержка из коробки Websockets. Благодаря указанному протоколу пользователь может получать данные в режиме реального времени.

Отличительной чертой фреймворка Flask является его простота и отсутствие встроенных ненужных для реализации функционала конкретного проекта элементов.

Фреймворк Django имеет стандартную структуру, что позволяет оставаться проекту типизированным и понятным для любого разработчика, использующего данный фреймворк. Также важным преимуществом Django является наличие встроенных инструментов безопасности, такие как: защита от SQL-инъекций, подделки межсайтовых запросов (CSRF) и т. д. В наборе встроенных инструментов присутствует admin панель, которая облегчает процесс администрирования приложения, можно просматривать, добавлять, редактировать и удалять данные вручную. Через панель администрирования можно создавать и изменять группы пользователей и менять права доступа.

Для наглядности сравнения фреймворков мы сделали сводную таблицу по основным критериям подбора.

В результате анализа набора инструментов каждого фреймворка выбор пал на Django. Помимо технических преимуществ, описанных выше, стоит отметить тот факт, что Django обладает большим сообществом разработчиков. Это играет большую роль для тех, кто только начинает свой путь в веб-разработке, потому что они имеют возможность найти готовые решения типовых задач и получить помощь от более опытных коллег.

Одним из главных требований к фильтрации и обработке данных является поиск клиента/сотрудника по фотографии.

Процесс распознавания лица состоит из трех этапов:

  1. Выделение контура лица на изображении.
  2. Извлечение характерных признаков текущего образа лица человека.
  3. Сравнение признаков с эталоном.

Рассмотрим библиотеки для распознавания лиц.

OpenCV – это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Данная библиотека сравнивает куски фото с определенными шаблонами и таким образом находит лица людей.

Dlib – это продвинутая библиотека машинного обучения, созданная для решения сложных реальных задач. Данная библиотека предназначена для расстановки контрольных точек на изображении и дальнейшей обработки изображения.

Facerecognition является библиотекой, написанной на языке программирования Python и объединяющей библиотеки OpenCV, Dlib и  Matplotlib для поиска из набора фотографий нужной.

Для обеспечения передачи фотографии с клиента необходимо прописать атрибуты формы:

<form method="post" enctype="multipart/form-data">

Значение «post» атрибута «method» указывает, что именно из этой формы будут передаваться данные при выполнении post-запроса. А указанное значение атрибута «enctype» необходимо для корректной передачи файла из input поля с атрибутом type = «file».

В html-коде прописывается тег «input» со следующими параметрами:

<input id="file-img" type="file" name="myfile1" src="{% static 'photo/inp.png' %}"
        height="40px" width="110px" alt="submit" />

Для поиска посетителя по фотографии используется кусок кода, показанный ниже. Мы принимаем фотографию из формы и обрабатываем её при помощи метода face_recognition.load_image_file(). После этого происходит сравнение фотографии, загруженной пользователем, с набором фотографий из базы данных.

from PIL import Image
import face_recognition
if request.FILES.get('myfile1')!=None:
                app_client=Client_Time()
                app_client.link_photo1_client = request.FILES.get('myfile1')
                known_image = face_recognition.load_image_file(app_client.link_photo1_client)
                for client in all_clients:
                    unknown_image = face_recognition.load_image_file(client.link_photo1_client)
                    if len(face_recognition.face_encodings(known_image))!=0:
                        baixiaona_encoding = face_recognition.face_encodings(known_image)[0]
                        unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
                        results = face_recognition.compare_faces([baixiaona_encoding], unknown_encoding)
             
                        if results[0] == True:
                            output.append(client)
            else:
                output=all_clients

В результате проделанной работы мы получили прототип ИС «Контроль-63». Это веб-приложение, предназначенное для частичной автоматизации процесса аутентификации клиентов и сотрудников организации. Функционал программы позволяет производить поиск клиентов и сотрудников, а также сообщать об ошибках, выявленных при эксплуатации «Контроль-63». На данный момент реализовано 3 типа пользователей с различными правами доступа к функционалу приложения.

В процессе разработки продукта было принято решение хранить информацию о клиентах, сотрудниках, допусках и ошибках в базе данных. В качестве СУБД была выбрана отечественная разработка PostgreSQL.

Перейдем к тестированию реализованного функционала информационной пропускной системы «Контроль-63». Данное веб-приложение является кроссплатформенным и имеет адаптивную верстку, что позволяет использовать его как на стационарных компьютерах, так и на мобильных устройствах.

Смоделируем бизнес процесс, когда клиент проходит через пропускной пункт и при этом не имеет при себе документы.

Для этого заходим под аккаунтом охранника в нашу ИС.    

  1. Вводим логин и пароль охранника/администратора на странице авторизации.
  2. После успешной авторизации попадаем на главную страницу системы «Контроль-63». Нажимаем на кнопку «Поиск клиента».

3. Нажимаем на кнопку «Выбрать файл» и в выпадающем списке выбираем «Снять фото или видео».

4. Делаем фотографию клиента.

5. После того, как сделанная фотография подцепилась к файловому полю, нажимаем на кнопку «Поиск».

6. После поиска приложение выдаёт результат с карточкой клиента, если он есть в базе, либо сообщение об отсутствии данных в противоположном случае.

В результате выполнения работы мы получили пусть и сыроватый, но всё же продукт, удовлетворяющий требованиям пропускной системы. Реализовано веб-приложение, которое легко поставлять в филиалы компании (достаточно иметь любое устройство с камерой и доступом к интернету). В перспективе планируется реализовать обработку изображения в live-режиме с использованием веб-сокетов и Django Channels.

До скорых встреч!