
Не секрет, что задача по поиску человека на видео или фото всегда была актуальна. Но что если один инструмент объединяет в себе, помимо просто детектирования человека, еще и поиск полной маски человеческого лица, расположение рук и пальцев, да и вообще полностью позу человека? Именно такой open-source инструмент создала всем известная компания google.
Mediapipe уже довольно активно, а главное, эффективно используется для детектирования многочисленных лиц на фото, для обучения моделей распознавания эмоций, для качественного выполнения упражнений при занятиях спортом, для преобразования языка жестов в письменный язык и много другое!
Я же хочу поделиться с вами своим опытом изучения инструмента mediapipe. И для начала покажу вывод, где вы сможете наблюдать работу трех моделей: нахождения рук, нахождения точек лица, определения позы человека и, в конце концов, все вместе.
Итак, чуть подробнее о каждом инструменте.
——- Код для запуска Hand Detection с настройками ——-
import cv2 import numpy as np import mediapipe as mp import time import os # Подключаем камеру cap = cv2.VideoCapture(0) cap.set(3, 640) # Width cap.set(4, 480) # Lenght cap.set(10, 100) # Brightness mpHands = mp.solutions.hands hands = mpHands.Hands(False) npDraw = mp.solutions.drawing_utils pTime = 0 cTime = 0 #Зацикливаем получение кадров от камеры while True: success, img = cap.read() img = cv2.flip(img,1) # Mirror flip imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id, lm in enumerate(handLms.landmark): h,w,c = img.shape cx, cy = int(lm.x*w), int(lm.y*h) # print(id, lm) if id == 8 or id == 12: cv2.circle(img, (cx,cy),10,(255,0,255),cv2.FILLED) npDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) cTime = time.time() fps = 1/(cTime-pTime) pTime = cTime cv2.putText(img, str(int(fps)),(10,30), cv2.FONT_HERSHEY_PLAIN, 2, (255,0,0), 2) # ФреймРейт cv2.imshow('python', img) if cv2.waitKey(20) == 27: # exit on ESC break cv2.destroyWindow("python") cap.release() cv2.waitKey(1)
Hand Detection

Собственно, вся суть заключается в поиске 3 значений в пространстве для каждый из 21 точки руки.


Зная точное расположение этих точек, можно строить различные модели. Само же детектирование руки можно крайне гибко настраивать – от минимальной и максимальной точности для определения рук до количества рук на кадре. На снимках выше можно заметить выделенные точки на двух пальцах (это я добавил выделение с помощью cv) и, что очень важно, крайне хорошо найдены точки скрытых пальцев.
Face Mesh

Как говорится – результат на лицо! Суть работы ровно такая же- найти 3 координаты в пространстве определенных точек. Только теперь не на руках, а на лице человека, и самих точек не 21, а 468! Именно с подобной технологией делаются все, полюбившиеся пользователями Instagram, маски. Но на одних развлечениях сценарии использования точно не кончаются.
Poseestimation + Holistic

Я думаю, что принцип поиска позы вам уже ясен! 33 точки по всему телу (на снимке без ног) в трехмерном пространстве. Бонусом я запустил сразу 3 модели одновременно.

——- Код для запуска всех модулей одновременно ——-
import cv2 import numpy as np import mediapipe as mp import time import os # Подключаем камеру cap = cv2.VideoCapture(0) cap.set(3, 640) # Width cap.set(4, 480) # Lenght cap.set(10, 100) # Brightness mp_drawing = mp.solutions.drawing_utils mp_holistic = mp.solutions.holistic pTime = 0 cTime = 0 #Зацикливаем получение кадров от камеры while True: with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: ret, frame = cap.read() # Recolor Feed image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # Make Detections results = holistic.process(image) # print(results.face_landmarks) # face_landmarks, pose_landmarks, left_hand_landmarks, right_hand_landmarks # Recolor image back to BGR for rendering image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # Draw face landmarks mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_TESSELATION, mp_drawing.DrawingSpec(color=(80,110,10), thickness=1, circle_radius=1), mp_drawing.DrawingSpec(color=(80,256,121), thickness=1, circle_radius=1) ) # Right hand mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS) # Left Hand mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS) # Pose Detections mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS) cTime = time.time() fps = 1/(cTime-pTime) pTime = cTime cv2.putText(image, str(int(fps)),(10,30), cv2.FONT_HERSHEY_PLAIN, 2, (255,0,0), 2) # ФреймРейт cv2.imshow('python', image) if cv2.waitKey(1) == 27: # exit on ESC break cv2.destroyWindow("python") cap.release() cv2.waitKey(1)
Давайте рассмотрим на более конкретных примерах:
С целью безопасности важно не допускать неквалифицированных работников в серверную или клиентов в рабочую зону. C данным инструментом от google мы сможем уберечься от подобных ситуаций.
Конечно же использование телефона в рабочее время — крайне нежелательно. Уже научно доказано, что постоянное наличие телефона в руках плохо сказывается на производительности сотрудника. К тому же, бывают случаи, когда сотрудникам недопустимо брать телефоны клиентов в руки. С mediapipe можем проверить и это.

Как определить насколько приятным оказалось общение клиента с менеджером? С mediapipe мы без проблем можем разобрать различные эмоции.
Никакому работодателю не понравится, когда работник спит в течении рабочего дня. Но не всегда есть время и возможность следить за этим. Теперь мы с легкостью можем идентифицировать спящего человека по позе и закрытым глазам.

Собственно, я вам показал только малую часть того, что на самом деле умеет mediapipe – на все не хватило бы и десятка статей! Но поверьте, разбираться в данном инструменте- крайне интересно! А если вы ведете разработку на android или владеете с++, тогда вам открыты еще больше функций mediapipe:
Расположение зрачков глаз
Сегментация волос
Выделение границ объектов в 3D кубе
Детектирование различных объектов
Следование камеры за движением объекта
И многое другое!
Кроме того, что у данного инструмента огромное количество различных сценариев применения (а учитывая, что различные функции можно комбинировать- еще больше!), его метрики качества очень даже хороши. Да еще и запускается mediapipe без GPU. Чтобы убедиться в правильности работы, вам обязательно нужно попробовать самим “поиграться” с данным инструментом!
Ссылка не моя, но как обзор возможностей – идеально.
Ну и сама документация со всеми примерами и бейзлайнами.
А дальше все ограничивается лишь вашей фантазией!)
