Меня часто спрашивают, как использовать ИИ для определения определенных поз и можно ли извлечь из них эмоции.
Итак, мой коллега (Гугу Сибаньони) и я решили поиграть с отслеживанием ИИ.
Изображение выше — это конечная цель использования ИИ для распознавания позы и, в конечном итоге, эмоций.
Настройка нашей среды
Мы будем использовать открытый CV для распознавания изображений и медиаканал для наших моделей распознавания позы.
!pip install mediapipe opencv-python
Мы будем использовать только две зависимости и время, чтобы перейти к настройке нашей ленты в реальном времени в opencv.
Чтобы настроить нашу ленту в реальном времени, нам нужно импортировать наши зависимости;
import mediapipe as mp import cv2
Начнем с настройки медиаканала
mp_drawing = mp.solutions.drawing_utils mp_holistic = mp.solutions.holistic
Итак, мы настроили наши утилиты для рисования, которые будут отображать наши различные обнаружения из нашей целостной модели на экране через open cv.
Тогда целостный просто вводит нашу целостную модель.
Внутри медиаканала у нас есть множество моделей, с которыми мы можем поиграть, а именно;
Сетка для лица, радужная оболочка, руки, поза, целостная, сегментация селфи.
Теперь мы хотим настроить open cv для визуализации в реальном времени;
cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() cv2.imshow('Real Time Imaging', frame) if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
В первой строке кода мы объявляем cap в качестве нашей переменной и назначаем cv2 (псевдоним вызова open cv) для VideoCapture и выбираем 0 в качестве порта камеры по умолчанию.
Мы начинаем наш хитрый цикл, сообщая open cv, что, пока cap, наша переменная открыта, затем возвращаем кадр и считываем/рендерим cap на экран.
Затем мы используем функцию imshow для рендеринга изображения в кадрах и маркировки кадра в режиме реального времени.
Наш условный оператор if начинает прерывающую часть оператора, мы говорим cv2 подождать 10 миллисекунд, а затем, когда я нажму q, прервать цикл while, который запускает кадр.
Затем отпустите программу и разбейте все окна.
Иногда из оператора if разрыв и q не работают, поэтому у нас может быть только следующий код. Просто чтобы убедиться, что код сломан.
cap.release() cv2.destroyAllWindows()
Теперь мы хотим наложить целостные компоненты нашего медиаканала на файл opencv.
Мы начинаем с копирования открытого кода cv в следующую ячейку Jupyter, затем мы добавим в него целостный код.
cap = cv2.VideoCapture(0) with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: while cap.isOpened(): ret, frame = cap.read() image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = holistic.process(image) print(results) cv2.imshow('Real Time Imaging', frame) if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Новый дополнительный код, который мы добавили, мы используем оператор wit и импортированный ранее mp_holistic. В методе mp.holistic мы добавляем min_detection_confidence и min_tracking_confidence и присваиваем им значение 0,5.
with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:
Мы настроим целостную строку для всей строки, так как не хотим каждый раз вводить целостную.
Для модели с высокой достоверностью отслеживания мы должны установить для min_detection trust и min_tracking_confidence более высокие значения.
Мы также добавили следующие строки кода;
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = holistic.process(image) print(results)
В первой строке кода мы перекрашиваем наше изображение и захватываем наш кадр, который у нас есть выше, и перекрашиваем то, что возвращается в кадре, используя cv2.COLOR-BGR2RGB, мы хотим, чтобы цвет модели был представлен в RGB.
Мы берем изображение, которое перекрашивается, передаем его в целостную модель и назначаем переменную с именем results. Затем мы распечатываем наши результаты, так как мы еще ничего не рисуем на экране.
Когда мы запустим наш код, мы увидим всплывающее окно.
Затем распечатайте то, что нам нужно, просто чтобы проверить, все ли у нас в порядке.
Теперь, когда мы убедились, что все работает нормально, мы можем продолжить и рисовать их на нашем экране, начиная с ориентиров лица, мы можем удалить отпечаток и добавить рисунок.
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_TESSELATION) cv2.imshow('Real Time Imaging', frame)
Первая строка кода image = cv2.cvtColor(image, cv2.COLOR_RGB2RGB2) преобразует рендеринг изображения из BGR (которое мы преобразовали выше) в RGB, так как именно так open cv хочет свои изображения.
Затем мы продолжаем рисовать, используя mp_drawing.draw_landmarks, и передаем переменную изображения сверху, результаты нашего face_landmarks и модели mp.holistic.FACEMESH_TESSELATION.
Итак, мы хотим изменить изображение, которое мы визуализируем, поэтому мы хотим изменить наше необработанное изображение кадра на нашу переменную изображения.
Таким образом, у нас есть все наши различные ориентиры лица, нарисованные на экране, что довольно круто и очень жутко, я перемещаю свое лицо в любом направлении, которое оно продолжает отслеживать мое лицо.
Теперь мы хотим нарисовать остальные наши ориентиры, а именно позу, правую руку и левую руку.
mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_TESSELATION) mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS) mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS) mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS) cv2.imshow('Real Time Imaging', image)
Как видно выше, модель отслеживает мое лицо, правую и левую руки, включая мою позу, очень точно и очень быстро. Мы также можем отслеживать все тело с помощью отслеживания позы.
Ну, у нас есть белый и красный, и мы хотим немного раскрасить наши ориентиры, мы сделаем это, используя модель спецификаций рисования.
mp_drawing.DrawingSpec(color=(0,0,255), thickness=2, circle_radius=2)
Мы можем передать цвет, толщину и радиус окружности, мы хотим передать линию и цвет окружности.
mp_drawing.DrawingSpec(color=(0,0,255), thickness=2, circle_radius=2)
Мы сделаем это для лица, позы и рук.
cap = cv2.VideoCapture(0) # Initiate holistic model with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: while cap.isOpened(): 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) # 1. 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) ) # 2. Right hand mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS, mp_drawing.DrawingSpec(color=(80,22,10), thickness=2, circle_radius=4), mp_drawing.DrawingSpec(color=(80,44,121), thickness=2, circle_radius=2) ) # 3. Left Hand mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS, mp_drawing.DrawingSpec(color=(121,22,76), thickness=2, circle_radius=4), mp_drawing.DrawingSpec(color=(121,44,250), thickness=2, circle_radius=2) ) # 4. Pose Detections mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS, mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=4), mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2) ) cv2.imshow('Raw Webcam Feed', image) if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Он выглядит красивее в цвете, и это формирует первый этап нашего отслеживания.