Python头部姿态估计MTCNN中如何计算偏航和翻滚角。

3
我遇到了MTCNN网络的实现,它能够检测我们在三个轴上的头部运动,分别是偏航、翻滚和俯仰。
以下是关键要素:
bbox, points = detector.detect_faces(frame)

points 给出了从网络预测中得到的关键点列表,如下图所示:

enter image description here

绘图函数:

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 是绕 x 轴旋转(在 -180 到 180 度之间)
Yaw 是绕 z 轴旋转(在 -180 到 180 度之间)."

那么 Yaw 的功能是如何实现的?
Github: https://github.com/fisakhan/Face_Pose/blob/master/pose_detection_mtcnn.py

1个回答

3
Yaw、Roll和Pitch是欧拉角 - 下面的图像显示了一个更容易理解的示例,重要的是要注意旋转不是与全局轴有关,而实际上是与对象轴有关,这就是为什么飞机是一个好东西。此外,还有几种不同格式的欧拉角,要了解得更好,请查看维基百科
根据您提供的github链接,我找到了以下内容:
1.点包含帧内不同面部特征的坐标,其中: X = points [0:5] Y = points [5:10]
2.它们不用度量这些角度:
Roll:-x至x(0为正面,正值为顺时针,负值为逆时针)
Yaw:-x至x(0为正面,正值为向右看,负值为向左看)
Pitch:0至4(0为向上看,1为向前看,> 1为向下看)
3.Yaw,Roll和Pitch的函数不返回角度:
Roll 返回的是左眼的Y坐标减去右眼的y坐标 Yaw 本质上是计算哪只眼睛的噪声在x轴上更接近 - 当您转动头部时,从观察者的角度来看,鼻子似乎更靠近一只眼睛
4. find_pose 可能有您要查找的内容,但我需要进一步研究xfrontal和yfrontal的含义 - 您可能需要直接向github上的人提出问题
更新: 直接向开发人员提出问题后,他们回答如下:
Roll,Yaw和Pitch以像素为单位,并提供面部朝向的估计值。在mtcnn的情况下,Roll为(-50至50),Yaw为(-100至100)。 Pitch为0到4,因为您可以将眼睛和嘴唇之间的距离分成4个单位,其中一个单位在嘴唇到鼻尖之间,而3个单位在鼻尖到眼睛之间。
Xfrontal和Yfrontal以角度(以度为单位)为单位提供姿势(仅偏航和俯仰)沿X和Y轴的值。这些值是在补偿滚动(水平对齐两只眼睛)之后获得的。 https://github.com/fisakhan/Face_Pose/issues/2

我不明白音高范围,它从0到4,为什么最大值是4? - yras8
似乎原因是因为他定义了它的目的,看起来他的项目旨在估计姿态,然后将其传递给其他面部识别算法以获得更好的匹配,而不是提供精细的计算。 - Maxwell Redacted
2
你提到的repo提供了两种估计翻滚、俯仰和偏航的方法。第一种方法从mtcnn的landmarks/points中以像素为单位计算翻滚、俯仰和偏航。第二种方法以角度(度)的形式计算翻滚、俯仰和偏航。第二种方法在find_pose()函数中实现。Xfrontal和Yfrontal分别代表偏航和俯仰,find_pose()函数中的angle代表翻滚。你可以得到的最大值是90度(侧面)。我是那个repo的作者。 - fisakhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接