В Части 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», которая не установлена.
- pypiwin32: pip install pypiwin32
В следующей части блога будет объяснен код для обнаружения лиц и ориентиров на изображениях и видео.
Перво-наперво, давайте начнем с импорта необходимых библиотек, которые были установлены ранее.
# 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. Если вы столкнетесь с какими-либо ошибками во время установки или внедрения, пожалуйста, оставьте комментарий ниже, мы свяжемся с вами.