Не секрет, что задача по поиску человека на видео или фото всегда была актуальна. Но что если один инструмент объединяет в себе, помимо просто детектирования человека, еще и поиск полной маски человеческого лица, расположение рук и пальцев, да и вообще полностью позу человека? Именно такой 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. Чтобы убедиться в правильности работы, вам обязательно нужно попробовать самим “поиграться” с данным инструментом!
Ссылка не моя, но как обзор возможностей – идеально.
Ну и сама документация со всеми примерами и бейзлайнами.
А дальше все ограничивается лишь вашей фантазией!)