В Части 1 обнаружения лиц с использованием MTCNN мы объяснили основные концепции, связанные с этой темой. В этой части мы подробно объясним процесс установки предварительных условий и достижения результата, то есть ориентировки лица на изображения / видео.

Вся эта практическая реализация основана на пакете Python MTCNN. Давайте углубимся в это .

Установка предпосылок

Рекомендуется использовать виртуальную среду Anaconda для обнаружения лиц с использованием MTCNN, поскольку для этого требуется использование определенных версий Tensorflow и Keras, а также других необходимых периферийных библиотек, как указано ниже:

  • Numpy: pip install numpy
  • Matplotlib: pip install maplotlib
  • Подушка: пункт установить подушку
  • Tensorflow: conda install tensorflow == 2.0.0 (убедитесь, что вы установили именно эту версию)
  • MTCNN: pip install mtcnn
  • Keras (удалить): conda удалить keras
  • Keras (установить): conda установить keras

Необходимо удалить Keras и переустановить, чтобы убедиться, что установлена ​​совместимая версия Keras с Tensorflow 2.0.0.

Ошибка, с которой мы столкнулись при использовании Jupyter Notebook, и решение:

jupyter-client 5.3.3 требует pywin32 ›= 1.0; sys_platform == «win32», которая не установлена.

В следующей части блога будет объяснен код для обнаружения лиц и ориентиров на изображениях и видео.

Перво-наперво, давайте начнем с импорта необходимых библиотек, которые были установлены ранее.

# Importing pyplot to plot images used
from matplotlib import pyplot
# Importing rectangle from matplotlib to trace a rectangle on the image
from matplotlib.patches import Rectangle
# Importing circle from matplotlib to trace 5 landmarks (Eyes, Nose and endpoints of the mouth)
from matplotlib.patches import Circle
# Importing the main MTCNN package
from mtcnn.mtcnn import MTCNN

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

{Основной код для распознавания лиц на изображении}

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

# Store the image name in a variable                                # Replace 'test.jpg' with image you want to select
file_name = 'test.jpg'
# load image from file and plot on the graph 
plot_image = pyplot.imread(file_name)

Затем нам нужно создать экземпляр класса MTCNN () из библиотеки MTCNN. Это выполнит все три этапа, описанные в части 1 этой серии.

''' Create an instance of the MTCNN() function/class, using default
    weights. '''
detector = MTCNN()
# This internal method detects faces in the image
face_detection = detector.detect_faces(plot_image)

Если вы напечатаете face_detection, вы получите словарь значений Python, который содержит координату x, координату y, ширину, высоту и достоверность в процентах и ​​ключевых точках лицевых ориентиров.

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

# Function to trace rectangle and landmark points
trace_face(plot_image, face_detection)

Функция trace_face () принимает два аргумента: plot_image, который содержит изображение, на котором алгоритм обнаружит лица, и face_detection, который содержит результат всех трех этапов, выполненных MTCNN ().

Изображение нанесено на график, и мы создаем начальные оси с помощью функции gca () matplotlib, которая используется для получения текущих осей. Чтобы узнать больше о внутренней работе gca, перейдите по этой ссылке.

def trace_face(plot_image, result_list):
# Plots the image
    pyplot.imshow(plot_image)
    
    # Create the current axes for drawing boxes
    axes = pyplot.gca()

Теперь мы отслеживаем прямоугольник на всех обнаруженных лицах с помощью цикла for, где result_list - это список выходных данных, предоставляемых face_detection, как описано выше. Все эти значения хранятся в координатах x, y, ширине и высоте, и прямоугольник добавляется к каждому отдельному лицу с помощью функции add_patch () функции gca ().

for result in result_list:
        ''' Get the coordinates of the rectangle from result for
            every face detected by MTCNN() '''
        x, y, width, height = result['box']
''' Call the rectangular function using above coordinate
            values '''
        traced_rectangle = Rectangle((x, y), width, height,
        fill=False, color='red')
# Trace the rectangle encasing the faces
        axes.add_patch(traced_rectangle)

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

for key, value in result['keypoints'].items():
            # Call the circle function for coordinate values
            key_points = Circle(value, radius=2, color='red')
# Trace the circular points on the faces
            axes.add_patch(key_points)

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

# Plot the faces
pyplot.show()

{Основной код для распознавания лиц на видео}

Для обнаружения лиц в видео мы будем использовать opencv для отслеживания прямоугольных и лицевых ориентиров. Мы начнем с импорта opencv и библиотеки MTCNN.

# Importing opencv library
import cv2
# Importing MTCNN library
from mtcnn import MTCNN

Для захвата видео нам нужно будет создать объект VideoCapture с идентификатором устройства (обычно «0» для внутренних веб-камер) или IP-адресом, если IP-веб-камера будет использоваться в качестве аргумента.

''' Creating a VideoCapture object and passing argument as internal
    camera (0) '''
capture = cv2.VideoCapture(0)

В случае отсутствия или неисправности внутренней веб-камеры вы можете использовать Приложение IP-веб-камеры из магазина Google Play для Android. При нажатии Запустить сервер, как показано ниже -

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

Этот IP-адрес можно использовать вместо «0», который указывает на внутреннюю веб-камеру, как упомянуто выше.

''' Creating a VideoCapture object and passing argument as IP
    address of IP webcam application'''
capture = cv2.VideoCapture("http://192.168.1.70:8080/video")

ПРИМЕЧАНИЕ. IP-адрес может быть разным для каждого пользователя. Мобильный телефон с IP-веб-камерой и ПК, на котором выполняется код, должны быть подключены к одному и тому же Wi-Fi.

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

while True:
      # Continuous capture of the video feed
        __, frame = capture.read()

Затем нам нужно создать экземпляр функции MTCNN () из библиотеки MTCNN внутри цикла while для непрерывного анализа кадра.

''' Create an instance of the MTCNN() function/class, using default
    weights. '''
detector = MTCNN()
# This internal method detects faces in the video feed
result = detector.detect_faces(frame)

После этого мы проверим, являются ли лица, обнаруженные MTCNN (), пустыми или нет, используя -

if result != []:

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

for person in result:
      traced_rectangle = person[‘box’]
      key_points = person[‘keypoints’]

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

# Trace the rectangle encasing the faces 
cv2.rectangle(frame,(traced_rectangle[0], traced_rectangle[1]),
      (traced_rectangle[0] + traced_rectangle[2],
       traced_rectangle[1] + traced_rectangle[3]),(0,155,255),2)

После прорисовки прямоугольника лицевые ориентиры будут отслеживаться с помощью функции circle () для всех пяти точек.

# Trace the circular points on the faces
cv2.circle(frame,(keypoints[‘left_eye’]), 2, (0,155,255), 2)
cv2.circle(frame,(keypoints[‘right_eye’]), 2, (0,155,255), 2)
cv2.circle(frame,(keypoints[‘nose’]), 2, (0,155,255), 2)
cv2.circle(frame,(keypoints[‘mouth_left’]), 2, (0,155,255), 2)
cv2.circle(frame,(keypoints[‘mouth_right’]), 2, (0,155,255), 2)

Чтобы отобразить результат трассировки в видео, мы будем показывать кадр до тех пор, пока приложение не дождется клавиши прерывания, например «q», которая установлена ​​нами.

# Show the tracing in the video feed
cv2.imshow(‘frame’,frame)
# Stop the video capture if 'q' is pressed
if cv2.waitKey(1) &0xFF == ord(‘q’):
      break

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

capture.release()
cv2.destroyAllWindows()

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

Вы можете найти полные коды на DummyKoders Github. Если вы столкнетесь с какими-либо ошибками во время установки или внедрения, пожалуйста, оставьте комментарий ниже, мы свяжемся с вами.