目前头部姿态估计算法使用的数据,一般是300WLP、AFLW2000、Biwi Kinect Head Pose Database
- 300WLP共有数据122450张图片,其中AFW:5207 AFW_Flip:5207 HELEN:37676 HELEN_Flip:37676 IBUG:1786 IBUG_Flip:1786 LFPW:16556 LFPW_Flip:16556
- AFLW2000共有2000张图片
- Biwi Kinect Head Pose Database共有15678张图片
300WLP、AFLW2000真实标签的读取
300WLP数据有成对的图片(jpg)和标签组成的,标签都以mat形式保存的,里面包含了了【'__header__', '__version__', '__globals__', 'pt2d', 'roi', 'Illum_Para', 'Color_Para', 'Tex_Para', 'Shape_Para', 'Exp_Para', 'Pose_Para'】,AFLW2000类似
import h5py
from scipy.io import loadmat
import numpy as np
import math
if __name__ == "__main__":
mat_path = "./300W_LP/AFW/AFW_134212_1_0.mat"
c_mat = loadmat(mat_path)
print(c_mat.keys())
#人脸68个关键点
landmarks = np.array(np.transpose(c_mat['pt2d'])).astype('float').reshape(-1, 2)
print("landmarks \n", landmarks)
#头部姿态角的俯仰、偏航和滚转角(以弧度的形式表示),并将弧度制转变为以度(°)为单位
Pose_Para = c_mat['Pose_Para']
pitch = Pose_Para[0][0] * 180 / math.pi
yaw = Pose_Para[0][1] * 180 / math.pi
roll = Pose_Para[0][2] * 180 / math.pi
print("pitch: {} yaw: {} roll: {}".format(pitch, yaw, roll))
头部姿态输出:
pitch: -18.200389713407343 yaw: 26.86726114746613 roll: -8.615160925626265
300wlp数据集有68个关键点坐标
from scipy.io import loadmat
import cv2
import numpy as np
if __name__ == '__main__':
imagepath = "/home/sunny/dataset/姿态开发/姿态估计_深度学习/300W_LP/AFW/AFW_134212_1_0.jpg"
matpath = "/home/sunny/dataset/姿态开发/姿态估计_深度学习/300W_LP/AFW/AFW_134212_1_0.mat"
img = cv2.imread(imagepath)
c_mat = loadmat(matpath)
print(c_mat.keys())
print(c_mat['pt2d'])
print(c_mat['pt2d'].shape)
landmarks = np.array(np.transpose(c_mat['pt2d'])).astype(
'float').reshape(-1, 2)
for x, y in landmarks:
x = int(x)
y = int(y)
cv2.circle(img, (x, y), 2, (0, 0, 255), 2)
cv2.imshow('0', img)
# cv2.imwrite("test.jpg", img)
cv2.waitKey(0)
Biwi Kinect Head Pose Database数据读取
头部姿态估计的标签都保存在了txt文件中,
import numpy as np
def get_pose_angle(pose_path):
pose_annot = open(pose_path, 'r')
R = []
for line in pose_annot:
line = line.strip('\n').split(' ')
L = []
if line[0] != '':
for nb in line:
if nb == '':
continue
L.append(float(nb))
R.append(L)
R = np.array(R)
T = R[3,:]
R = R[:3,:]
pose_annot.close()
R = np.transpose(R) # 求矩阵的转置
roll = -np.arctan2(R[1][0], R[0][0]) * 180 / np.pi
yaw = -np.arctan2(-R[2][0], np.sqrt(R[2][1] ** 2 + R[2][2] ** 2)) * 180 / np.pi
pitch = np.arctan2(R[2][1], R[2][2]) * 180 / np.pi
return pitch, yaw, roll
if __name__ == '__main__':
post_path = "./Biwi Kinect Head Pose Database/hpdb/01/frame_00036_pose.txt"
pitch, yaw, roll = get_pose_angle(post_path)
print("pitch:{} yaw:{} roll:{}".format(pitch, yaw, roll))
发现不少有问题的图片,如AFLW2000中image03714.jpg(pitch: -29.543809085066318 yaw: -11.260400983618409 roll: -29.381892620601995);image03282.jpg (pitch: 30.66166858048187 yaw: -77.87501653892568 roll: -31.465400845779367);
参考:
【Python】Python读取mat数据集(COFW,300WLP),解析后训练模型用_不会飞的鹰08的博客-CSDN博客