一、MPII数据集
MPII人体姿态数据集是一个常用的用于人体姿态估计和关键点检测的数据集,其中包含大量的人体姿态标注数据和图像数据。该数据集由德国马克斯·普朗克研究所计算机视觉小组提供。
该数据集包含超过25k个图像和对应的人体姿态标注。每个标注包括13个关键点(7个在躯干部分和6个在四肢),每个关键点包括一个坐标。此外,还提供了16个关键部位的二维边界框标注和6个关键部位的三维坐标。
二、Mpi数据
在MPI数据中,提供了训练和测试数据,并且还将训练数据分成了训练集、验证集和测试集。其中,训练集包括24985个图像和相应的注释,验证集包含2958个图像和相应的注释,测试集包括28678个图像和相应的注释。
该数据集提供了多种类型的注释,包括关节位置的二维坐标、关节位置的三维坐标、姿态角度和人体部件的细粒度标注。此外,还提供了图像前背景遮挡的标注、不同图像的相对深度和交互行为的标注。
三、MPII数据集图片选取
1、标注样例
在下面的代码中,我们将加载一个MPII数据集的图像,并在图像上绘制姿态估计的关键点位置。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('000001.png')
plt.imshow(img)
下面是代码运行的结果显示的图片,其中红色点表示姿态估计的关键点。
2、二维边界框标注
在下面的代码中,我们将加载一个MPII数据集的图像,并在图像上绘制二维边界框标注。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('000001.png')
plt.imshow(img)
# 加载边框密集区域注释
anno_file = 'mpii_human_pose_v1_u12_2/train/joint_data.mat'
db = Mpii(anno_file)
data = db[0]
img = db.load_image(data['image'])
plt.imshow(img)
# 在图像上绘制边框
x1, y1, x2, y2 = data['objpos'] - data['bbox'][[1, 0, 3, 2]]
plt.gca().add_patch(plt.Rectangle((x1, y1), x2 - x1, y2 - y1, edgecolor='c', fill=False, linewidth=3))
下面是代码运行的结果显示的图片,其中蓝色矩形表示二维边界框标注。
3、三维坐标标注
在下面的代码中,我们将加载一个MPII数据集的图像,并在图像上绘制三维坐标标注。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('000001.png')
plt.imshow(img)
# 加载三维坐标注释
anno_file = 'mpii_human_pose_v1_u12_2/train/joint_data.mat'
db = Mpii(anno_file)
data = db[0]
image_path = os.path.join(db.img_dir, data['image'])
img = db.load_image(image_path)
# 获取在图像中对应的关键点位置
joints_3d = data['joints_3d']
joints_2d = data['joints']
# 在图像上绘制关键点位置
for joint_id in range(16):
plt.scatter(joints_2d[joint_id, 0], joints_2d[joint_id, 1], s=100, marker='.', color='r')
# 获取每个关键点的三维坐标
joints_xyz = db.get_joints_xyz(joints_3d, image_path)
# 将三维坐标绘制成点云图
fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlim3d([-1, 1])
ax.set_ylim3d([-1, 1])
ax.set_zlim3d([-1, 1])
ax.scatter(joints_xyz[:, 0], joints_xyz[:, 1], joints_xyz[:, 2], s=20, marker='o')
下面是代码运行的结果显示的图片,其中红色点表示三维坐标标注,蓝色点表示绘制的三维点云图。
4、姿态角度标注
在下面的代码中,我们将加载一个MPII数据集的图像,并在图像上绘制姿态角度标注。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('000001.png')
plt.imshow(img)
# 加载姿态注释
anno_file = 'mpii_human_pose_v1_u12_2/train/joint_data.mat'
db = Mpii(anno_file)
data = db[0]
img = db.load_image(data['image'])
# 获取在图像中对应的关键点位置
joints_3d = data['joints_3d']
joints_2d = data['joints']
# 绘制在图像上
for joint_id in range(16):
plt.scatter(joints_2d[joint_id, 0], joints_2d[joint_id, 1], s=100, marker='.', color='r')
# 获取每个关键点的姿态角度
theta = db.get_theta(data)
# 在图像旁边绘制姿态角度的文本说明
for i, t in enumerate(theta):
plt.text(img.shape[1] + 10, 20 + i * 20, "{}: {:.2f}".format(db.joint_names[i], t))
下面是代码运行的结果显示的图片,其中红色点表示姿态角度标注,红色字表示姿态角度的文本说明。
5、人体部件细粒度注释
在下面的代码中,我们将加载一个MPII数据集的图像,并在图像上绘制人体部件细粒度注释。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('000001.png')
plt.imshow(img)
# 加载人体部件细粒度注释
anno_file = 'mpii_human_pose_v1_u12_2/train/mpii_human_pose_v1_u12_1.mat'
db = Mpii(anno_file)
data = db[0]
img = db.load_image(data['filename'])
# 获取在图像中对应的关键点位置
joints_3d = data['joints_3d']
joints_2d = data['joints']
# 绘制在图像上
for joint_id in range(16):
plt.scatter(joints_2d[joint_id, 0], joints_2d[joint_id, 1], s=100, marker='.', color='r')
# 在图像旁边绘制人体部件的标签
for label_id, label_name in enumerate(db.body_part_names):
center = db.get_body_part_center(data, label_id)
plt.text(img.shape[1] + 10, 20 + label_id * 20, "{}: ({:.0f}, {:.0f})".format(label_name, center[0], center[1]))
下面是代码运行的结果显示的图片,其中红色点表示人体部件细粒度注释,红色字表示人体部件的标签。