Создать систему распознавания лиц у входной двери за $150 с помощью одноплатного компьютера и кода на Python — Разработка на

Краткое описание основ

Вам нужно освежить информацию? Давайте вкратце рассмотрим несколько основных понятий.

Все, что вам нужно

Для обнаружения лиц и кодирования информации вам понадобится следующее:

  • Python: В этом примере мы будем использовать Python 3, который вы можете найти здесь. Порядок установки и загрузки зависит от вашей операционной системы.

  • Кластер Elasticsearch: Вы можете создать кластер в бесплатной пробной версии Elastic Cloud

  • Библиотека распознавания лиц: Простая библиотека Python для распознавания лиц.

  • Клиент Python Elasticsearch: Официальный клиент Python для Elasticsearch.

Обратите внимание, что мы протестировали следующие инструкции на Ubuntu 20.04 LTS и Ubuntu 18.04 LTS. В зависимости от вашей операционной системы могут потребоваться некоторые изменения.

Что купить

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

Что такое nvidia jetson nano и чем он отличается от raspberry pi

Долгое время Raspberry Pi был самым простым способом для разработчика программного обеспечения попробовать самостоятельно создать аппаратное устройство. Raspberry Pi — это одноплатный компьютер за $35, работающий на Linux и полностью поддерживающий Python.

А если подключить к нему фирменную камеру-модуль за $20, вы сможете использовать его для создания автономных систем компьютерного зрения. C 2022-го по 2022 год Raspberry Pi продала более 12 млн устройств, познакомив новое поколение программистов с разработкой аппаратных средств.

Несмотря на то что Raspberry Pi — отличный продукт, он едва ли годится для глубокого обучения. В компьютере нет видеокарты, а CPU медленно проводит операции с матрицами, поэтому модели глубокого обучения тоже, как правило, работают медленно.

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

Nvidia заметила нишу на рынке и спроектировала Jetson Nano. Jetson Nano похож на Raspberry Pi, но оборудован графическим процессором и предназначен именно для запуска моделей глубокого обучения.

Другое достоинство Jetson Nano: он поддерживает те же библиотеки CUDA для ускорения, которые уже используются почти всеми фреймворками глубокого обучения на основе Python. Это означает, что вы можете взять существующее приложение глубокого обучения на основе Python и запустить его на Jetson Nano с минимальными изменениями, причём зачастую — с приличной производительностью.

Это огромный шаг вперёд по сравнению с глубоким обучением на Raspberry Pi.

Простое введение в распознавание лиц (с кодом python)

Введение

Знаете ли вы, что каждый раз, когда вы загружаете фотографию в Facebook, платформа использует алгоритмы распознавания лиц для идентификации людей на этом изображении? Или что определенные правительства во всем мире используют технологию распознавания лиц для выявления и поимки преступников? Мне не нужно говорить, что теперь вы можете разблокировать смартфоны своим лицом!

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

В этой статье мы собираемся сделать именно это. Сначала мы разберемся с внутренними принципами распознавания лиц, а затем возьмем простой пример и реализуем его в Python. К концу статьи вы создадите свою самую первую модель распознавания лиц!

Понимание того, как работает распознавание лиц

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

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

  • Высота/ширина лица.
  • Высота и ширина могут быть ненадежными, поскольку изображение может быть масштабировано по разному. Однако даже после изменения масштаба неизменными остаются отношения – отношение высоты лица к ширине лица не изменится.
  • Цвет лица.
  • Ширина других частей лица, таких как губы, нос и т. д.

Понятно, что здесь есть закономерность – разные лица имеют разные размеры, как показано выше. Подобные лица имеют похожие размеры. Задача состоит в том, чтобы преобразовать определенное лицо в числа – алгоритмы машинного обучения понимают только числа. Это числовое представление «лица» (или элемента в обучающем наборе) называется вектором признаков. Вектор признаков состоит из различных чисел в определенном порядке.

В качестве простого примера мы можем отобразить «лицо» в вектор объектов, который может включать в себя различные признаки, такие как:

  • Высота лица (см)
  • Ширина лица (см)
  • Средний цвет лица (R, G, B)
  • Ширина губ (см)
  • Высота носа (см)

По сути, учитывая изображение, мы можем отобразить различные объекты и преобразовать их в вектор объектов, например:

Высота лица (см) – 23.1

Ширина лица (см) – 15.8

Средний цвет лица (RGB) – (255, 224, 189)

Ширина губ (см) – 5.2

Высота носа (см) – 4.4

Итак, наше изображение теперь представляет собой вектор, который можно представить в виде (23.1, 15.8, 255, 224, 189, 5.2, 4.4). Конечно, на изображении может быть множество других черт (например, цвет волос, волосы на лице, очки и т. l.). Однако, для примера, давайте рассмотрим только эти 5 простых признаков.

Теперь, когда мы закодировали каждое изображение в вектор признаков, проблема стала намного проще. Ясно, что когда у нас есть 2 лица (изображения), которые представляют одного и того же человека, полученные векторы признаков будут очень похожи. Иными словами, «расстояние» между двумя векторами признаков будет довольно маленьким.

Машинное обучение может помочь нам с двумя вещами:

  1. Получение вектора объекта: трудно вручную перечислить все признаки, потому что их очень много. Алгоритм машинного обучения может разумно обозначить многие из таких признаков. Например, сложными характеристиками могут быть: соотношение высоты носа и ширины лба. Человеку будет довольно сложно перечислить все такие функции «второго порядка».
  2. Алгоритмы согласования: после того, как векторы признаков получены, алгоритм машинного обучения должен сопоставить новое изображение с набором векторов признаков, присутствующих в выборке.

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

Пример

Нам дают несколько лиц – возможно, таких знаменитостей, как Марк Цукерберг, Уоррен Баффет, Билл Гейтс, Шахрукх Кхан и т. д. Назовите эту группу лиц нашей совокупностью. Теперь нам дают изображение еще одной знаменитости («новая знаменитость»). Задача проста – определить, входит ли эта «новая знаменитость» в число присутствующих в совокупности.

Вот некоторые из изображений в совокупности:

Как видите, у нас есть такие знаменитости, как Барак Обама, Билл Гейтс, Джефф Безос, Марк Цукерберг, Рэй Далио и Шахрукх Кхан.

Теперь вот «новая знаменитость»:

Примечание: все вышеперечисленные изображения были взяты из изображений Google.

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

Существует удивительно простая библиотека Python, которая инкапсулирует все, что мы рассматривали выше – создание векторов признаков из лиц и умение различать лица. Эта библиотека Python называется face_recognition и в глубине использует dlib – современный фреймворк C , который содержит несколько алгоритмов машинного обучения, которые помогают в написании сложных приложений на C .

Библиотека face_recognition в Python может выполнять большое количество задач:

– найти все лица на заданном изображении;

– найти и управлять чертами лица в изображении;

– идентифицировать лица на изображениях;

– распознавать лица в реальном времени.

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

На самом деле, есть также руководство по установке библиотеки face_recognition:

Перед установкой face_recognition вам также необходимо установить dlib. Вы можете найти инструкции по установке dlib здесь:

Реализация в Python

Структура папок выглядит следующим образом:

facialrecognition:

    fr.py

    my_image.jpg

    images/

        barack_obama.jpg

        bill_gates.jpg

        jeff_bezos.jpg

        mark_zuckerberg.jpg

        ray_dalio.jpg

        shah_rukh_khan.jpg

        warren_buffett.jpg

Наш корневой каталог, facialrecognition, содержит:

  • Наш код распознавания лиц, приведенный выше, в виде fr.py.
  • my_image.jpg – изображение, которое нужно распознать («новая знаменитость»).
  • images/ – «совокупность».

Когда вы создаете структуру папок, как указано выше, и запускаете приведенный выше код, вот что вы получаете в качестве вывода:

Matched: shah_rukh_khan.jpgNot matched: warren_buffett.jpgNot matched: barack_obama.jpgNot matched: ray_dalio.jpgNot matched: bill_gates.jpgNot matched: jeff_bezos.jpgNot matched: mark_zuckerberg.jpg

Очевидно, что «новой знаменитостью» является Шахрукх Кхан, и наша система распознавания лиц способна это обнаружить!

Разбор кода Python

Теперь давайте рассмотрим код, чтобы понять, как он работает:

# импорт библиотекimport osimport face_recognition

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

# составляем список всех доступных изображенийimages = os.listdir('images')

Этот простой код помогает нам определить путь всех изображений в совокупности. Как только эта строка будет выполнена, у нас будет:

images = ['shah_rukh_khan.jpg', 'warren_buffett.jpg', 'barack_obama.jpg', 'ray_dalio.jpg', 'bill_gates.jpg', 'jeff_bezos.jpg', 'mark_zuckerberg.jpg']

Теперь код ниже загружает изображение новой знаменитости:

# загружаем ваше изображениеimage_to_be_matched = face_recognition.load_image_file('my_image.jpg')

Чтобы убедиться, что алгоритмы способны интерпретировать изображение, мы конвертируем изображение в вектор признаков:

# преобразуем загруженное изображение в вектор признаковimage_to_be_matched_encoded = face_recognition.face_encodings(    image_to_be_matched)[0]

Оставшаяся часть кода теперь довольно проста:

Здесь у нас:

– итерация цикла на каждом изображении;

– кодирование изображения в вектор признаков;

– сравнение загруженного изображения с изображением, которое нужно распознать;

– если это совпадение, мы печатаем это;

– если это несоответствие, мы также печатаем это.

При повторном запуске алгоритма вы увидите следующий вывод:

Not matched: shah_rukh_khan.jpgNot matched: warren_buffett.jpgNot matched: barack_obama.jpgNot matched: ray_dalio.jpgNot matched: bill_gates.jpgNot matched: jeff_bezos.jpgNot matched: mark_zuckerberg.jpg

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

Применение распознавания лиц

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

Аутентификация по лицу: Apple ввела Face ID для аутентификации лица в iPhone. Некоторые из ведущих банков пытаются использовать аутентификацию по лицу для банкоматов.

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

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

Заключение

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

128-мерный вектор

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

Вторая реализация с использованием OpenCV

import cv2  
import matplotlib.pyplot as plt
 
gray_img = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
 
plt.imshow(gray_img, cmap='gray')
 
haar_face_cascade = cv2.CascadeClassifier('/content/haarcascade_frontalface_alt.xml')
faces = haar_face_cascade.detectMultiScale(gray_img)
print('Faces found: ', len(faces))
 
for (x, y, w, h) in faces:
    cv2.rectangle(image2, (x, y), (x w, y h), (0, 255, 0), 2)
     
plt.imshow(image2)

Убедитесь, что пути к файлам верны, чтобы вы могли получить точные результаты, как в наших примерах выше. Если вам нужна помощь, вы всегда можете обратиться к репозиторию Github, упомянутому выше.

Разъём питания microUSB (около $10)

Если есть возможность, найдите адаптер питания, который поддерживает именно Jetson Nano, поскольку некоторые USB-штекеры не дают достаточного напряжения. Но подойти может и старое зарядное устройство для мобильного телефона.

Raspberry Pi Camera Module v2.x (около $30)

Вы не сможете использовать модуль камеры Raspberry Pi v1.x, Jetson Nano не поддерживает этот чипсет. Для работы вам нужен модуль камеры v2.x.

Быстрая карта microSD с объёмом не менее 32 ГБ (около $10–25)

Я потратил чуть больше и купил карту на 128 ГБ на Amazon. Рекомендую брать побольше памяти, чтобы вам точно хватило места. Если у вас есть лишняя microSD, смело используйте её.

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

  • Картридер microSD для компьютера, чтобы загрузить и установить ПО Jetson.
  • Проводная USB-клавиатура и проводная USB-мышь для управления Jetson Nano.
  • Любой монитор или телевизор с HDMI-входом (не через конвертер HDMI-DVI), чтобы следить за работой. Монитор понадобится для первоначальной настройки Jetson Nano, даже если позже вы будете обходиться без него.
  • Кабель Ethernet и место, куда его можно подключить. Странно, но у Jetson Nano нет встроенного Wi-Fi. При желании можно добавить USB-адаптер Wi-Fi, но Jetson Nano поддерживает не все модели, поэтому проверьте это перед покупкой.

Соберите всё это вместе — и вы готовы к работе. Надеюсь, в общем вы потратите не больше $150. Дороже всего обойдутся сама плата Jetson Nano и модуль камеры.

Конечно, вы можете купить или смастерить чехол для оборудования Jetson Nano и камеры. Но это полностью зависит от того, куда вы хотите установить систему.

Adjusting tolerance / sensitivity

If you are getting multiple matches for the same person, it might be that
the people in your photos look very similar and a lower tolerance value
is needed to make face comparisons more strict.

You can do that with the –tolerance parameter. The default tolerance
value is 0.6 and lower numbers make face comparisons more strict:

$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

If you want to see the face distance calculated for each match in order
to adjust the tolerance setting, you can use –show-distance true:

Automatically find all the faces in an image

See this example
to try it out.

You can also opt-in to a somewhat more accurate deep-learning-based face detection model.

Note: GPU acceleration (via NVidia’s CUDA library) is required for good
performance with this model. You’ll also want to enable CUDA support
when compliling dlib.

See this example
to try it out.

If you have a lot of images and a GPU, you can also
find faces in batches.

Automatically locate the facial features of a person in an image

See this example
to try it out.

Command-line interface

When you install face_recognition, you get two simple command-line
programs:

  • face_recognition – Recognize faces in a photograph or folder full for
    photographs.
  • face_detection – Find faces in a photograph or folder full for photographs.

Creating a standalone executable

If you want to create a standalone executable that can run without the need to install python or face_recognition, you can use PyInstaller. However, it requires some custom configuration to work with this library. See this issue for how to do it.

Face_detection command line tool

The face_detection command lets you find the location (pixel coordinatates)
of any faces in an image.

Just run the command face_detection, passing in a folder of images
to check (or a single image):

$ face_detection  ./folder_with_pictures/

examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792

Face_recognition command line tool

The face_recognition command lets you recognize faces in a photograph or
folder full for photographs.

First, you need to provide a folder with one picture of each person you
already know. There should be one image file for each person with the
files named according to who is in the picture:

Next, you need a second folder with the files you want to identify:

Then in you simply run the command face_recognition, passing in
the folder of known people and the folder (or single image) with unknown
people and it tells you who is in each image:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

There’s one line in the output for each face. The data is comma-separated
with the filename and the name of the person found.

An unknown_person is a face in the image that didn’t match anyone in
your folder of known people.

Find and manipulate facial features in pictures

Get the locations and outlines of each person’s eyes, nose, mouth and chin.

Finding facial features is super useful for lots of important stuff. But you can also use it for really stupid stuff
like applying digital make-up (think ‘Meitu’):

Find faces in pictures

Find all the faces that appear in a picture:

Having problems?

If you run into problems, please read the Common Errors section of the wiki before filing a github issue.

How face recognition works

If you want to learn how face location and recognition work instead of
depending on a black box library, read my article.

Identify faces in pictures

Recognize who appears in each photo.

You can even use this library with other Python libraries to do real-time face recognition:

See this example for the code.

Installing on freebsd

pkg install graphics/py-face_recognition

Installing on mac or linux

First, make sure you have dlib already installed with Python bindings:

Then, make sure you have cmake installed:

brew install cmake

Finally, install this module from pypi using pip3 (or pip2 for Python 2):

pip3 install face_recognition

Alternatively, you can try this library with Docker, see this section.

If you are having trouble with installation, you can also try out a
pre-configured VM.

More examples

If you simply want to know the names of the people in each photograph but don’t
care about file names, you could do this:

Python code examples

All the examples are available here.

Python module

You can import the face_recognition module and then easily manipulate
faces with just a couple of lines of code. It’s super easy!

Recognize faces in images and identify who they are

See this example
to try it out.

Requirements

  • Python 3.3 or Python 2.7
  • macOS or Linux (Windows not officially supported, but might work)

Speeding up face recognition

Face recognition can be done in parallel if you have a computer with
multiple CPU cores. For example, if your system has 4 CPU cores, you can
process about 4 times as many images in the same amount of time by using
all your CPU cores in parallel.

If you are using Python 3.4 or newer, pass in a –cpus <number_of_cpu_cores_to_use> parameter:

$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/

You can also pass in –cpus -1 to use all CPU cores in your system.

Векторный тип данных

Elasticsearch предлагает тип данных dense_vector для хранения “плотных” векторов плавающих значений. Максимальное количество элементов в векторе не должно превышать 2048, что вполне достаточно для хранения репрезентаций черт лица.

Теперь давайте реализуем все эти концепции.

Загрузка по jetson nano

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

Образ ПО Nvidia по умолчанию просто отличный. Он включает в себя Ubuntu Linux 18.04 с предварительно установленным Python 3.6 и OpenCV, что экономит много времени.

Установка программного обеспечения Jetson Nano на SD-карту:

Теперь, когда у вас есть SD-карта с программным обеспечением Jetson Nano по умолчанию, время распаковывать остальное оборудование.

Запуск демо-приложения камеры с распознаванием лиц для дверного звонка

Библиотека face_recognition — созданная мной библиотека Python. Она упрощает процесс распознавания: позволяет обнаруживать лица и кодировать их, а затем сравнивать кодировки лиц, чтобы определить, относятся ли они к одному и тому же человеку. Всё это с помощью всего лишь пары строк кода.

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

Для начала давайте скачаем код. Я разместил здесь полный код с комментариями, но вот более простой способ загрузки его на свой Jetson Nano из командной строки.

wget -O doorcam.py tiny.cc/doorcam

Затем вы можете запустить код и протестировать его.

python3 doorcam.py

Вы увидите всплывающее окно видео на рабочем столе. Всякий раз, когда перед камерой появляется новый человек, система регистрирует его лицо и начинает отслеживать, как долго он находится у двери. Если тот же самый человек уходит и возвращается более чем через 5 минут, камера регистрирует новое посещение и отслеживает его снова. Вы можете закрыть видео в любой момент, нажав «q».

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

Использование python opencv для обнаружения лиц

Python OpenCV, с другой стороны, использует каскады HAAR для обнаружения своих функций. Это немного медленнее, но очень точно!

Я сделал еще один снимок из интернета:

дает нам:

Фото с красной ковровой дорожки

Затем мы вводим каскадный классификатор для лица, который присутствует в OpenCV:

и это дает нам точно 8.

Итак, теперь давайте нарисуем вокруг лиц прямоугольник:

for (x, y, w, h) in faces:
    cv2.rectangle(image2, (x, y), (x w, y h), (0, 255, 0), 2)
plt.imshow(image2)

дает нам:

И вуаля! На этом пока все.

Использование&nbsp;библиотеки&nbsp;face_recognition&nbsp;для обнаружения лиц

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

Затем я загрузил изображение из Интернета, на котором было много лиц:

Итак, теперь мы можем загрузить указанный выше файл:

Когда мы запускаем приведенный выше код, мы получаем такой вывод:

array([[[223, 218, 248], [223, 218, 248], [223, 218, 248], ..., [248, 248, 248], [248, 248, 248], [248, 248, 248]], [[223, 218, 248], [223, 218, 248], [223, 218, 248], ..., [248, 248, 248], [248, 248, 248], [248, 248, 248]], [[223, 218, 248], [223, 218, 248], [223, 218, 248], ..., [248, 248, 248], [248, 248, 248], [248, 248, 248]], ..., [[201, 28, 30], [205, 32, 34], [206, 32, 34], ..., [160, 14, 15], [179, 18, 23], [185, 18, 25]], [[201, 27, 29], [203, 29, 31], [204, 30, 32], ..., [152, 8, 8], [171, 12, 16], [181, 14, 21]], [[201, 27, 29], [201, 27, 29], [200, 27, 29], ..., [150, 8, 7], [167, 13, 15], [180, 15, 21]]], dtype=uint8)

Любое цветное изображение состоит из 3-х каналов: синего, зеленого и красного. Это три матрицы, представленные в приведенном выше массиве. Таким образом, цветное изображение 50 × 50 станет матрицей 50x50x3.

Мы можем получить количество лиц на фотографии, которое дает нам 10:

Итак, у нас на фото 10 лиц. Нарисуем на этих гранях прямоугольники, а затем выведем в файл:

дает нам:

Так что это довольно точно. Теперь поговорим о другом методе.

Как работает распознавание лиц?

Самый популярный способ обнаружения лиц и объектов – использование классификаторов HOG.

HOG – это гистограмма ориентированных градиентов. Суть вопроса заключается в поиске подходящих дескрипторов признаков для изображения, будь то лица или другие объекты.

В 2005 году функции гистограммы ориентированных градиентов (HOG) были реализованы Навнитом Далалом и Биллом Триггсом.

Гистограмма ориентированных градиентов (HOG) – это дескриптор функции, используемый в основном для распознавания объектов при обработке изображений. Дескриптор функции – это представление изображения или фрагмента изображения, которое, извлекая из него ценную информацию, упрощает изображение.

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

Производные изображения по x и y (градиенты) полезны, потому что из-за внезапного изменения амплитуды величина градиентов высока по краям и углам, и мы знаем, что края и углы содержат намного больше деталей формы объекта, чем плоские области.

Поэтому гистограммы градиентных путей используются как свойства этого дескриптора:

HOG лица

Обнаружение и кодирование информации о лице из изображения

Используя библиотеку face_recognition, мы можем обнаружить лица на изображении и преобразовать черты лица в 128-мерный вектор.

Создайте файл getVectorFromPicture.py:

touch getVectorFromPicture.py

Дополните файл следующим сценарием:

import face_recognition 
import numpy as np 
import sys 
image = face_recognition.load_image_file("$PATH_TO_IMAGE") 
# detect the faces from the images  
face_locations = face_recognition.face_locations(image) 
# encode the 128-dimension face encoding for each face in the image 
face_encodings = face_recognition.face_encodings(image, face_locations) 
# Display the 128-dimension for each face detected 
for face_encoding in face_encodings: 
      print("Face found ==>  ", face_encoding.tolist())

Давайте выполним getVectorFromPicture.py, чтобы получить репрезентацию черт лица для изображений основателей компании Elastic. В сценарии необходимо изменить переменную $PATH_TO_IMAGE, чтобы задать имя файла изображения.

Теперь мы можем сохранить представление черт лица в Elasticsearch.

Сначала создадим индекс с отображением, содержащим поле с типом dense_vector:

Первая загрузка и настройка учётной записи пользователя

При первой загрузке Jetson Nano нужно пройти стандартный процесс регистрации нового пользователя Ubuntu Linux. Вы выбираете тип используемой клавиатуры, создаёте учётную запись пользователя и выбираете пароль. Когда закончите, увидите пустой рабочий стол Ubuntu Linux.

Python 3.6 и OpenCV уже установлены. Вы можете открыть окно терминала и запустить программы на Python прямо сейчас, как и на любом другом компьютере. Но есть ещё несколько библиотек, которые следует установить, прежде чем запустить приложение камеры дверного звонка.

Подключение

Достаньте Jetson Nano из коробки.

Внутри — Jetson Nano и маленький поддон, который можно использовать в качестве подставки. Больше ничего — ни проводов, ни инструкций.

Сначала вставляем карту microSD. Слот для неё очень хорошо спрятан, он находится с обратной стороны под радиатором.

Затем нужно подключить модуль камеры Raspberry Pi v2.x. Он соединяется со шлейфом. Найдите слот для ленточного кабеля, откройте разъём, вставьте кабель и снова закройте его. Убедитесь, что металлические контакты на ленточном кабеле направлены внутрь к радиатору.

Теперь подключите всё остальное:

  • мышь и клавиатуру к портам USB;
  • монитор с помощью кабеля HDMI;
  • кабель Ethernet к сетевому порту (и убедитесь, что другой конец подключён к маршрутизатору);
  • шнур питания microUSB.

Получится примерно так.

Jetson Nano автоматически загрузится, когда вы подключите кабель питания. На мониторе должен появиться экран установки.

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

Распознавание лиц – это процесс идентификации человека по его лицу, например, для реализации механизма аутентификации (как разблокировка смартфона). Он фиксирует, анализирует и сравнивает паттерны, основанные на деталях лица человека. Этот процесс можно разделить на три этапа:

  • Обнаружение лица: Идентификация человеческих лиц на цифровых изображениях.

  • Кодирование данных о лице: Преобразование черт лица в цифровое представление

  • Сопоставление лиц: Поиск и сравнение черт лица

Мы рассмотрим каждый этап на нашем примере.

Расширение программы

Эта программа — пример использования небольшого количества кода Python 3, работающего на плате Jetson Nano за $100, для создания мощной системы.

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

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

#компьютерноезрение#python#nvidia

Сделайте еще один шаг вперед с расширенным поиском

Распознавание лиц и поиск можно объединить для расширенных сценариев использования. Вы можете использовать Elasticsearch для создания более сложных запросов, таких как geo-queries, query-dsl-bool-query и search-aggregations.

Например, следующий запрос применяет поиск cosineSimilarity к определенному местоположению в радиусе 200 км:

GET /_search 
{ 
  "query": { 
    "script_score": { 
      "query": { 
    "bool": { 
      "must": { 
        "match_all": {} 
      }, 
      "filter": { 
        "geo_distance": { 
          "distance": "200km", 
          "pin.location": { 
            "lat": 40, 
            "lon": -70 
          } 
        } 
      } 
    } 
  }, 
       "script": { 
                "source": "cosineSimilarity(params.query_vector, 'face_encoding')", 
                 "params": { 
                 "query_vector":[ 
                        -0.14664565,
                       0.07806452,
                       0.03944433,
                       ...
                       ...
                       ...
                       -0.03167224,
                       -0.13942884
                    ] 
                } 
           } 
    } 
  } 
}

Комбинирование cosineSimilarity с другими запросами Elasticsearch дает вам неограниченные возможности для реализации более сложных сценариев использования.

Сопоставление лиц

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

Создайте файл recognizeFaces.py: 

touch recognizeFaces.py

В этом сценарии мы извлечем векторы для каждого лица, обнаруженного на входном изображении, и используем эти векторы при создании запроса для отправки в Elasticsearch:

Импортируйте библиотеки:

import face_recognition 
import numpy as np 
from elasticsearch import Elasticsearch 
import sys

Добавьте следующий раздел для подключения к Elasticsearch:

Установите python и библиотеки python

Ubuntu 20 и другие версии Debian Linux поставляются с установленным Python 3. Если у вас не такой пакет, загрузите и установите Python по этой ссылке. 

Чтобы убедиться, что ваша версия является самой свежей, вы можете выполнить следующую команду: 

sudo apt update 
sudo apt upgrade

Убедитесь, что версия Python – 3.x:

python3 -V

Установите pip3 для управления библиотеками Python:

sudo apt install -y python3-pip

Установите cmake, необходимый для работы библиотеки face_recognition:

pip3 install CMake

Добавьте папку cmake bin в каталог $PATH:

export PATH=$CMake_bin_folder:$PATH

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

pip3 install dlib 
pip3 install numpy 
pip3 install face_recognition  
pip3 install elasticsearch

Установка необходимых библиотек python

Хотя в Jetson Nano множество полезных вещей уже предустановлено, есть и некоторые странные упущения. Например, OpenCV устанавливается с привязками Python, но pip и numpy не установлены, а они необходимы для работы с OpenCV. Давайте исправим это.

На рабочем столе Jetson Nano откройте окно терминала и выполните следующие команды. Каждый раз, когда система запрашивает ваш пароль, используйте тот же пароль, который вы ввели при создании учётной записи пользователя.

sudo apt-get update
sudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev

Во-первых, мы обновляем apt, стандартный инструмент установки ПО Linux, который мы будем использовать для установки всего остального. Далее устанавливаем некоторые базовые библиотеки с apt, которые понадобятся нам позже для компиляции numpy и dlib.

Прежде чем идти дальше, нужно создать файл подкачки. У Jetson Nano только 4 ГБ оперативной памяти, этого недостаточно для компиляции dlib. Чтобы решить проблему, настроим файл подкачки, который позволит использовать дисковое пространство в качестве дополнительной оперативной памяти. К счастью, на Jetson Nano есть простой способ создать такой файл. Просто запустите эти две команды.

Шаги по вычислению дескрипторов hog для распознавания и обнаружения лиц

  1. Изображение делится на блоки 8х8 ячеек, и для каждого блока 8х8 ячеек измеряется гистограмма градиентов.
  2. Вектор из 9 сегментов (чисел), соответствующих углам от 0 до 180 градусов, в основном представляет собой гистограмму (с шагом 20 градусов).
  3. Значения этих 64 ячеек (8X8) объединяются в эти 9 сегментов и вставляются кумулятивно.
  4. Это в принципе ограничивает 64 значения 9 значениями.
Расчет HOG

Заключение

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

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

Похожее:  Авторизация в VK для людей / Хабр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *