然后由标准
S
o
f
t
m
a
x
Softmax
Softmax 分类器将其分类到相应的动作类别。
整个模型采用反向传播的端到端方式训练。
ST-GCN 的输入通常为三维的骨架关节点矩阵,用于表示人体在时间序列上的运动状态。对于一个长度为
T
T
T 的时间序列和
V
V
V 个骨架节点,ST-GCN 的输入矩阵为
X
∈
R
V
×
C
×
T
X∈R^{V×C×T}
X∈RV×C×T,其中
C
C
C 表示每个节点的特征维度。如果需要使用
N
N
N 个人体的骨架数据进行训练或预测,则可以将这些数据串联成一个四维张量
X
∈
R
N
×
V
×
C
×
T
X∈R^{N×V×C×T}
X∈RN×V×C×T 作为模型的输入。
骨骼序列通常由每一帧中每个人体关节的 2D 或 3D 坐标表示。在我们的工作中,我们利用时空图来形成骨架序列的层次表示。特别地,我们在具有
N
N
N 个关节和
T
T
T 个框架(帧)的骨架序列上构造了无向时空图
G
=
(
V
,
E
)
G = (V, E)
G=(V,E),该骨架序列具有体内和帧间连接。
1.1 节点集
V
V
V
在这个图中,节点集
V
=
{
v
t
i
∣
t
=
1
,
…
,
T
;
i
=
1
,
…
,
N
}
V = \{v_{ti}|t = 1,…, T;i = 1,…, N\}
V={vti∣t=1,…,T;i=1,…,N} 包括骨架序列中的所有关节。作为 ST-GCN 的输入,节点
F
(
v
t
i
)
F(v_{ti})
F(vti) 上的特征向量由帧
t
t
t 上第
i
i
i 个关节的坐标向量和估计置信度组成。
在动力学数据集上,我们使用来自
O
p
e
n
P
o
s
e
OpenPose
OpenPose 工具箱的 2D 姿态估计,结果输出18个关节;
而在 NTURGB+D 数据集上,我们使用 3D 关节跟踪结果作为输入,得到25个关节。
ST-GCN 可以在两种情况下操作,并提供一致的优越性能。
1.2 边集
E
E
E
从形式上讲,边集
E
E
E 由两个子集组成:
第一个子集描述了每一帧的骨架内连接,记为
E
S
=
{
v
t
i
v
t
j
∣
(
i
,
j
)
∈
H
}
E_S = \{v_{ti}v_{tj} |(i, j)∈H\}
ES={vtivtj∣(i,j)∈H},其中
H
H
H 为自然连接的人体关节集合;
第二个子集包含帧间边,它们连接连续帧中的相同关节,如
E
F
=
{
v
t
i
v
(
t
+
1
)
i
}
E_F = \{v_{ti}v_{(t+1)i}\}
EF={vtiv(t+1)i}。
因此,对于一个特定关节
i
i
i,
E
F
E_F
EF 中的所有边将表示其随时间的轨迹。
2. 空间图卷积神经网络
在深入研究成熟的 ST-GCN 之前,我们首先看一下单帧内的图 CNN 模型。在这种情况下,在时间
τ
τ
τ 的单个帧上,将有
N
N
N 个关节节点
V
t
V_t
Vt,以及骨架边
E
S
(
τ
)
=
{
v
t
i
v
t
j
∣
t
=
τ
,
(
i
,
j
)
∈
H
}
E_S(τ) = \{v_{ti}v_{tj} |t = τ,(i, j)∈H\}
ES(τ)={vtivtj∣t=τ,(i,j)∈H}。回顾二维自然图像或特征图上卷积运算的定义,它们都可以被视为二维网格。卷积运算的输出特征图同样是一个二维网格。使用步长 1 和适当的填充,输出特征映射可以与输入特征映射具有相同的大小。在接下来的讨论中,我们将假设这个条件。给定核尺寸为
K
×
K
K × K
K×K 的卷积算子,以及通道数量为
c
c
c 的输入特征映射
f
i
n
f_{in}
fin。在空间位置
x
x
x 处,单个通道的输出值可以写成:
f
o
u
t
(
x
)
=
∑
h
=
1
K
∑
w
=
1
K
f
i
n
(
p
(
x
,
h
,
w
)
)
⋅
w
(
h
,
w
)
(1)
f_{out}(x) = \sum_{h=1}^{K} \sum_{w=1}^{K}f_{in}(\mathbf{p}(\mathbf{x}, h, w)) · \mathbf{w}(h, w) \tag{1}
fout(x)=h=1∑Kw=1∑Kfin(p(x,h,w))⋅w(h,w)(1) 抽样函数
p
:
Z
2
×
Z
2
→
Z
2
\mathbf p:Z^2 × Z^2→Z^2
p:Z2×Z2→Z2 列举了空间位置
x
x
x 的邻居的位置。在图像卷积,它也可以表示为
p
(
x
,
h
,
w
)
=
x
+
p
′
(
h
,
w
)
\mathbf p (\mathbf x, h, w) = \mathbf x + \mathbf p' (h, w)
p(x,h,w)=x+p′(h,w)。权函数
w
:
Z
2
→
R
c
\mathbf w: Z^2→\mathbb R^c
w:Z2→Rc 提供了一个
c
c
c 维实空间中的权向量,用于计算与采样的
c
c
c 维输入特征向量的内积。注意,权函数与输入位置
x
x
x 无关。因此,在输入图像滤波器权重到处都是共享的。图像域上的标准卷积是通过在
p
(
x
)
\mathbf p(\mathbf x)
p(x) 中编码一个矩形网格来实现的。
可以理解为:图像域上的标准卷积操作可以看作是将一个大小为
K
×
K
K×K
K×K 的矩阵(即卷积核)沿着图像平面上的每个像素点进行移动,并分别与该像素点周围的一小块区域做内积运算。
然后,通过将上述公式扩展到输入特征映射位于空间图
V
t
V_t
Vt 上的情况,来定义图上的卷积操作。即特征映射
f
i
n
t
:
V
t
→
R
c
f_{in}^t:V_t→R^c
fint:Vt→Rc 在图的每个节点上都有一个向量。扩展的下一步是重新定义抽样函数
p
\mathbf p
p 和权重函数
w
\mathbf w
w。
R
c
R^c
Rc 表示
c
c
c 维实数向量空间,其中
R
R
R 表示实数域,
c
c
c 表示向量维度。这里,在第
t
t
t 帧,每个关节点可以映射到它的邻接关节点,但是一个关节点需要
c
c
c 维(即关节点的坐标和置信度)来表示,所以这是一个
c
c
c 维实数向量。
2.1 抽样函数
在图像上,采样函数
p
(
h
,
w
)
\mathbf p(h, w)
p(h,w) 是在相邻像素点关于中心位置
x
x
x 上定义的。在图上,我们同样可以在节点
v
t
i
v_{ti}
vti 的邻居集
B
(
v
t
i
)
=
{
v
t
j
∣
d
(
v
t
j
,
v
t
i
)
≤
D
}
B(v_{ti}) = \{ v_{tj} |d(v_{tj}, v_{ti}) ≤ D \}
B(vti)={vtj∣d(vtj,vti)≤D} 上定义采样函数。这里
d
(
v
t
j
,
v
t
i
)
d(v_{tj}, v_{ti})
d(vtj,vti) 表示从
v
t
j
v_{tj}
vtj 到
v
t
i
v_{ti}
vti 的任何路径的最小长度。因此,抽样函数
p
:
B
(
v
t
i
)
→
V
\mathbf p: B(v_{ti})→V
p:B(vti)→V 可以写成:
p
(
v
t
i
,
v
t
j
)
=
v
t
j
(2)
\mathbf p( v_{ti}, v_{tj}) = v_{tj} \tag{2}
p(vti,vtj)=vtj(2)
注意这里的
v
t
j
v_{tj}
vtj 是节点
v
t
i
v_{ti}
vti 的邻居集
B
(
v
t
i
)
B(v_{ti})
B(vti)中的节点,即当
D
=
1
D=1
D=1 时,采样函数
p
\mathbf p
p 取的是邻接点。
在这项工作中,我们对所有情况使用
D
=
1
D = 1
D=1,即关节节点的
1
−
n
e
i
g
h
b
o
r
1-neighbor
1−neighbor 集。更大的
D
D
D 值留给以后的工作。
2.2 权重函数
与抽样函数相比,权重函数的定义比较复杂。在二维卷积中,中心位置周围自然存在一个刚性网格。所以相邻的像素可以有固定的空间顺序。权重函数可以通过根据空间顺序索引
(
c
,
K
,
K
)
(c, K, K)
(c,K,K) 维的张量来实现。
对于一般的图,就像我们刚刚构造的那样,没有这样的隐式排列。这个问题的解决方案首先在 (Niepert, Ahmed, and Kutzkov 2016) 中进行了研究,其中顺序由该关节点周围的邻居图中的图标记过程定义。我们按照这个思路来构造权重函数。我们没有给每个邻居节点一个唯一的标签,而是将一个关节点
v
t
i
v_{ti}
vti 的邻居集
B
(
v
t
i
)
B(v_{ti})
B(vti) 划分为固定数量的
K
K
K 个子集,其中每个子集都有一个数字标签,从而简化了这个过程。
因此,我们可以得到一个映射
l
t
i
:
B
(
v
t
i
)
→
{
0
,
…
,
K
−
1
}
l_{ti}:B(v_{ti})→\{0,…, K−1 \}
lti:B(vti)→{0,…,K−1},它将邻域中的一个节点映射到它的子集标签。权函数
w
(
v
t
i
,
v
t
j
)
:
B
(
v
t
i
)
→
R
c
\mathbf w(v_{ti}, v_{tj}): B(v_{ti})→R^c
w(vti,vtj):B(vti)→Rc 可以通过索引一个
(
c
,
K
)
(c, K)
(c,K) 维张量或
w
(
v
t
i
,
v
t
j
)
=
w
′
(
l
t
i
(
v
t
j
)
)
(3)
\mathbf w(v_{ti}, v_{tj}) = \mathbf w'(l_{ti}(v_{tj})) \tag{3}
w(vti,vtj)=w′(lti(vtj))(3) 来实现。
这里解释一下,如果我们使用一个
(
c
,
K
)
(c,K)
(c,K) 维张量
w
′
\mathbf w'
w′ 来表示权重向量
w
\mathbf w
w,其中第
k
k
k 个列向量为
w
k
′
\mathbf w'_k
wk′ ,则表达式(3)的意思是:对于给定的关节点
v
t
i
v_{ti}
vti 和邻居节点
v
t
j
v_{tj}
vtj,我们首先计算出
v
t
j
v_{tj}
vtj 的子集标签
l
t
i
(
V
t
j
)
l_{ti}(V_{tj})
lti(Vtj),然后使用这个标签来索引张量
w
′
\mathbf w'
w′ 中的一个列向量
w
l
t
i
(
v
t
j
)
′
\mathbf w'_{l_{ti} (v_{tj}) }
wlti(vtj)′ ,从而得到节点
v
t
i
v_{ti}
vti 和
v
t
j
v_{tj}
vtj 之间的权重向量
w
(
v
t
i
,
v
t
j
)
\mathbf w(v_{ti}, v_{tj})
w(vti,vtj)。
我们将在下面讨论几种分区策略。
2.3 空间图卷积
有了改进的抽样函数和权函数,我们现在用图卷积重写公式(1)如下:
f
o
u
t
(
v
t
i
)
=
∑
v
t
j
∈
B
(
v
t
i
)
1
Z
t
i
(
v
t
j
)
f
i
n
(
p
(
v
t
i
,
v
t
j
)
)
⋅
w
(
v
t
i
,
v
t
j
)
(4)
f_{out}(v_{ti}) = \sum_{v_{tj}∈B(v_{ti})} \frac{1}{Z_{ti}(v_{tj})} f_{in}(\mathbf{p}(v_{ti}, v_{tj})) · \mathbf{w}(v_{ti}, v_{tj}) \tag{4}
fout(vti)=vtj∈B(vti)∑Zti(vtj)1fin(p(vti,vtj))⋅w(vti,vtj)(4) 其中归一项
Z
t
i
(
v
t
j
)
=
∣
v
t
k
∣
l
t
i
(
v
t
k
)
=
l
t
i
(
v
t
j
)
∣
Z_{ti}(v_{tj}) =| {v_{tk}|l_{ti}(v_{tk}) = l_{ti}(v_{tj})} |
Zti(vtj)=∣vtk∣lti(vtk)=lti(vtj)∣ 等于相应子集的基数。添加这个术语是为了平衡不同子集对输出的贡献。
将公式(2)和公式(3)代入公式(4),得到
f
o
u
t
(
v
t
i
)
=
∑
v
t
j
∈
B
(
v
t
i
)
1
Z
t
i
(
v
t
j
)
f
i
n
(
v
t
j
)
⋅
w
(
l
t
i
(
v
t
j
)
)
(5)
f_{out}(v_{ti}) = \sum_{v_{tj}∈B(v_{ti})} \frac{1}{Z_{ti}(v_{tj})} f_{in}( v_{tj}) · \mathbf{w}(l_{ti}(v_{tj})) \tag{5}
fout(vti)=vtj∈B(vti)∑Zti(vtj)1fin(vtj)⋅w(lti(vtj))(5)值得注意的是,如果我们将图像视为一个规则的 2D 网格,这个公式可以类似于标准的 2D 卷积。例如,为了类似于3×3卷积运算,我们在以像素为中心的3×3网格中有一个9像素的邻居。然后将邻居集划分为9个子集,每个子集有一个像素。
2.4 时空建模
在时空图中,考虑每个节点不仅具有空间位置信息,还具有时间信息。因此,我们需要重新定义邻域
B
(
v
t
i
)
B(v_{ti})
B(vti),以包括时间上相邻的节点,即连接连续帧上的相同关节。
也就是说,我们扩展了邻域的概念,也包括时间连接的关节为
B
(
v
t
i
)
=
{
v
q
j
∣
d
(
v
t
j
,
v
t
i
)
≤
K
,
∣
q
−
t
∣
≤
⌊
Γ
/
2
⌋
}
(6)
B(v_{ti}) = \{v_{qj} |d(v_{tj} , v_{ti}) ≤ K, |q − t| ≤ \lfloor Γ/2 \rfloor \} \tag{6}
B(vti)={vqj∣d(vtj,vti)≤K,∣q−t∣≤⌊Γ/2⌋}(6)该公式定义了每个节点的邻域
B
(
v
t
i
)
B(v_{ti})
B(vti) 包括空间距离不超过
K
K
K 个单位的所有节点和时间距离不超过
⌊
Γ
/
2
⌋
\lfloor Γ/2 \rfloor
⌊Γ/2⌋ 个单位的所有节点。其中,参数
Γ
Γ
Γ 控制时间上要包含在邻域图中的范围,因此可以称为时间内核大小。
我们需要修改标签映射,以适应带时间维度的邻域。由于时间轴是有序的,对于以
v
t
i
v_{ti}
vti 为中间位置的空间时间邻域,我们直接修改标签映射
l
S
T
l_{ST}
lST,为:
l
S
T
(
v
q
j
)
=
l
t
i
(
v
t
j
)
+
(
q
−
t
+
⌊
Γ
/
2
⌋
)
×
K
(7)
l_{ST}(v_{qj}) = l_{ti}(v_{tj}) + (q-t+\lfloor Γ/2 \rfloor) ×K \tag{7}
lST(vqj)=lti(vtj)+(q−t+⌊Γ/2⌋)×K(7)其中
l
t
i
(
v
t
j
)
l_{ti}(v_{tj})
lti(vtj) 是在一个单帧
t
t
t 上关节
i
i
i 的邻接点
j
j
j 的标签映射,而
(
q
−
t
+
⌊
Γ
/
2
⌋
)
×
K
(q-t+\lfloor Γ/2 \rfloor) ×K
(q−t+⌊Γ/2⌋)×K 用于在时间维度上对标签进行编码。这样,我们就对所构造的时空图进行了定义良好的卷积运算。
这里解释一下具体方法:在节点
v
t
i
v_{ti}
vti 的标签映射
l
t
i
(
v
t
j
)
l_{ti}(v_{tj})
lti(vtj) 的基础上,加上一个时间维度的偏移量
(
q
−
t
+
⌊
Γ
/
2
⌋
)
×
K
(q-t+\lfloor Γ/2 \rfloor) ×K
(q−t+⌊Γ/2⌋)×K 。这个公式中,
q
q
q 表示当前样本节点
v
q
j
v_{qj}
vqj 在时空图中所处的时间步(帧)数,也可以理解为当前处理的时刻,通常是通过滑动一个窗口来进行遍历处理。
t
t
t 表示
v
t
i
v_{ti}
vti 所处的时间步(帧)数。
因此,
q
−
t
q−t
q−t 就是当前节点
v
q
j
v_{qj}
vqj 与节点
v
t
i
v_{ti}
vti 之间的时间距离。对于当前节点
v
q
j
v_{qj}
vqj,它的时间邻域可以由
(
q
−
⌊
Γ
/
2
⌋
,
q
+
⌊
Γ
/
2
⌋
)
(q−⌊Γ/2⌋,q+⌊Γ/2⌋)
(q−⌊Γ/2⌋,q+⌊Γ/2⌋) 表示。
最简单、最直接的划分策略是使用子集,即整个邻居集本身。在这种策略中,每个相邻节点上的特征向量都有一个具有相同权重向量的内积。实际上,这种策略类似于(Kipf和Welling 2017)中引入的传播规则。它有一个明显的缺点,在单帧情况下,使用该策略相当于计算所有相邻节点的权值向量与平均特征向量之间的内积。这对于骨架序列分类来说是次优的,因为在这个操作中可能会丢失局部微分性质。形式上,我们有
K
=
1
,
l
t
i
(
v
t
j
)
=
0
,
∀
i
,
j
∈
V
K = 1, l_{ti}(v_{tj}) = 0,∀i, j∈V
K=1,lti(vtj)=0,∀i,j∈V。
3.2 Distance partitioning 距离分区策略
另一种自然划分策略是根据节点到中心位置节点
v
t
i
v_{ti}
vti 的距离
d
(
⋅
,
v
t
i
)
d(·,v_{ti})
d(⋅,vti) 对邻居集进行划分。在这项工作中,因为我们设置
D
=
1
D = 1
D=1,邻居集将被分成两个子集,其中
D
=
0
D = 0
D=0 表示中心位置节点本身,其余的邻居节点都在
D
=
1
D = 1
D=1 子集中。因此,我们将有两个不同的权重向量,它们能够建模局部微分性质,如关节之间的相对平移。形式上,我们有
K
=
2
,
l
t
i
(
v
t
j
)
=
d
(
v
t
j
,
v
t
i
)
K = 2, l_{ti}(v_{tj}) = d(v_{tj}, v_{ti})
K=2,lti(vtj)=d(vtj,vti)。
3.3 Spatial configuration partitioning 空间结构分区策略
由于人体骨架在空间上是局部化的,我们仍然可以在分区过程中利用这种特定的空间结构。我们设计了一种策略,将邻居集分为三个子集:1)根节点本身;2)向心群:比根节点更接近骨架重心的相邻节点;3)否则为离心群。在这里,骨架中所有关节的平均坐标被视为其重心。这种策略的灵感来自于身体部位的运动可以大致分为同心运动和偏心运动。形式上,我们有:
l
t
i
(
v
t
j
)
=
{
0
,
r
j
=
r
i
1
,
r
j
<
r
i
2
,
r
j
>
r
i
(8)
l_{ti}(v_{tj}) = \begin{cases} 0, & r_j = r_i \\ 1, & r_j < r_i \\ \tag{8} 2, & r_j > r_i \end{cases}
lti(vtj)=⎩⎨⎧0,1,2,rj=rirj<rirj>ri(8) 其中
r
i
r_i
ri 是训练集中所有帧中从重心到关节
i
i
i 的平均距离。
更先进的分区策略有望带来更好的建模能力和识别性能。
4. 可学习边缘重要性加权
在动作的过程中,一个关节可能会在身体的多个部位出现。而且,在不同部位的动力学建模中,这些关节外观的重要性是不同的。在这个意义上,我们在时空图卷积的每一层上都加上一个可学习的掩码
M
M
M。
掩码将根据
E
S
E_S
ES 中每个空间图边的学习重要性权重,将节点的特征贡献扩展到其邻近节点。这样就能更好地处理不同部位之间的关节信息。我们发现添加该掩码可以进一步提高 ST-GCN 的识别性能。
基于图的卷积的实现不像 2D 或 3D 卷积那样简单。在这里,我们提供了实现 ST-GCN 用于基于骨架的动作识别的细节。
我们采用类似于(Kipf和Welling 2017)中的图卷积实现。单帧内关节的体内连接由表示自连接的邻接矩阵
A
\mathbf A
A 和单位矩阵
I
\mathbf I
I 表示。在单帧情况下,采用第一个分区策略的 ST-GCN 可以用以下公式实现
f
o
u
t
=
Λ
−
1
2
(
A
+
I
)
Λ
−
1
2
f
i
n
W
(9)
\mathbf f_{out} = \mathbf Λ^{-\frac{1}{2}} (\mathbf A+ \mathbf I) \mathbf Λ^{-\frac{1}{2}} \mathbf f_{in} \mathbf W \tag{9}
fout=Λ−21(A+I)Λ−21finW(9)其中
Λ
i
i
=
∑
j
(
A
i
j
+
I
i
j
)
Λ^{ii} = \sum_{j} (A^{ij} + I^{ ij})
Λii=∑j(Aij+Iij)。这里将多个输出通道的权值向量叠加形成权值矩阵
W
\mathbf W
W。在实际操作中,在时空情况下,我们可以将输入特征映射表示为
(
C
,
V
,
T
)
(C, V, T)
(C,V,T) 维的张量。图卷积是通过执行
1
×
Γ
1 × Γ
1×Γ 标准 2D 卷积来实现的,并将得到的张量与第二维上的归一化邻接矩阵
Λ
−
1
2
(
A
+
I
)
Λ
−
1
2
\mathbf Λ^{-\frac{1}{2}} (\mathbf A+ \mathbf I) \mathbf Λ^{-\frac{1}{2}}
Λ−21(A+I)Λ−21 相乘。
对于具有多个子集的分区策略,即距离分区和空间结构分区,我们再次利用了这种实现。但注意,现在邻接矩阵被分解成几个矩阵,其中
A
+
I
=
∑
j
A
j
\mathbf A + \mathbf I = \sum_{j} \mathbf A_j
A+I=∑jAj。例如,在距离划分策略中,
A
0
=
I
,
A
1
=
A
\mathbf A_0 = \mathbf I, \mathbf A_1 = \mathbf A
A0=I,A1=A,表达式(9)转换成:
f
o
u
t
=
∑
j
Λ
j
−
1
2
A
j
Λ
j
−
1
2
f
i
n
W
j
(10)
\mathbf f_{out} = \sum_j \mathbf Λ_j^{-\frac {1}{2}} \mathbf A_j \mathbf Λ_j^{-\frac {1}{2}} \mathbf f_{in} \mathbf W_j \tag{10}
fout=j∑Λj−21AjΛj−21finWj(10) 其中,类似地
Λ
j
i
i
=
∑
k
(
A
j
i
k
)
+
α
Λ^{ii}_j = \sum_{k} (A^{ik}_j)+α
Λjii=∑k(Ajik)+α。这里我们设
α
=
0.001
α = 0.001
α=0.001 以避免
A
j
A_j
Aj 中的空行。
可学习边缘重要性加权的实现非常简单。对于每个邻接矩阵,我们都伴随一个可学习权值矩阵
M
\mathbf M
M,我们分别用
(
A
+
I
)
⊗
M
(\mathbf A + \mathbf I)⊗\mathbf M
(A+I)⊗M 和
A
j
⊗
M
\mathbf A_j⊗ \mathbf M
Aj⊗M 代替表达式(9)中的矩阵
A
+
I
\mathbf A + \mathbf I
A+I 和表达式(10)中的
A
j
\mathbf A_j
Aj 。这里
⊗
⊗
⊗ 表示两个矩阵之间的元素乘积。掩码
M
M
M 被初始化为一个全一矩阵。
在每个 ST-GCN 单元后,我们以0.5概率随机剔除特征,以避免过拟合。第4和第7时序卷积层的步长设为2作为池化层。然后对得到的张量进行全局池化,得到每个序列的256维特征向量。最后,我们将它们输入
S
o
f
t
M
a
x
SoftMax
SoftMax 分类器。使用随机梯度下降学习模型,学习率为0.01。我们在每10个 epoch 之后将学习率衰减0.1。
我们评估了 ST-GCN 在基于骨骼的动作识别实验中的性能。我们在两个性质截然不同的大规模动作识别数据集上进行了实验:Kinetics 人类动作数据集(Kinetics) (Kay et al 2017)是迄今为止最大的无约束动作识别数据集,NTURGB+D (Shahroudy et al 2016)是最大的内部捕获动作识别数据集。