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

Ссылка не моя, но как обзор возможностей – идеально.

Ну и сама документация со всеми примерами и бейзлайнами.

А дальше все ограничивается лишь вашей фантазией!)

Комментарии (0)