Распознавание лица python raspberry

Распознавание лиц на RASPBERRY PI

Биометрия везде. Современные мегаполисы в России и мире окутаны сетями камер, подключенными к различным системам распознавания лиц. Насколько это правильно с точки зрения этики — каждый решает сам, но факт в том, что такие методы не только помогают раскрывать преступления, но и предотвращать их совершение.

С каждым годом расширяется область применения таких систем. Например, пользователи могут приобрести у Google систему Nest — Nest Cam IQ Indoor, стоимостью 349 долларов с интеграцией в умный дом и возможностью распознавания лиц по подписке (за 10 долларов в месяц). И отечественных аналогов для частного пользования немало. Различные СКУД (системы контроля и управления доступом) от Ростелекома, HikVision, VisionLabs и других фирм. Описание зачастую мутное, опыт работы в реальных условиях можно найти на YouTube по запросу «Умный домофон не пускает мужчину домой».

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

Существует несколько методов реализации системы определения биометрических данных в реальном времени: анализ видеопотока на удаленном сервере, на камере с передачей данных на сервер, на локальном устройстве с подключенной камерой.

Наиболее распространена первая схема реализации. Работает она так: камера передает видеопоток на сервер, там специализированное ПО в реальном времени выполняет анализ видеопотока и сравнивает полученные изображения лиц с базой лиц эталонов. Недостатки такой системы — высокая нагрузка на сеть, ограничение по количеству подключенных камер на один сервер.

При применении 2 технологии, анализ изображения будет производится на самом устройстве — камере, а на сервер будут передаваться обработанные метаданные. Недостаток такой системы — очень высокая стоимость камер, способных обработать изображение. Зато можно подключить практически неограниченное количество устройств к удаленному серверу.

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

Обычно в качестве базы для локальной системы распознавания лиц используется компьютер или ноутбук с мощным графическим ускорителем. Предпочтительны видеокарты Nvidia из-за архитектуры CUDA, позволяющей существенно увеличить вычислительную производительность системы.

Вопреки расхожему мнению, алгоритмы распознавания лиц могут работать и на системах с небольшой вычислительной мощностью. Как например одноплатный микрокомпьютер Raspberry PI 4B с производительностью старого андройд смартфона. Именно такой микрокомпьютер с 4гб оперативной памяти и 4-ядерным процессором частотой 1.5 ГГц был использован в данном проекте.

В качестве алгоритма распознавания лиц была использована библиотека face-recognition для python. Эта библиотека работает с моделью распознавания лиц от dlib. Устанавливается достаточно просто (cv2 для отображения картинки с камеры):

Помимо простоты установки, данный модуль не требует от устройства высокой производительности и по его использованию написано огромное количество гайдов. Основная часть заключена всего в нескольких строчках, а часть распознавания лиц из кода системы выглядит следующим образом:

Тестирование системы производилось на базе данных ORL, содержащей изображения лиц с небольшими изменениями освещения, масштаба, пространственных поворотов, положения и различными эмоциями. База представляет собой 400 фотографий 40 разных людей. Все фото представлены в градации серого.

Обычно эта база используется для обучения алгоритмов распознавания лиц, но я решил проверить качество работы и быстродействие алгоритма на основе face-recognition. В результате, алгоритм, работающий на Raspberry PI 4B смог обнаружить 376 лиц за 7 секунд.

Так, например, компьютер на процессоре Intel Core I5 смог обнаружить те-же 376 лиц примерно за 2 секунды.

Но показатели этого теста можно рассматривать только в контексте скорости обнаружения лица в кадре. Неотъемлемой частью алгоритма распознавания лиц является сравнение лица в кадре с лицами в базе системы. Для этого необходимо преобразовать картинку в векторное представление и сравнить со всеми лицами в базе. К тому же, необходимо было организовать подключение к базе данных с постоянным обновлением данных в ней. Для управления базой данных была использована СУБД SQLite. Она отличается от других СУБД простотой настройки и удобством использования в малопроизводительных платформах, как Raspberry PI. Через постоянные обращения к базе и определяется принадлежность лица в объективе камеры системы к лицам, добавленным в систему как авторизованные пользователи; осуществляется логирование посещений. Эти части алгоритма (векторное преобразование, обращение к базе, сравнение обнаруженного лица с лицами в базе) и представляют собой самую ресурсоемкую его часть. Обращение к базе:

Кроме обнаружения и сравнения лица с находящимися в базе пользователей, есть еще одна часть работы алгоритма. Для проверки работы системы распознавания лиц необходима графическая интерпретация. То есть, для того чтобы увидеть, правильно ли лицо распознается и обнаруживается, необходимо транслировать на экран устройства потоковое видео и обрисовывать в нем границы объекта, распознанного как лицо.

В реальных условиях, при работе с потоковым видео, при наличии лица в кадре, данный алгоритм показывал скорость в 1-2 обработанных кадра в секунду (обнаружение лица, сравнение с лицами – эталонами):

Без показа видео количество обработанных кадров поднялось до около-стабильных 2 FPS. Небольшое изменение, но очень важное в такой системе, реализуемой на одноплатном микрокомпьютере.

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

Бот находится на стадии MVP, но уже имеет достаточно разных функций для обеспечения автономной и относительно стабильной работы системы. В числе функций:

— включение/выключение функции распознавания лиц (для снижения нагрузки);

— создание и занесение в базу лиц через отправку фотографий чат-бота;

— проверка журнала посещения (только для пользователей, вручную добавленных в базу);

— получение фотографии с камеры системы распознавания в любой момент;

— ограничение доступа к функциям чат-бота неавторизованным пользователям.

Работа функций в чат-боте:

Включение, проверка состояния

Добавление лиц в базу

Проверка логов посещения

Получение фото с камеры

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

Источник

kunalyelne/Face-Recognition-using-Raspberry-Pi

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

A small project which does face detection using OpenCV library on RaspberryPi.

What’s Raspberry pi?

Raspberry pi is a mini computer(credit card sized), which is capable of doing various tasks but with less computation power as it doesn’t have powerful resources. The Raspberry Pi is slower than a modern laptop or desktop but is still a complete Linux computer and can provide all the expected abilities that implies, at a low-power consumption level.
Explore more

what is Face Recognition?

Face Recognition/Facial Recognition is a category of biometric software which identifies people by their faces. Face is captured by digital camera and the system is trained and then it is capable of identifying the person.

OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library. OpenCV was built to provide a common infrastructure for computer vision applications and to accelerate the use of machine perception in the commercial products. It has C++, Python and Java interfaces and supports Windows, Linux, Mac OS, iOS and Android.
Read more

In this project we will learn how to detect real-time faces on Picam.

Stuff used in this projects

This project was done with «Open Source Computer Vision Library», the OpenCV. In this project, we will be using Raspberry Pi (so, Raspbian as OS) and Python.OpenCV was designed for computational efficiency and with a strong focus on real-time applications. So, it’s perfect for real-time face recognition using a camera.

2] Project Structure :

  1. Face Detection and Data Gathering.
  2. Train the Sysytem.
  3. Face Recognition.

Step 1: Installing OpenCV library

I am using a Raspberry Pi V3 updated to the last version of Raspbian (Stretch), so the best way to have OpenCV installed, is to follow the awesome tutorial developed by Adrian Rosebrock: Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi

Once you finished the tutorial, you should have an OpenCV virtual environment ready to run our experiments on your Pi. Let’s go to our virtual environment and confirm that OpenCV 3 is correctly installed.

Run the command source each time you open up a new terminal to ensure your system variables have been set up correctly.
source

Next, let’s enter on our virtual environment:
workon cv

If you see the text (cv) preceding your prompt, then you are in the cv virtual environment:
(cv) pi@raspberry:

Now, enter in your Python interpreter :
python

then import the OpenCV library :
>>import cv2

If no error messages appear, the OpenCV is correctly installed ON YOUR PYTHON VIRTUAL ENVIRONMENT.

You can also check the OpenCV version installed:
cv2.__version__

Step 2: Testing Camera

Once you have OpenCV installed in your Raspberry Pi, let’s test to confirm that your camera is working properly. I am assuming that you have a PiCam already installed on your Raspberry Pi.

You must have the camera enabled when you ran through Adrian’s tutorial, otherwise, the drivers will not be installed correctly.

In case you get an error like: OpenCV Error: Assertion failed , you can try solve the issue, using the command:
sudo modprobe bcm2835-v4l2

Once you have all drivers correctly installed, enter the below Python code on your IDE or any Text Editor :

The above code will capture the video stream that will be generated by your PiCam, displaying both, in BGR color and Gray mode. You can download the code CamTest.py from above as well. Now, Run the program :
python CamTest.py

Some may found issues when trying to open the camera ( «Assertion failed» error messages). That could happen if the camera was not enabled during OpenCv installation and so, camera drivers did not install correctly. To correct, use the command:
sudo modprobe bcm2835-v4l2

Step 3: Face Detection

The most basic task on Face Recognition is of course, «Face Detecting». Before anything, you must «capture» a face in order to recognize it, when compared with a new face captured on future.

The most common way to detect a face (or any objects), is using the «Haar Cascade classifier»

Object Detection using Haar feature-based cascade classifiers is an effective object detection method proposed by Paul Viola and Michael Jones in their paper, «Rapid Object Detection using a Boosted Cascade of Simple Features» in 2001. It is a machine learning based approach where a cascade function is trained from a lot of positive and negative images. It is then used to detect objects in other images.

Here we will work with face detection. Initially, the algorithm needs a lot of positive images (images of faces) and negative images (images without faces) to train the classifier. Then we need to extract features from it. The good news is that OpenCV comes with a trainer as well as a detector. If you want to train your own classifier for any object like car, planes etc. you can use OpenCV to create one. Its full details are given here: Cascade Classifier Training.

Enough theory, let’s create a face detector with OpenCV!

When you compare with the last code used to test the camera, you will realize that few parts were added to it. Note the line below:
faceCascade = cv2.CascadeClassifier(‘Cascades/haarcascade_frontalface_default.xml’)
This is the line that loads the «classifier» (that must be in a directory named «Cascades/», under your project directory).

Then, we will set our camera and inside the loop, load our input video in grayscale mode (same we saw before).

Now we must call our classifier function, passing it some very important parameters, as scale factor, number of neighbors and minimum size of the detected face.

* gray is the input grayscale image.
* scaleFactor is the parameter specifying how much the image size is reduced at each image scale. It is used to create the scale pyramid.
* minNeighbors is a parameter specifying how many neighbors each candidate rectangle should have, to retain it. A higher number gives lower false positives.
* minSize is the minimum rectangle size to be considered a face.

The function will detect faces on the image. Next, we must «mark» the faces in the image, using, for example, a blue rectangle. This is done with this portion of the code:

If faces are found, it returns the positions of detected faces as a rectangle with the left up corner (x,y) and having «w» as its Width and «h» as its Height ==> (x,y,w,h).

Now, run the above python Script on your python environment, using the Raspberry Pi Terminal:
python FaceDetection.py

After executing the above code you will be able to see a window popping which includes your face.

You can also include classifiers for «eyes detection» or even «smile detection». On those cases, you will include the classifier function and rectangle draw inside the face loop, because would be no sense to detect an eye or a smile outside of a face.

Step 4: Data Gathering

Let’s start the first phase of our project. What we will do here, is starting from Face Detecting, we will simply create a dataset, where we will store for each id, a group of photos in gray with the portion that was used for face detecting.

First, create a directory where you develop your project, for example, FaceRecognition:
mkdir FaceRecognition

In this directory, besides the 3 python scripts that we will create for our project, we must have saved on it the Facial Classifier. You can download it from above: haarcascade_frontalface_default.xml

Next, create a subdirectory where we will store our facial samples and name it «dataset»:
mkdir dataset

The code is very similar to the code that we saw for face detection. What we added, was an «input command» to capture a user id, that should be an integer number (1, 2, 3, etc)
face_id = input(‘\n enter user id end press ==> ‘)

And for each one of the captured frames, we should save it as a file on a «dataset» directory: cv2.imwrite(«dataset/User.» + str(face_id) + ‘.’ + str(count) + «.jpg», gray[y:y+h,x:x+w])

Note that for saving the above file, you must have imported the library «os». Each file’s name will follow the structure: User.face_id.count.jpg

For example, for a user with a face_id = 1, the 4th sample file on dataset/ directory will be something like:
User.1.4.jpg

In code, you guys can see the there’s a count variable which counts no. of images captured. It is set to 30 , the more you capture the more accuratly system will work.

Step 6: Trainer

On this second phase, we must take all user data from our dataset and «trainer» the OpenCV Recognizer. This is done directly by a specific OpenCV function. The result will be a .yml file that will be saved on a «trainer/» directory.

So, let’s create trainer directory first:
mkdir trainer

Confirm if you have the PIL library installed on your Raspberry Pi. If not, run the below command in Terminal:
pip install pillow

We will use as a recognizer, the LBPH (LOCAL BINARY PATTERNS HISTOGRAMS) Face Recognizer, included in OpenCV package. This can be done by following line:
recognizer = cv2.face.LBPHFaceRecognizer_create()

The function «getImagesAndLabels(path)», will take all photos on directory: «dataset/», returning 2 arrays: «Ids» and «faces». With those arrays as input, we will «train our recognizer»:
recognizer.train(faces, ids)

As a result, a file named «trainer.yml» will be saved in the trainer directory that was previously created by us.

Note: Make sure that whenever you collect dataset i.e run program 1, you must run program 2 as well to train Rpi.

Step 6: Recognizer

Now, we reached the final phase of our project. Here, we will capture a fresh face on our camera and if this person had his face captured and trained before, our recognizer will make a «prediction» returning its id and an index, shown how confident the recognizer is with this match.

We are including here a new array, so we will display «names», instead of numbered ids:

names = [‘None’, ‘Kunal’, ‘Kaushik’, ‘Tushar’, ‘X’, ‘Y’ , ‘Z’] So, for example: Kunal will be the user with Kaushik: etc.

Next, we will detect a face, same we did before with the haarCascade classifier. Having a detected face we can call the most important function in the above code:
id, confidence = recognizer.predict(gray portion of the face)

The recognizer.predict () , will take as a parameter a captured portion of the face to be analyzed and will return its probable owner, indicating its id and how much confidence the recognizer is in relation with this match.

Note that the confidence index will return «zero» if it will be cosidered a perfect match

Below is the final result image, you too should get similar output

I hope this project can help others find their way into the exciting world of IoT!

For more projects, follow me on github Kunal Yelne 👍
Thankyou ❤️

Источник

Adblock
detector