#python #opencv #neural-network
Вопрос:
Я столкнулся с реализацией MTCNN
сети,которая способна обнаруживать движение нашей головы по 3-м осям, называемым рысканием, креном и шагом.
Вот важнейшие элементы:
bbox, points = detector.detect_faces(frame)
points
дает мне список ключевых точек из предустановки сети, таких как:
Функция рисования:
def draw_landmarks(frame, bb, points):
# draw rectangle and landmarks on face
cv2.rectangle(frame,(int(bb[0]),int(bb[1])),(int(bb[2]),int(bb[3])),green,2)
cv2.circle(frame, (points[0], points[5]), 2, (255,0,0), 2)# eye
cv2.circle(frame, (points[1], points[6]), 2, (255,0,0), 2)
cv2.circle(frame, (points[2], points[7]), 2, (255,0,0), 2)# nose
cv2.circle(frame, (points[3], points[8]), 2, (255,0,0), 2)# mouth
cv2.circle(frame, (points[4], points[9]), 2, (255,0,0), 2)
Теперь для обнаружения некоторого движения головы по другой оси были определены функции рыскания и крена.
def Roll(points):
return points[6] - points[5]
def Yaw(points):
le2n = points[2] - points[0]
re2n = points[1] - points[2]
return le2n - re2n
Теперь, сказав, что:
"Roll is the rotation about the x axis (between -180 and 180 deg)
Yaw is the rotation about the z axis (between -180 and 180)."
Как именно здесь работает функция рыскания?
Github: https://github.com/fisakhan/Face_Pose/blob/master/pose_detection_mtcnn.py
Ответ №1:
Рыскание, крен и тангаж являются углами Эйлера — на изображении ниже показан более простой для понимания пример, важно отметить, что повороты не связаны с глобальной осью, а фактически связаны с осью объектов, поэтому о плоскости стоит подумать. Также существует несколько различных форматов углов Эйлера, чтобы лучше понять, посмотрите на вики
просмотрев ссылку на github, которую вы предоставили, я нашел следующее:
- точки содержат координаты различных черт лица в кадре, где:
X=очки[0:5] Y=очки[5:10]
- они не измеряют эти углы в градусах:
Бросок: -от x до x (0 — фронтальный, положительный — по часовой стрелке, отрицательный-против часовой стрелки)
Рыскание: -от x до x (0-фронтальное, положительное смотрит вправо, отрицательное смотрит влево)
Шаг: от 0 до 4 (0 смотрит вверх, 1 смотрит прямо, >1 смотрит вниз)
- функция рыскания, крена и тангажа не возвращает угол наклона:
то, что возвращается Roll
, — это координата Y левого глаза минус координата y правого глаза
Yaw
по сути, вычисляется, к какому глазу ближе шум по оси x — когда вы поворачиваете голову, нос кажется ближе к одному глазу наблюдателя
find_pose
возможно, у вас есть то, что вы ищете, но мне нужно провести дальнейшее исследование того, что подразумевается под xfrontal и yfrontal — возможно, вам придется задать вопрос непосредственно человеку на github
Обновление: после того, как вы задали вопрос непосредственно разработчику, они ответили следующим:
Крен, рыскание и шаг указаны в пикселях и дают представление о том, куда смотрит лицо. В случае крена mtcnn (от -50 до 50), рыскание (от -100 до 100). Шаг от 0 до 4, потому что вы можете разделить расстояние между глазами и губами на 4 единицы, где одна единица находится между губами и кончиком носа, а 3 единицы-между кончиком носа и глазами.
Xfontal и Yfontal обеспечивают позу (только рыскание и шаг) с точки зрения углов (в градусах) вдоль оси X и Y соответственно. Эти значения получаются после компенсации крена (выравнивания обоих глаз по горизонтали).
Комментарии:
1. Я не получаю диапазон высоты тона, который составляет от 0 до 4, почему это 4 как максимальное значение?
2. похоже, причина в том, что то, что он определил, похоже, что его проект предназначен для оценки позы, которую вы затем можете передать другим алгоритмам распознавания лиц, чтобы получить лучшее соответствие, в отличие от точного расчета
3. Репо, о котором вы упомянули, предоставляет два метода оценки крена, тангажа и рыскания. Первый метод вычисляет крен, тангаж и рыскание в пикселях по ориентирам/точкам mtcnn. Второй метод вычисляет крен, тангаж и рыскание в терминах ангелов (градусов). Второй метод реализован в функции find_pose (). X-Фронтальная и Y-фронтальная — это рыскание и высота тона. угол в функции find_pose () — это крен. Максимальное значение, которое вы можете получить для любого из них, составляет 90 градусов (грань профиля). Я автор этого репо.