Распознавание лиц с помощью OpenCV, Python и deep learning

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

  • OpenCV
  • Питон
  • Глубокое обучение

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

Чтобы узнать больше о распознавание лиц с использованием opencv, Python и глубокого обучения, просто продолжайте читать!

Ищете исходный код для этого поста?
Перейти к разделу загрузки.

Распознавание лиц с помощью OpenCV, Python и deep learning

В этом уроке Вы узнаете, как выполнить распознавание лиц с помощью OpenCV, Python и deep learning.

Мы начнем с краткого обсуждения того, как работает распознавание лиц на основе глубокого обучения, включая концепцию "глубокого метрического обучения".

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

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

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

Понимание глубоких вложений распознавания лиц

Итак, как работает deep learning + Face recognition?

Секрет-это метод, называемый глубокий метрический обучения.

Если у вас есть какой-либо опыт с глубоким обучением, вы знаете, что мы обычно обучаем сеть

  • Прием одного входного изображения
  • И выведите классификацию / метку для этого изображения

Однако глубокое метрическое обучение отличается.

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

Для dlib распознавания сети, выходного вектора признаков является 128-д (т. е. список из 128 вещественных чисел), что используется для количественного определения лица. Обучение сети осуществляется с помощью триплетов:

Рис. 1: лицевая признание через глубокие метрические обучения включает в себя “триплет этапе обучения."Триплет состоит из 3 уникальных изображений лица-2 из 3 являются одним и тем же человеком. NN создает 128-d вектор для каждого из 3 изображений граней. Для двух изображений лиц одного и того же человека мы настраиваем вес нейронной сети, чтобы сделать вектор ближе через метрику расстояния. Изображение кредита: Адам Geitgey это “машинное обучение является забавы” в блоге

Здесь мы предоставляем три изображения в сеть

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

В качестве примера, давайте еще раз рассмотрим Рисунок 1 , где мы предоставили три изображения: одно из Чад Смит и двое Уилл Феррелл.

Наша сеть количественно оценивает грани, создавая 128-d вложение (количественное определение) для каждого.

Оттуда, общая идея заключается в том, что мы будем настраивать весов нашей нейронной сети, так что 128-д измерения два Феррел будут ближе друг к другу и дальше от измерений для Чад Смит.

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

Сама сеть была обучена Дэвис Король на набор ~3 млн. изображений. На меткой фасад в дикой природе (лондонской Неделе моды) набор сетевых сравнение с другими государство-оф-арт-методы, достижения 99.38% точности.

Оба Дэвис Кинг (создатель dlib) и Адам Geitgey (Автор face_recognition модуль , который мы будем использовать в ближайшее время) написали подробные статьи о том, как глубокое изучение на основе распознавания лица работает

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

Установка библиотек распознавания лиц

Для распознавания лиц с помощью Python и OpenCV необходимо установить две дополнительные библиотеки

В dlib библиотека, поддерживается Дэвис Король, содержится в нашей реализации “глубокий метрический обучения”, который используется, чтобы построить наше лицо вложениями использоваться для фактического признания процесса.

Тот face_recognition библиотеки, созданные Адам Geitgey, обертывания вокруг dlib распознавания лиц функциональность, что делает его легче работать.

Узнать от Адама Geitgey и Дэвис Король на PyImageConf 2018

Я предполагаю, что ты рад, установленных на вашей системе. Если нет, то не беспокойтесь — просто посетите мой в формате opencv установка учебники страницы и следовать инструкции необходимые для вашей системы.

Оттуда, давайте установим dlib и face_recognition пакеты.

Примечание: для после установки, убедитесь, что вы находитесь в Python виртуальной среды, если вы используете один. Я очень рекомендую виртуальные среды для изоляции ваших проектов-это лучшая практика Python. Если вы следовали моим руководствам по установке OpenCV (и установили виртуальное окружение + virtualenvwrapper ), то вы можете использовать работу команды перед установкой dlib и face_recognition .

Установка dlib без поддержка GPU

Если у вас нет GPU, вы можете установить dlib используя пункт на После этого руководство:

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ workon # optional $ pip install dlib

1

2

$ работают # опционально

$ типун установить dlib

Или вы можете скомпилировать из исходного кода

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ workon # optional $ git clone https://github.com/davisking/dlib.git $ cd dlib $ mkdir build $ cd build $ cmake .. -DUSE_AVX_INSTRUCTIONS=1 $ cmake --build . $ cd .. $ python setup.py install --yes USE_AVX_INSTRUCTIONS

1

2

3

4

5

6

7

8

9

$ работают <ваш ОКР имя здесь> # опционально

$ git для клонирования протоколу https://гитхабе.ком/davisking/dlib.гит

$ CD с dlib

$ команды mkdir строить

$ компакт-диск сборки

$ тмаки .. -DUSE_AVX_INSTRUCTIONS=1

$ с cmake --строить .

$ компакт-диск ..

$ Python для установки.пы установки --да USE_AVX_INSTRUCTIONS

Установка dlib с поддержкой графического процессора (опционально

Если Вы не имеете на CUDA GPU, совместимый вы можете установить dlib с поддержка GPU, делая распознавания лица быстрее и эффективнее.

Для этого я рекомендую установить dlib от источника, как вы будете иметь больше контроля над строить

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ workon # optional $ git clone https://github.com/davisking/dlib.git $ cd dlib $ mkdir build $ cd build $ cmake .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1 $ cmake --build . $ cd .. $ python setup.py install --yes USE_AVX_INSTRUCTIONS --yes DLIB_USE_CUDA

1

2

3

4

5

6

7

8

9

$ работают <ваш ОКР имя здесь> # опционально

$ git для клонирования протоколу https://гитхабе.ком/davisking/dlib.гит

$ CD с dlib

$ команды mkdir строить

$ компакт-диск сборки

$ тмаки .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1

$ с cmake --строить .

$ компакт-диск ..

$ Python для установки.пы установки --да USE_AVX_INSTRUCTIONS --да DLIB_USE_CUDA

Установить face_recognition пакет

В face_recognition модуль устанавливается через простой типун команду

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ workon # optional $ pip install face_recognition

1

2

$ работают <ваш ОКР имя здесь> # опционально

$ типун установить face_recognition

Устанавливатьimutils

Вам также потребуется мой пакет удобных функций, imutils. Вы можете установить его в виртуальной среде Python с помощью pip

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ workon # optional $ pip install imutils

1

2

$ работают <ваш ОКР имя здесь> # опционально

$ типун установить imutils

Набор данных распознавания лиц

Рис. 2. пример распознавания лиц набор данных был создан программно с помощью Python и Бинг изображения API поиска. Показаны шесть персонажей из серии фильмов Парк Юрского периода.

Поскольку Парк Юрского периода (1993) - мой любимый фильм всех времен и народов, и в честь мира Юрского периода: павшее Королевство (2018) будет выпущен в эту пятницу в США, мы собираемся применить распознавание лица образец герои фильмов

Этот набор данных был построен в < 30 минут, используя метод, рассмотренный в моем как (быстро) построить глубокое изучение изображения набора данных учебник. Учитывая этот набор изображений мы

  • Создание 128-d вложений для каждой грани в наборе данных
  • Используйте эти встраивания, чтобы распознавать лица персонажей как в изображениях, так и в видеопотоках

Структура проекта распознавания лиц

Наша структура проекта может быть увидена путем рассматривать выход от дерево команд

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

$ tree --filelimit 10 --dirsfirst . ??? dataset ?   ??? alan_grant [22 entries] ?   ??? claire_dearing [53 entries] ?   ??? ellie_sattler [31 entries] ?   ??? ian_malcolm [41 entries] ?   ??? john_hammond [36 entries] ?   ??? owen_grady [35 entries] ??? examples ?   ??? example_01.png ?   ??? example_02.png ?   ??? example_03.png ??? output ?   ??? lunch_scene_output.avi ??? videos ?   ??? lunch_scene.mp4 ??? search_bing_api.py ??? encode_faces.py ??? recognize_faces_image.py ??? recognize_faces_video.py ??? recognize_faces_video_file.py ??? encodings.pickle 10 directories, 11 files

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

$ дерево --filelimit 10 --dirsfirst

.

наборе данных ??? Аланом_Гранта [22 записей] ??? Клэр_диринг [53 записей] ??? елли_саттлер [31 записей] ??? Иэн_малкольма [41 записей] ??? Джону_Хаммонд [36 записей] ??? Оуэна_Грейди [35 записей] примеров ??? example_01.Формат PNG ??? example_02.Формат PNG ??? example_03.Формат PNG выход ??? lunch_scene_output.Ави видео ??? lunch_scene.МР4 search_bing_api.пы encode_faces.пы recognize_faces_image.пы recognize_faces_video.пы recognize_faces_video_file.пы кодировок.рассол

10 каталогах, 11 файлов

Наш проект имеет 4 каталоги верхнего уровня

  • набор данных/ : содержит изображения лица в течение шести символов, организованных в подкаталоги, основанные на их имена.
  • примеры/ : три лица изображений для тестирования, которые не в наборе данных.
  • выход/ : это где вы можете хранить ваши обработанные распознавание лиц видео. Я ухожу один из моих в папки — классический “обед сцену” из оригинального парка Юрского периода кино.
  • видео/ : ввод видео должны быть сохранены в этой папке. Эта папка также содержит видео” lunch scene", но он еще не претерпел нашу систему распознавания лиц.

Также у нас есть 6 файлов в корневом каталоге

  • search_bing_api.пы : Шаг 1-построение набора данных (я уже сделал это для вас). Чтобы узнать, как использовать Бинг API для создания набора данных с моего скрипта, просто вижу этот блог.
  • encode_faces.пы : Кодировках (128-д векторов) для лица строятся с помощью этого скрипта.
  • recognize_faces_image.пы : распознавать лица в одном изображении (на основе кодировки от ваших данных).
  • recognize_faces_video.пы : распознавать лица в прямом эфире потоковое видео с веб-камеры и вывода видео.
  • recognize_faces_video_file.пы : распознавать лица в видео-файл, находящийся на диске и вывести обработанное видео на диск. Я не буду обсуждать этот файл сегодня, поскольку кости из того же скелета, что и файл видеопотока.
  • кодировки.рассол : лицевая признания кодировки создаются из набора данных через encode_faces.пы , а затем сериализовать на диск.

После создания набора данных изображений (с search_bing_api.ру ), мы будем запускать encode_faces.пы построить вложениями.

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

Кодирование граней с помощью OpenCV и deep learning

Рисунок 3: распознавания лица через глубокое изучение и Python с использованием face_recognition модуля метод генерирует 128-д вещественного числа векторных объектов в лицо.

Прежде чем мы сможем распознавать лица в изображениях и видео, нам сначала нужно количественно оценить лица в нашем наборе обучения. Имейте в виду, что мы не собственно обучение сети здесь — в сети есть уже обученные для создания 128-д вложениями на набор ~3 млн. изображений.

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

Вместо этого проще использовать предварительно подготовленную сеть, а затем использовать ее для создания 128-d вложений для каждой из 218 граней в нашем наборе данных.

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

Чтобы построить наши вложения граней, откройте encode_faces.пы из “Загрузок” , связанные с этой блоге

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# import the necessary packages from imutils import paths import face_recognition import argparse import pickle import cv2 import os

1

2

3

4

5

6

7

# импорт необходимых пакетов

из imutils импорт путей

импорт face_recognition

импорт argparse

импорт огурчик

импорт cv2

импорт ОС

Во-первых, нам нужно импортировать необходимые пакеты. Опять же, обратите внимание, что этот сценарий требует imutils , face_recognition , и установленного opencv. Прокрутите до “установки распознавания библиотеки” , чтобы убедиться, что у вас есть библиотеки готовы пойти на вашей системе.

Давайте оставим наши аргументы командной строки , которые обрабатываются во время выполнения с argparse :

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--dataset", required=True, help="path to input directory of faces + images") ap.add_argument("-e", "--encodings", required=True, help="path to serialized db of facial encodings") ap.add_argument("-d", "--detection-method", type=str, default="cnn", help="face detection model to use: either `hog` or `cnn`") args = vars(ap.parse_args())

9

10

11

12

13

14

15

16

17

# построить синтаксический анализатор аргументов и проанализировать аргументы

ап = argparse.ArgumentParser()

АР.add_argument("я", "--набор данных", требуемый=истинный,

помощи="путь к входной директории лица + картинки")

АР.add_argument("-е", "--кодирование", требуемый=истинный,

помощи="путь к сериализации дБ лицевой кодировки")

АР.add_argument("-д", "--обнаружение-метод", Тип=ул., по умолчанию="Эн",

помогите="распознавание модели использовать: либо `кабанчик` или "CNN"")

параметр args = варс(ап.parse_args())

Если вы новичок в PyImageSearch, позвольте мне обратить Ваше внимание на вышеуказанный блок кода, который станет вам знаком, когда вы будете читать больше моих сообщений в блоге. Мы используем argparse для разбора аргументов командной строки. При запуске программы Python в командной строке можно предоставить дополнительную информацию скрипту, не выходя из терминала. Линии 10-17 не должны быть изменены, поскольку они анализируют входные данные, поступающие с терминала. Проверьте мой блог пост о командной строке аргументов , если эти линии выглядят незнакомыми.

Давайте перечислим флаги аргументов и обсудим их

  • --набор данных : путь к нашей базе данных (мы создали набор данных с search_bing_api.пы описано в способ № 2 на прошлой неделе в блоге).
  • --кодировок : наше лицо кодировки записываются в файл, что этот аргумент указывает.
  • --обнаружения-метод : прежде чем мы можем закодировать лица на изображениях сначала нужно обнаружить их. Или два метода распознавания лиц кабанчик или телеканал CNN . Эти два флага-единственные, которые будут работать --обнаружения-метод .

Теперь, когда мы определили наши аргументы, давайте возьмем пути к файлам в нашем наборе данных (а также выполним две инициализации

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# grab the paths to the input images in our dataset print("[INFO] quantifying faces...") imagePaths = list(paths.list_images(args["dataset"])) # initialize the list of known encodings and known names knownEncodings = [] knownNames = []

19

20

21

22

23

24

25

# захватите пути к входным изображениям в нашем наборе данных

печати("[инфо] количественная оценка лица.)

imagePaths = список(пути.list_images(параметр args["набор данных"]))

# инициализация списка известных кодировок и известных имен

knownEncodings = []

knownNames = []

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

Нам также нужно инициализировать два списка перед нашим циклом, knownEncodings и knownNames , соответственно. Эти два списка будут содержать лицо кодировок и соответствующие имена для каждого человека в наборе данных (строк 24 и 25).

Это время, чтобы начать цикл снова наш Парк Юрского периода характер лица!

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over the image paths for (i, imagePath) in enumerate(imagePaths): # extract the person name from the image path print("[INFO] processing image {}/{}".format(i + 1, len(imagePaths))) name = imagePath.split(os.path.sep)[-2] # load the input image and convert it from BGR (OpenCV ordering) # to dlib ordering (RGB) image = cv2.imread(imagePath) rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

27

28

29

30

31

32

33

34

35

36

37

# loop над путями изображения

для (я, путь_к_образу) в перечисление(imagePaths):

# извлеките имя человека из пути к изображению

печати("[инфо] обработки изображений {}/{}".Формат(я + 1,

лен(imagePaths)))

имя = путь_к_образу.сплит(ОС.путь.сентября)[-2]

# загрузить входное изображение и преобразовать его из BGR (opencv порядка

# к порядку dlib (RGB

изображение = cv2.imread(путь_к_образу)

РГБ = cv2.cvtColor(изображения, cv2.COLOR_BGR2RGB)

Этот цикл будет длиться 218 раз, что соответствует 218 изображениям лица в наборе данных. Мы зацикливание на пути к каждому из изображений на линии 28.

От там, мы извлечем имя человека от продуктам (в нашем подкаталоге правильно называется) на линии 32.

Тогда давайте загрузим изображения при прохождении продуктам для cv2.imread (строка 36).

OpenCV заказывает цветные каналы в BGR, но dlib на самом деле ожидает RGB. Тот face_recognition модуль использует dlib , так прежде чем мы приступим, давайте обменяемся цветовых пространств по линии 37, назвав новый образ в RGB .

Далее, локализуем грани и вычисляем кодировки

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# detect the (x, y)-coordinates of the bounding boxes # corresponding to each face in the input image boxes = face_recognition.face_locations(rgb, model=args["detection_method"]) # compute the facial embedding for the face encodings = face_recognition.face_encodings(rgb, boxes) # loop over the encodings for encoding in encodings: # add each encoding + name to our set of known names and # encodings knownEncodings.append(encoding) knownNames.append(name)

39

40

41

42

43

44

45

46

47

48

49

50

51

52

# обнаружение (x, y)-координаты ограничивающего прямоугольника

# соответствует каждой грани входного изображения

коробки = face_recognition.face_locations(РГБ,

модель=параметры["detection_method"])

# вычислить встраивание лица для лица

кодировки = face_recognition.face_encodings(РГБ, коробки)

# цикл по кодировкам

для кодировки в кодировки:

# добавьте каждую кодировку + имя к нашему набору известных имен и

# кодирования

knownEncodings.добавить(кодирование)

knownNames.добавить(имя)

Это забавная часть сценария!

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

Например, скажем так РГБ содержит картинку (или картинки) Элли Саттлер лицо.

Линии 41 и 42 на самом деле найти и локализовать ее граней в связи с чем лицо коробки . Передаем два параметра face_recognition.face_locations способ

  • РГБ : наши изображения RGB.
  • модель : либо сnn или кабанчик (это значение содержится в нашем аргументов командной строки словаря, связанного с "detection_method" ключ). Метод CNN является более точным,но более медленным. Свинья быстрее, но менее точна.

Затем мы собираемся повернуть ограничение коробки Элли Саттлер лицо в список из 128 номеров на линии 45. Это известно как кодирование лица в векторе и face_recognition.face_encodings метод обрабатывает его для нас.

Оттуда нам просто нужно добавить Ellie Sattler кодирование и имя в соответствующий список ( knownEncodings и knownNames ).

Мы продолжим делать это для всех 218 изображений в наборе данных.

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

Давайте позаботимся об этом сейчас

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# dump the facial encodings + names to disk print("[INFO] serializing encodings...") data = {"encodings": knownEncodings, "names": knownNames} f = open(args["encodings"], "wb") f.write(pickle.dumps(data)) f.close()

54

55

56

57

58

59

# dump кодировки лица + имена на диск

печати("[инфо] сериализация кодировок.)

данные = {"кодирование": knownEncodings, "имена": knownNames}

Ф = открыть(параметр args["кодирование"], "ВБ")

Ф.писать(рассольник.дампов(данных))

Ф.закрыть()

Строка 56 создает словарь с двумя ключами — "кодирование" и "имена" .

Оттуда строк 57-59 вывести имена и кодировки на диск для последующего использования.

Как я должен запустить encode_faces.пы скрипт в терминале?

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ python encode_faces.py --dataset dataset --encodings encodings.pickle [INFO] quantifying faces... [INFO] processing image 1/218 [INFO] processing image 2/218 [INFO] processing image 3/218 ... [INFO] processing image 216/218 [INFO] processing image 217/218 [INFO] processing image 218/218 [INFO] serializing encodings... $ ls -lh encodings* -rw-r--r--@ 1 adrian staff 234K May 29 13:03 encodings.pickle

1

2

3

4

5

6

7

8

9

10

11

12

$ питона encode_faces.пы --набор данных набор данных --кодирование кодировки.шалун

[Информация] количественная оценка лица...

[Информация] обработка Изображения 1/218

[Информация] обработка изображения 2/218

[Информация] обработка изображения 3/218

...

[Информация] обработка изображения 216/218

[Информация] обработка изображения 217/218

[Информация] обработка изображения 218/218

[Информация] сериализация кодировок...

$ ЛС -ЛГ кодировок*

-РВ-р--р--@ 1 Эдриан персонал   234K Май 29 13:03 кодировок.шалун

Как вы можете видеть из наших выходных данных, теперь у нас есть файл с именем кодировки.засолить — этот файл содержит 128-D лицо вложениями для каждого лица в нашем наборе данных.

На мой Титан х ГПУ, обработки всего набора данных потребовалось чуть более минуты, но если вы используете процессор, будьте готовы ждать некоторое время для этого сценария полной!

На моем MacBook Pro (без ГПУ), кодирование 218 изображений требуется 21min 20сек.

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

Распознавание лиц в изображениях

Рисунок 4: Джона Хаммонда лицо, используя Адам Geitgey глубинного обучения face_recognition модуль питона.

Теперь, когда мы создали наши 128-d встраивания лица для каждого изображения в нашем наборе данных, мы теперь готовы распознавать лица в изображении с помощью OpenCV, Python и deep learning.

Открывать recognize_faces_image.пы и вставить следующий код (или, еще лучше, захватить файлы и данные изображения, связанные с этой записи блога с “загрузки” разделе в нижней части этого поста и следуйте вдоль

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# import the necessary packages import face_recognition import argparse import pickle import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-e", "--encodings", required=True, help="path to serialized db of facial encodings") ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-d", "--detection-method", type=str, default="cnn", help="face detection model to use: either `hog` or `cnn`") args = vars(ap.parse_args())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# импорт необходимых пакетов

импорт face_recognition

импорт argparse

импорт огурчик

импорт cv2

# построить синтаксический анализатор аргументов и проанализировать аргументы

ап = argparse.ArgumentParser()

АР.add_argument("-е", "--кодирование", требуемый=истинный,

помощи="путь к сериализации дБ лицевой кодировки")

АР.add_argument("я", "образ", требуемый=истинный,

помощи="путь до изображения")

АР.add_argument("-д", "--обнаружение-метод", Тип=ул., по умолчанию="Эн",

помогите="распознавание модели использовать: либо `кабанчик` или "CNN"")

параметр args = варс(ап.parse_args())

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

Мы будем анализировать три параметра командной строки на строки 8-15

  • --кодировок : путь к рассольник файл, содержащий наше лицо кодировок.
  • --изображение : это изображение, которое переживает распознавания лица.
  • --обнаружения-метод : Вы должны быть знакомы с этим сейчас — мы либо собираетесь использовать кабанчик или телеканал CNN способ в зависимости от возможностей вашей системы. Для скорости, выберите кабанчик и на точность, выберете телеканал CNN .

Важно! Если Вы не

  1. Запуск распознавания кода на ЦП
  2. Или вы с помощью Raspberry Пи
  3. ...вы хотите установить --обнаружения-метод для кабанчик как передает CNN детектора лиц (1) медленно, без GPU и (2) Малина Pi не хватает памяти для запуска Эн либо.

Отсюда давайте загрузим предварительно вычисленные кодировки + имена граней, а затем построим 128-d кодировку граней для входного изображения

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# load the known faces and embeddings print("[INFO] loading encodings...") data = pickle.loads(open(args["encodings"], "rb").read()) # load the input image and convert it from BGR to RGB image = cv2.imread(args["image"]) rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # detect the (x, y)-coordinates of the bounding boxes corresponding # to each face in the input image, then compute the facial embeddings # for each face print("[INFO] recognizing faces...") boxes = face_recognition.face_locations(rgb, model=args["detection_method"]) encodings = face_recognition.face_encodings(rgb, boxes) # initialize the list of names for each face detected names = []

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

# загрузить известные грани и вложения

печати("[инфо] загрузка кодировки.)

данные = рассольник.нагрузки(открытия(параметр args["кодирование"], "РБ").читать())

# загрузить входное изображение и преобразовать его из BGR в RGB

изображение = cv2.imread(параметр args["изображение"])

РГБ = cv2.cvtColor(изображения, cv2.COLOR_BGR2RGB)

# detect The (x, y)-координаты граничных полей, соответствующих

# к каждой грани входного изображения, затем вычислить лицевые вложения

# для каждой грани

печати("[инфо] распознавание лиц.)

коробки = face_recognition.face_locations(РГБ,

модель=параметры["detection_method"])

кодировки = face_recognition.face_encodings(РГБ, коробки)

# инициализировать список имен для каждой обнаруженной грани

имена = []

Линия 19 загружает наши маринованные кодировок лица и имена с диска. Эти данные нам понадобятся позже на этапе распознавания лица.

Затем, по линиям 22 и 23 мы загрузки и преобразования входных изображения к в RGB цветовой канал заказ (так же, как мы делали в encode_faces.пы скрипт).

Затем мы приступаем к обнаружению всех граней во входном изображении и вычисляем их 128-d кодировки на линии 29-31 (эти линии также должны выглядеть знакомо).

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

Затем, Let's loop over facial кодировки :

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over the facial embeddings for encoding in encodings: # attempt to match each face in the input image to our known # encodings matches = face_recognition.compare_faces(data["encodings"], encoding) name = "Unknown"

36

37

38

39

40

41

42

# петля над лицевыми вложениями

для кодировки в кодировки:

# попытка сопоставить каждое лицо во входном изображении с нашим известным

# кодирования

матчи = face_recognition.compare_faces(данные["кодирование"],

кодирование)

имя = "Неизвестный

На линии 37 мы начинаем цикл по лицу кодировки вычисляется из входного изображения.

Тогда происходит магия распознавания лиц!

Мы пытаемся сопоставить каждую грань во входном изображении ( кодирование ) в наши известные кодировки данных (в данные["кодирование"] ), используя face_recognition.compare_faces (линии 40 и 41).

Эта функция возвращает список Верно / Ложные ценности, по одному для каждого образа в нашем наборе данных. Для нашего парка Юрского периода , например, есть 218 изображений в наборе данных и, следовательно, в полученном списке будет иметь 218 логических значений.

Внутренне, compare_faces функция вычисления Евклидова расстояния между кандидатом врезать и все лица в нашем наборе данных

  • Если расстояние ниже некоторого допуска (чем меньше допуск, тем строже будет наша система распознавания лиц), то мы возвращаемся Правда , с указанием лица матча.
  • В противном случае, если расстояние выше порога допуска, мы возвращаем Ложные как лица не совпадают.

По сути, мы используем “более навороченный” к-НН модель для классификации. Обязательно обратитесь к compare_faces реализации для более подробной информации.

Тот имя переменной в конечном счете будут содержать строковое имя человека — сейчас мы оставим все как "Неизвестные" в случае отсутствия “голоса” (строка 42).

Данный наш соответствует списку можно вычислить количество “голосов” для каждого имени (число Истинные ценности, связанные с каждым именем), суммируете голосов, и выберите имя человека, с наиболее соответствующими голосами

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# check to see if we have found a match if True in matches: # find the indexes of all matched faces then initialize a # dictionary to count the total number of times each face # was matched matchedIdxs = [i for (i, b) in enumerate(matches) if b] counts = {} # loop over the matched indexes and maintain a count for # each recognized face face for i in matchedIdxs: name = data["names"][i] counts[name] = counts.get(name, 0) + 1 # determine the recognized face with the largest number of # votes (note: in the event of an unlikely tie Python will # select first entry in the dictionary) name = max(counts, key=counts.get) # update the list of names names.append(name)

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

# проверьте, не нашли ли мы совпадения

если правда в матчах:

# найти индексы всех сопоставленных граней, а затем инициализировать

# словарь для подсчета общего количества раз каждой грани

# был согласован

matchedIdxs = [я для (я, б) в перечислить(играм) если б]

графы = {}

# цикл по сопоставленным индексам и поддерживать счет для

# каждая распознанная грань

для меня в matchedIdxs:

имя = данные["имена"][я]

считается[имя] = подсчитывает.вам(имя, 0) + 1

# определить распознанную грань с наибольшим числом

# голоса (Примечание: в случае маловероятного галстука Python будет

# выбрать первую запись в словаре

имя = Макс(считается, ключ=подсчитывает.получить)

# обновить список имен

имена.добавить(имя)

Если есть Правда, голосов в матчи (линия 45) мы должны определить показатели , где эти Истинные ценности в играм . Мы делаем только то, что на линии 49 , где мы построим простой список matchedIdxs , который может выглядеть так для example_01.Формат PNG :

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

(Pdb) matchedIdxs [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75]

1

2

(Пдб) matchedIdxs

[35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75]

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

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

(Pdb) counts {'ian_malcolm': 40}

1

2

(Пдб) графы

{'ian_malcolm': 40}

Напомним, что у нас есть только 41 фотография Яна в наборе данных, поэтому оценка 40 без голосов для кого-либо еще чрезвычайно высока.

Линия 61 извлекает имя с большинством голосов от считается , в этом случае было бы 'ian_malcolm' .

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

(Pdb) counts {'alan_grant': 5}

1

2

(Пдб) графы

{'alan_grant': 5}

Это, безусловно, меньшая оценка голосов, но все же в словаре есть только одно имя, поэтому мы, вероятно, нашли Алана Гранта.

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

Как показано на рисунке 5 ниже, как Яна Малкольма и Алана Гранта были правильно распознаны, поэтому эта часть скрипта работает хорошо.

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over the recognized faces for ((top, right, bottom, left), name) in zip(boxes, names): # draw the predicted face name on the image cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2) y = top - 15 if top - 15 > 15 else top + 15 cv2.putText(image, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2) # show the output image cv2.imshow("Image", image) cv2.waitKey(0)

66

67

68

69

70

71

72

73

74

75

76

# петля над распознанными гранями

для ((сверху, справа, снизу, слева), имя) в почтовый(ящики, имена):

# нарисуйте предсказанное имя грани на изображении

cv2.прямоугольник(изображения, (слева, сверху), (правый, нижний), (0, 255, 0), 2)

г = топ - 15 , если топ - 15 > 15 еще сверху + 15

cv2.putText(изображения, название, (слева, г), cv2.FONT_HERSHEY_SIMPLEX,

0.75, (0, 255, 0), 2)

# показать выходное изображение

cv2.imshow("образ", образ)

cv2.waitKey(0)

По строке 67 мы начинаем цикл снова обнаружении лица ограничивающего коробки и предсказал имена . Чтобы создать итерируемый объект, чтобы мы могли легко петля через значения, мы вызываем почтовый(ящики, имена) , в результате кортежей, которые мы можем извлечь поле координаты и название.

Мы используем поле координаты чтобы нарисовать зеленый прямоугольник на линии 69.

Мы также используем координаты, чтобы вычислить, где мы должны привлекать текст для человека имя (строка 70), а затем размещать название текста (строк 71 и 72). Если лицо ограничивающего прямоугольника находится на самом верху изображения, нам нужно перевести текст ниже верхней части окна (обрабатывается на линии 70), иначе текст будет отрезан.

Мы затем перейти, чтобы отобразить изображения до нажатия клавиши (строки 75 и 76).

Как запустить скрипт распознавания лиц Python?

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

Затем запустите скрипт, а в качестве двух аргументов командной строки как минимум. Если вы решите использовать метод HoG, обязательно пройдете - обнаружение-способ заграбастать , а также (в противном случае он будет по умолчанию на глубокое изучение детектор).

Давайте идти на это!

Чтобы распознать лицо с помощью OpenCV и Python откройте ваш терминал и выполните наш скрипт

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ python recognize_faces_image.py --encodings encodings.pickle --image examples/example_01.png [INFO] loading encodings... [INFO] recognizing faces...

1

2

3

4

$ питона recognize_faces_image.пы --кодировок кодировок.рассол

--изображения примеров/example_01.формат PNG

[Инфо] загрузка кодировки...

[Информация] признавая лица...

Рис. 5: Алан Грант и Йен Малкольм лица признаются используя наш питона + в формате opencv + глубокий метод обучения.

Ниже приведен второй пример распознавания лиц

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ python recognize_faces_image.py --encodings encodings.pickle --image examples/example_02.png [INFO] loading encodings... [INFO] recognizing faces...

1

2

3

4

$ питона recognize_faces_image.пы --кодировок кодировок.рассол

--изображения примеров/example_02.формат PNG

[Инфо] загрузка кодировки...

[Информация] признавая лица...

Рис. 6. распознавание лиц с использованием opencv и Python.

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

Рисунок 7: распознавания лиц в видео с помощью Python и opencv выполняет, и глубокое изучение.

Теперь, когда мы применили распознавания образов позволяет также применить распознавание лица в видео (в реальном времени), а также.

Важное Примечание: Си-Эн распознавания лиц должна быть использована только в режиме реального времени, если вы работаете с ГПУ (вы можете использовать его с процессора, но ожидать менее 0,5 кадров / с, что обеспечивает порывистый видео). В качестве альтернативы (вы используете процессор), вы должны использовать метод HoG (или даже opencv haar каскады, покрытые в будущем блоге) и ожидать адекватных скоростей.

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

После того как вы схватил “скачать”, откройте recognize_faces_video.пы и следовать вдоль

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# import the necessary packages from imutils.video import VideoStream import face_recognition import argparse import imutils import pickle import time import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-e", "--encodings", required=True, help="path to serialized db of facial encodings") ap.add_argument("-o", "--output", type=str, help="path to output video") ap.add_argument("-y", "--display", type=int, default=1, help="whether or not to display output frame to screen") ap.add_argument("-d", "--detection-method", type=str, default="cnn", help="face detection model to use: either `hog` or `cnn`") args = vars(ap.parse_args())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# импорт необходимых пакетов

из imutils.видео импорт видеопоток

импорт face_recognition

импорт argparse

импорт imutils

импорт огурчик

импорт время

импорт cv2

# построить синтаксический анализатор аргументов и проанализировать аргументы

ап = argparse.ArgumentParser()

АР.add_argument("-е", "--кодирование", требуемый=истинный,

помощи="путь к сериализации дБ лицевой кодировки")

АР.add_argument("-о", "--вывод", Тип=стр,

помощи="путь для вывода видео")

АР.add_argument("-г", "просмотра", Тип=Тип int, по умолчанию=1,

помощи="отображать или нет выходного кадра на экране")

АР.add_argument("-д", "--обнаружение-метод", Тип=ул., по умолчанию="Эн",

помогите="распознавание модели использовать: либо `кабанчик` или "CNN"")

параметр args = варс(ап.parse_args())

Мы импортируем пакеты на линии 2-8 , а затем Продолжить, чтобы проанализировать наши аргументы командной строки на строки 11-20.

У нас есть четыре аргумента командной строки, два из которых вы должны распознать сверху ( --кодировок и --обнаружения-метод ). Другие два аргумента

  • --вывод : путь к выходному видео.
  • --дисплей : флаг, который указывает скрипт для отображения кадра на экране. Значение 1 отображение и значение 0 Не отображать кадры для нашего экрана.

Оттуда мы загрузим наши кодировки и начнем Видеопоток :

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# load the known faces and embeddings print("[INFO] loading encodings...") data = pickle.loads(open(args["encodings"], "rb").read()) # initialize the video stream and pointer to output video file, then # allow the camera sensor to warm up print("[INFO] starting video stream...") vs = VideoStream(src=0).start() writer = None time.sleep(2.0)

22

23

24

25

26

27

28

29

30

31

# загрузить известные грани и вложения

печати("[инфо] загрузка кодировки.)

данные = рассольник.нагрузки(открытия(параметр args["кодирование"], "РБ").читать())

# инициализировать видеопоток и указатель на выходной видеофайл, затем

# позвольте датчику камеры разогреться

печати("[информация] запуск видео потока.)

против = видеопоток(срц=0).начать()

писатель = нет

время.сон(2.0)

Для доступа к нашей камере мы используем Видеопоток класс от imutils. Линия 29 начинается поток. Если в системе установлено несколько камер (например, встроенная веб-камера и внешняя камера USB), можно изменить РКЦ=0 до кгд=1 и так далее.

Мы будем дополнительно писать обработанные кадры видео на диск позже, поэтому мы инициализируем писатель в Никто (Линия 30). Спит по 2 полных секунд позволяет камере, чтобы согреться (строка 31).

Оттуда мы начнем в то время как петли и начинают захватывать и обрабатывать кадры

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over frames from the video file stream while True: # grab the frame from the threaded video stream frame = vs.read() # convert the input frame from BGR to RGB then resize it to have # a width of 750px (to speedup processing) rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) rgb = imutils.resize(frame, width=750) r = frame.shape[1] / float(rgb.shape[1]) # detect the (x, y)-coordinates of the bounding boxes # corresponding to each face in the input frame, then compute # the facial embeddings for each face boxes = face_recognition.face_locations(rgb, model=args["detection_method"]) encodings = face_recognition.face_encodings(rgb, boxes) names = []

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

# loop over frames из потока видеофайлов

а правда:

# захват кадра из резьбового видеопотока

рама = против.читать()

# преобразуйте входной кадр из BGR в RGB, а затем измените его размер

# Ширина 750px (для ускорения обработки

РГБ = cv2.cvtColor(рама, cv2.COLOR_BGR2RGB)

РГБ = imutils.Размер(каркас, Ширина=750)

р = кадр.формы[1] / поплавок(РГБ.формы[1])

# обнаружение (x, y)-координаты ограничивающего прямоугольника

# соответствует каждой грани во входном фрейме, затем вычислить

# встраивания лица для каждого лица

коробки = face_recognition.face_locations(РГБ,

модель=параметры["detection_method"])

кодировки = face_recognition.face_encodings(РГБ, коробки)

имена = []

Наш цикл начинается на линии 34 и первый шаг-возьмите кадр из видео потока (строка 36).

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

Затем, Let's loop over facial кодировки связаны с лица мы только что нашли

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over the facial embeddings for encoding in encodings: # attempt to match each face in the input image to our known # encodings matches = face_recognition.compare_faces(data["encodings"], encoding) name = "Unknown" # check to see if we have found a match if True in matches: # find the indexes of all matched faces then initialize a # dictionary to count the total number of times each face # was matched matchedIdxs = [i for (i, b) in enumerate(matches) if b] counts = {} # loop over the matched indexes and maintain a count for # each recognized face face for i in matchedIdxs: name = data["names"][i] counts[name] = counts.get(name, 0) + 1 # determine the recognized face with the largest number # of votes (note: in the event of an unlikely tie Python # will select first entry in the dictionary) name = max(counts, key=counts.get) # update the list of names names.append(name)

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

# петля над лицевыми вложениями

для кодировки в кодировки:

# попытка сопоставить каждое лицо во входном изображении с нашим известным

# кодирования

матчи = face_recognition.compare_faces(данные["кодирование"],

кодирование)

имя = "Неизвестный

# проверьте, не нашли ли мы совпадения

если правда в матчах:

# найти индексы всех сопоставленных граней, а затем инициализировать

# словарь для подсчета общего количества раз каждой грани

# был согласован

matchedIdxs = [я для (я, б) в перечислить(играм) если б]

графы = {}

# цикл по сопоставленным индексам и поддерживать счет для

# каждая распознанная грань

для меня в matchedIdxs:

имя = данные["имена"][я]

считается[имя] = подсчитывает.вам(имя, 0) + 1

# определение распознанной грани с наибольшим числом

# голосов (Примечание: в случае маловероятного галстука Python

# выберет первую запись в словаре

имя = Макс(считается, ключ=подсчитывает.получить)

# обновить список имен

имена.добавить(имя)

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

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# loop over the recognized faces for ((top, right, bottom, left), name) in zip(boxes, names): # rescale the face coordinates top = int(top * r) right = int(right * r) bottom = int(bottom * r) left = int(left * r) # draw the predicted face name on the image cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) y = top - 15 if top - 15 > 15 else top + 15 cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2)

82

83

84

85

86

87

88

89

90

91

92

93

94

95

# петля над распознанными гранями

для ((сверху, справа, снизу, слева), имя) в почтовый(ящики, имена):

# масштабировать координаты грани

топ = инт(топ * р)

право = инт(право * р)

дно = инт(дно * р)

слева = инт(левую * р)

# нарисуйте предсказанное имя грани на изображении

cv2.прямоугольник(рамка, (слева, сверху), (правый, нижний),

(0, 255, 0), 2)

г = топ - 15 , если топ - 15 > 15 еще сверху + 15

cv2.putText(рамка, название, (слева, г), cv2.FONT_HERSHEY_SIMPLEX,

0.75, (0, 255, 0), 2)

Эти строки тоже идентичны, поэтому давайте сосредоточимся на коде, связанном с видео.

При необходимости, мы собираемся записать кадр на диск, Итак, давайте посмотрим, как пишем видео на диск с opencv работает

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# if the video writer is None *AND* we are supposed to write # the output video to disk initialize the writer if writer is None and args["output"] is not None: fourcc = cv2.VideoWriter_fourcc(*"MJPG") writer = cv2.VideoWriter(args["output"], fourcc, 20, (frame.shape[1], frame.shape[0]), True) # if the writer is not None, write the frame with recognized # faces t odisk if writer is not None: writer.write(frame)

97

98

99

100

101

102

103

104

105

106

107

# если автор видео Не *и* мы должны писать

# выход видео на диск инициализировать писатель

если писатель - это никто и аргументы["выход"] - это не никто:

fourcc у = cv2.VideoWriter_fourcc(*"с mjpg")

писатель = cv2.VideoWriter(параметр args["выход"], fourcc у, 20,

(кадр.формы[1], кадра.форма[0]), правда)

# если writer не None, напишите кадр с распознанным

# faces t odisk

если писатель - это не никто:

писатель.писать(рама)

Предполагая, что у нас есть выходной путь к файлу, указанный в аргументах командной строки, и мы еще не инициализировали видео писатель (строка 99), давайте идти вперед и инициализировать его.

На линии 100, мы инициализируем VideoWriter_fourcc . Fourcc у это 4-значный код, а в нашем случае мы будем использовать “для работы с mjpg” 4-значный код.

Оттуда мы передадим этот объект в VideoWriter вместе с нашими выходного файла путь, кадров в секунду таргет и размеры рамки (линии 101 и 102).

Наконец, если писатель существует, мы можем пойти дальше и написать рамы на диск (линии 106-107).

Давайте рассмотрим, следует ли отображать распознавание лиц на экране

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# check to see if we are supposed to display the output frame to # the screen if args["display"] > 0: cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF # if the `q` key was pressed, break from the loop if key == ord("q"): break

109

110

111

112

113

114

115

116

117

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

# кино

если параметр args["изображение"] > 0:

cv2.imshow("Рама", рамка)

ключ = cv2.waitKey(1) & значение 0xff

# если была нажата клавиша "q", прервите цикл

если ключ == ОГА("вопрос"):

ломать

Если наш дисплей командной строке параметр будет установлен, мы идем вперед и отображения кадра (строка 112) и проверить, если бросить ключ ( "Ъ" ) была нажата (линии 113-116), в какой момент мы перерыв из цикла (строка 117).

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

Распознавание лиц с помощью OpenCV, Python и deep learning

Питон

# do a bit of cleanup cv2.destroyAllWindows() vs.stop() # check to see if the video writer point needs to be released if writer is not None: writer.release()

119

120

121

122

123

124

125

# сделать немного очистки

cv2.destroyAllWindows()

против.остановка()

# проверьте, должен ли быть выпущен пункт записи видео

если писатель - это не никто:

писатель.релиз()

В линии 120-125, мы очистить и освободить дисплей, прямая трансляция, видео и писателя.

Готовы ли вы увидеть сценарий в действии?

Для демонстрации в реальном времени распознавание лиц с использованием opencv и Python в действии, откройте терминал и выполните следующую команду

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ python recognize_faces_video.py --encodings encodings.pickle --output output/webcam_face_recognition_output.avi --display 1 [INFO] loading encodings... [INFO] starting video stream...

1

2

3

4

$ питона recognize_faces_video.пы --кодировок кодировок.рассол

--выход выход/webcam_face_recognition_output.Ави --дисплей 1

[Инфо] загрузка кодировки...

[Информация] запуск видео потока...

Ниже Вы можете найти выходной пример видео, которое я записал, демонстрируя систему распознавания лиц в действии

Распознавание лиц в видеофайлах

Как я уже упоминал в нашем “распознавание структура проекта” разделе, есть дополнительный сценарий включен в “загрузки” для этого блога — recognize_faces_video_file.пы .

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

Я применил наш распознавание кода с популярной “обед сцену” из оригинального "парка Юрского периода" фильм, где актеры сидят за столом, делясь своими заботами с парком

Распознавание лиц с помощью OpenCV, Python и deep learning

Оболочка

$ python recognize_faces_video_file.py --encodings encodings.pickle --input videos/lunch_scene.mp4 --output output/lunch_scene_output.avi --display 0

1

2

3

$ питона recognize_faces_video_file.пы --кодировок кодировок.рассол

--вход видео/lunch_scene.МР4 --выходной выходной/lunch_scene_output.Ави

--дисплей 0

Вот результат

Примечание: Напомним, что наша модель была обучена на четырех участников оригинального состава: Алан Грант и Элли Саттлер, Ян Малкольм и Джон Хаммонд. Модель была не обучены Дональд Дженнаро (адвокат) который является, почему его лицо помечены как “неизвестно”. Это поведение было намеренно (не случайно), чтобы показать, что наша система распознавания лиц может распознавать лица, на которых она была обучена, оставляя лица, которые она не может распознать как “неизвестные”.

И в следующем видео я собрал “нарезку” из парка Юрского периода и мир Юрского периода клипов, в основном из трейлеров

Как мы можем видеть, мы можем видеть, наше распознавание лиц и OpenCV код работает довольно хорошо!

Можно ли использовать код распознавания лица This на Raspberry Pi?

Вроде того, сорта. Есть несколько ограничений, хотя

  1. Raspberry Pi не имеет достаточно памяти, чтобы использовать более точный детектор лица на основе CNN
  2. ...таким образом, мы ограничены свиней вместо этого
  3. За исключением того, что свинья слишком медленно на Пи для обнаружения лица в режиме реального времени
  4. ... поэтому нам нужно использовать каскады Хаара OpenCV

И как только вы получите его работает вы можете ожидать только 1-2 FPS, и даже достижение этого уровня FPS занимает несколько трюков.

Хорошая новость в том, что я вернусь на следующей неделе, чтобы обсудить, как запустить наш распознаватель лица на Raspberry Pi, так что следите за обновлениями!

Краткие сведения

В этом уроке Вы узнали, как выполнить распознавание лиц с помощью OpenCV, Python и deep learning.

Кроме того, мы использовали Дэвис королевская библиотека dlib и Адам Geitgey по face_recognition модуль , который обтекает dlib глубокая метрическая обучения, делая распознавания легче выполнить.

Как мы выяснили, наша реализация распознавания лиц-это оба

  • Точный
  • Возможность выполнения в режиме реального времени с помощью GPU

Надеюсь, вам понравился сегодняшний пост в блоге на Face recognition!

Для того, чтобы скачать исходный код в этот пост, и получать уведомления, когда будущие учебники публикуются на PyImageSearch, просто введите свой email в форму ниже!


Источник: www.pyimagesearch.com

Комментарии: