Распознавание лиц с IP камеры. Хранение и обработка данных для принятия решения (Face recognition from a webcam. Storage and processing of data for decision making)

Автор: | 18.12.2019

Статья на стадии разработки !!!

Введение

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

Ответил: «В базе данных должны храниться признаки объектов (лиц), а не фото. В качестве признаков могут быть расстояния между характерными точками лица либо набор признаков (дескриптор лица), получаемых на выходе уже обученной сверточной нейронной сети (см. ссылку  или  ссылку). Для оценки похожести полученного списка признаков с теми, что уже есть в базе данных, можно использовать Евклидово расстояние

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

 Подключение IP камеры и доступ к видео-потоку

В предыдущих работах исследования по распознаванию лиц проводились на основе видео-потока, считываемого с встроенной в notebook Web-камеры через метод cv2.VideoCapture(0). Дальнейшие исследования  будут проводиться с подключением  IP камеры по следующей схеме:

Код для подключения видео-потока  с IP камеры приводится ниже.

import cv2
import numpy as np
#cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture('rtsp://192.168.0.100:554/user=admin_password=tlJwpbo6_channel=0_stream=0.sdp?real_stream')
while(True):
        ret, frame = cap.read()
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
           break
cap.release()
cv2.destroyAllWindows()

Для того, чтобы установить камеру и определить значение параметра (адрес доступа к видеопотоку камеры) в методе cv2.VideoCapture(..?????…)  рекомендую прослушать информацию по ссылкам:

Из этой информации я выделил следующую последовательность действий:

  1. Подключаю IP камеру напрямую к роутеру (по кабелю витая пара через разъем LAN с обоих сторон).
  2. Через браузер вхожу в настройки роутера (192.168.0.1>admin-admin>DHCP>Список клиентов DHCP). Здесь определяю локальный адрес камеры (у меня 192.168.0.100).
  3. Выполняю настройки браузера Internet Explorer (выключаю защищенный режим и допускаю использование ActiveX элементов).
  4. Через браузер Internet Explorer вхожу в настройки  камеры (192.168.0.100>admin- у меня без пароля). При этом предлагается подгрузить плагины ActiveX, разрешаю. В итоге должно запуститься приложение NETSurveillince WEB вместе с видео от камеры. Возможно, что после входа будет только серый экран. Это означает, что вы не выполнили все указанные выше настройки браузера Internet Explorer.
  5. В настройках камеры выбираю (Devicecfg>пиктограмма шестеренка>NetService>dblclick на RTSP). В окне отображается порт камеры — 554.
  6. Устанавливаю и запускаю программу ONWIF. В ней нахожу мою камеру по IP адресу и нажимаю Livevideo. Внизу окна для видео копирую адрес к видеопотоку моей камеры.

До сих пор у меня камера была подключена к роутеру по проводу. Для подключения ее к беспроводной WiFi сети выполняю следующие действия:

  1. Через браузер Internet Explorer вхожу в настройки  камеры (192.168.0.100>admin- у меня без пароля).
  2. Далее выбираю   Devicecfg>пиктограмма шестеренка>NetService>dblclick на Wifi>Search>моя сеть (SV)>OK.

Перед нажатием кнопки ОК необходимо изменить IP адрес, как у своей сети — у меня 3-е число в IP адресе должно быть 0. В противном случае камера не подключится.

Теперь  снова вхожу через браузер в настройки роутера (192.168.0.1>admin-admin>DHCP>Список клиентов DHCP). Здесь определяю новый локальный адрес камеры:  192.168.0.101. Раньше у камеры был адрес 192.168.0.100.

Решение проблемы торможения видео-потока с IP камеры

При первых запусках приложения обнаружил, что происходит торможение видео-потока с IP камеры при подключении детектора лица (detector.detect_faces(frame) ). Возможное решение этой проблемы:

  • обрабатывать не все кадры в потоке;
  • уменьшать размер кадров.

Ниже приводится код, в котором комбинируются оба подхода.

import cv2
import numpy as np
from mtcnn.mtcnn import MTCNN
detector = MTCNN()
cap = cv2.VideoCapture('rtsp://192.168.0.100:554/user=admin_password=tlJwpbo6_channel=0_stream=0.sdp?real_stream')
while(True):
    ret, frame = cap.read()
    for i in range(20): # skip 20 frames
    cap.grab()
    grabbed, frame = cap.read()
 
    scale_percent = 50 # percent of original size
    width = int(frame.shape[1] * scale_percent / 100)
    height = int(frame.shape[0] * scale_percent / 100)
    dim = (width, height)
    # resize image
    frame = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)
    #frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    result = detector.detect_faces(frame)

    # Result is an array with all the bounding boxes detected.
    bounding_box = result[0]['box']
    keypoints = result[0]['keypoints']
    cv2.rectangle(frame,
          (bounding_box[0], bounding_box[1]),
          (bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
          (0,155,255),
          1)
    cv2.circle(frame,(keypoints['left_eye']), 3, (0,155,255), 1)
    cv2.circle(frame,(keypoints['right_eye']), 2, (0,155,255), 1)
    cv2.circle(frame,(keypoints['nose']), 3, (0,155,255), 1)
    cv2.circle(frame,(keypoints['mouth_left']), 3, (0,155,255), 1)
    cv2.circle(frame,(keypoints['mouth_right']), 3, (0,155,255), 1)

    cv2.line(frame,(keypoints['left_eye']),keypoints['right_eye'], (0,0,255), 1)
    cv2.line(frame,(keypoints['left_eye']),keypoints['nose'], (0,255,0), 1)
    cv2.line(frame,(keypoints['right_eye']),keypoints['nose'], (255,0,0), 1)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Формализация задачи распознавания лиц

Компьютер понимает язык цифр, может их сравнивать. Цифровое фото представляет описание цвета множества точек (см. BMP format). Сравнивать все точки фото из базы данных с точками кадра (frame), полученного от веб камеры, едва ли имеет смысл по ряду причин:

  • точки лица занимают только часть изображения;
  • цвет точек может меняться в зависимости от освещения;
  • положение лица относительно камеры разное.

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

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

Значения признаков могут быть зашиты в программу как обычные условия (см. Распознавание лиц на основе OpenCV для C++). Также значения признаков могут определяться через обучение  (см. Распознавание фигур на основе «выборки для обучения»), затем они вместе с идентификатором объекта  записываются в  базу данных (текстовый файла, как описано в разделе Создание базы данных признаков из статьи Идентификация образов по цвету, текстуре и форме).

Один из важнейших моментов  задачи распознавания объектов — как определить субъекта среди претендентов на сходство с ним по множеству признаков. Обычно степень соответствия распознаваемого лица и лиц из базы данных определяется через Евклидово расстояние. Возможны и другие подходы, они  рассмотрены в статьях Идентификация по множеству признаков. Основы и Идентификация по множеству признаков при помощи нейросети»

Машинное обучение на основе нейронной сети приходит на смену традиционному алгоритмическому подходу во многих задачах, включая и распознавание лиц. Если в классическом подходе к распознаванию программист анализирует объект для распознавания и выделяет отличительные признаки, то  нейронные сети сами решают эту задачу (см. Нейросетевая видеоаналитика. Как это работает. Возможности и ограничения.).

В статьях  Машинное обучение распознавать поворот лица а также Адекватность и оптимальность нейронной сети  затронуты проблемы, которые вплотную относятся и к задаче распознавания лица на основе НС.

Методы получения признаков и распознавания лиц на основе нейронных сетей сегодня считаются более предпочтительными (см. в youtube лекцию Андрея Созыкина  Распознавание человека по лицу). Хотя, могут быть и компромиссные решения. Например, для точности сравнения лиц рекомендуется их выравнивать  к положению в анфас. Это можно выполнить на основе  3D-реконструкции лица по характерным точкам. По характерным точкам также можно отфильтровывать не совсем корректные изображения (см.  Выбор признаков для фильтрации изображений).

 

Полезные ссылки:

 

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

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