人体动作数据集概述
该数据集分为有两个版本,"NTU RGB+D" 和 "NTU RGB+D 120".
"NTU RGB+D" 包含56,880个样本数据,60种动作。
"NTU RGB+D 120" 这个版本是上一台版本的补充版,涵盖之前的所有数据,并增加了额外的60个类别,总的样本数目为114,480。
这两个数据集都包含每个样本的 RGB 视频、深度图序列、3D 骨骼数据和红外 (IR) 视频。 每个数据集由三个 Kinect V2 摄像头同时捕获。
RGB 视频的分辨率为 1920x1080,深度图和 IR 视频均为 512x424,3D 骨骼数据包含每帧 25 个身体关节的 3D 坐标。
官网下载地址:
GitHub下载地址:
Paper:
下载并解压之后的文件如下,两个数据集中的每个文件/文件夹名称都采用 SsssCcccPpppRrrrAaaa 格式(例如,S001C002P003R002A013),其中 sss 是设置编号(相机设置的角度),ccc 是相机 ID,ppp 是动作执行者(人物)ID,rrr 是动作重复次数(重复1 或 2次),aaa 是动作类标签。
解压之后的NTU-RGB+D-skeletons 数据
其中需要注意的是,数据里有骨骼缺失的样本,“NTU RGB+D”数据集中的 302 个样本和“NTU RGB+D 120”数据集中的 535 个样本有缺失或不完整的骨架数据。 如果您正在进行基于骨架的分析,请在训练和测试过程中忽略这些文件。
此处提供了“NTU RGB+D”数据集中这些样本的列表。
此处提供了“NTU RGB+D 120”数据集中这些样本的列表。
skeleton文件转 txt文件的python脚本可以在这里下载。
skeleton文件转 txt文件的matlab脚本可以在这里下载。
样本数据分析
第一行:该动作的帧数为103
第二行:该动作里面含有的人的数目
第三行:'bodyID', 'clipedEdges', 'handLeftConfidence','handLeftState', 'handRightConfidence', 'handRightState','isResticted', 'leanX', 'leanY', 'trackingState' 这些内容在matlab代码内可以发现。
matlab code 来自官网数据处理样本代码
第四行:关节的个数
第5~29行:每行有11个参数,每个参数表示的意义如下(参考)。一般只考虑人体骨骼的话,就只需要前三个值就行了。
数据可视化
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
class Viewer(object):
def __init__(self, data, J1=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25],
J2=[2, 21, 21, 3, 21, 5, 6, 7, 21, 9, 10, 11, 1, 13, 14, 15, 1, 17, 18, 19, 23, 8, 25, 12]) -> None:
super().__init__()
self.data = data
self.J1 = J1
self.J2 = J2
def draw_animation(self):
prmd = self.data
x = prmd[:,:,0]
y = prmd[:,:,1]
z = prmd[:,:,2]
print(x.shape, np.min(x))
fig = plt.figure(tight_layout=True)
# o = [2,0,1]
o = [2,0,1]
def update_points_lines(num):
# Remove the previous frame
ax.cla()
# set x,y,z limits
ax.set_xlim(np.min(z), np.max(z))
ax.set_ylim(np.min(x), np.max(x))
ax.set_zlim(np.min(y), np.max(y))
# load data
df = prmd[num]
# draw points
ax.scatter3D(df[:, o[0]], df[:, o[1]], df[:, o[2]], cmap='Greens', linewidth=0.2)
# draw line
line = [[] for _ in range(len(self.J1))]
for j in range(len(self.J1)):
point1 = df[self.J1[j]-1]
point2 = df[self.J2[j]-1]
line[j] = ax.plot3D([point1[o[0]],point2[o[0]]],[point1[o[1]],point2[o[1]]],[point1[o[2]],point2[o[2]]], 'gray')
return line
df = prmd[0]
ax = plt.axes(projection='3d')
point_ani = ax.scatter3D(df[:, o[0]], df[:, o[1]], df[:, o[2]], cmap='Greens', linewidth=0.2)
line = [[] for _ in range(len(self.J1))]
for j in range(len(self.J1)):
point1 = df[self.J1[j]-1]
point2 = df[self.J2[j]-1]
line[j] = ax.plot3D([point1[o[0]],point2[o[0]]],[point1[o[1]],point2[o[1]]],[point1[o[2]],point2[o[2]]], 'gray')
ani = animation.FuncAnimation(fig, update_points_lines, range(1, len(prmd)), interval=100, blit=False)
plt.show()
测试数据要求:(frames, joints, 3d) |