迳口麒麟舞(KirinDance AI)姿态拆分和动作比较评分算法 - 第三版

背景和目的

现有姿态识别解算的算法较多,也有能够在前端运行的版本,但主要是单点识别,缺乏能够对前后动作进行有效识别、理解和切分的算法。为提高用户使用麒麟舞训练系统时更有效的方向引导和实时反馈,同时后期便于回放教学和对比差异,设计了新算法来实现此目标。

设计过程

1.拆分和等效替代

为了简化问题,我们先实现单关节的轨迹处理,并且用鼠标轨迹替代人体关节动作来提高调试效率。值得注意的是,JavaScript鼠标事件会在用户停顿鼠标时停止调用MouseMove回调函数导致渲染停止,但实际进行姿态识别时采用定速率方式,不会有该问题。
图1
如上图,使用半透明色(rgba(192,192,192,0.1),30px)的笔刷在canvas上对每个MouseMove事件发生的偏移位置(e.offsetX, e.offsetY)进行连接,可以得到鼠标轨迹,暂时将其等效为关节的运动轨迹。

2.速度追踪

为了对动作进行便于理解的切分,定义两段动作之间用节点(N)隔开。观察到用户两个动作之间经常伴有某些关节的速度变化,首先考虑检测关节在速度上的明显降低。同时为了防止节点过多,规定

前后节点距离 > d1 且 当前速度 < v

为了提高运算速度,采用了曼哈顿距离。其中d、v需要根据设备分辨率进行调参,对于1920x1200的分辨率,d=200px,v=250px/s是比较合适的。将以上节点定义为一类节点。
请添加图片描述
如上图,黑色点为起点,青色点(aquamarine)为一类节点。经过测试,发现对于上图的方向突变类轨迹效果显著,但对于平滑轨迹,如果不加切分存在过长的可能。而且如果遇到掉帧等等情况导致的速度突然加快,会无法识别转角。

3.角度追踪

对于平滑的轨迹,隔一段圆弧进行切割,考虑到后期教学便于引导的点位,选取1/4圆弧作为切分标准。同时为了防止过多的节点,也需要规定最小节点距离:

前后节点距离 > d2 且 A > a

由于MouseMove的调用频率大约是30次/s,定义每检测一次得到一个step的位置,那么每秒得到30个step,记倒数第p个step的位置为 P − p P_{-p} Pp,最后一个节点的位置为 N − 1 N_{-1} N1,那么上式有
A = ∣ ∣ P − 1 N − 1 ⋅ P − 1 P − p ∣ ∣ P − 1 N − 1 ∣ ⋅ ∣ P − 1 P − p ∣ ∣ A=\left|\frac{|\mathbf{P_{-1}N_{-1}} \cdot \mathbf{P_{-1}P_{-p}|}}{|\mathbf{P_{-1}N_{-1}} |\cdot| \mathbf{P_{-1}P_{-p}}|}\right| A= P1N1P1PpP1N1P1Pp
详细的说,我们考虑两个向量,一个从当前位置指向最近的节点,另一个从当前位置指向p个step前的位置。为了方便计算、记录轨迹,将每p个step的位置记录下来,记为细节节点,同时利用上一个细节节点和上一个节点的位置计算角度和速度,以此判断是否要添加新的节点。

在这里插入图片描述
记通过这种途径添加的节点为二类节点。注意p不宜过大,否则会导致角度延迟过大;也不宜过小,否则会因为距离过小导致计算得到的夹角误差(波动)较大。p应当根据姿态轨迹刷新频率调参,在30fps的情况下,3是比较合适的。d和a的调参应当根据分辨率进行,在1920x1200的分辨率下,100和45是比较合适的。
如上图,蓝色点(skyblue)为起点,粉色点(pink)为二类节点。观察到两个粉色节点之间近似为1/4圆弧。另外角度追踪也可以辅助切分方向突变类的轨迹,只是在夹角过小时不如速度追踪算法有效。
请添加图片描述
上图将两种算法混合使用以达到更好的效果。

3.轨迹比较和评分

为了比较用户的关节轨迹和标准样本的轨迹,我们假定上述录制的是标准轨迹。现在我们要实现录制用户轨迹并实时评分。
在这里插入图片描述

如上图,选用五角星作为示例。将上述示例轨迹录制完成后导出为对象,记为标准节点位置和记录时间、标准细节节点位置和记录时间(或帧数)。为了方便计算,采用开始录制后的相对时间(或帧数)。同样,为了加快访问,在节点和细节节点之间建立了基于相同时间的索引关系,也就是记录当前节点时间对应的细节节点索引(index)和下一个节点时间对应的细节节点索引。

在这里插入图片描述
如上图,绘制起始点(第一个标准节点),等待用户按下鼠标。
在这里插入图片描述
如上图,用户轨迹是黄色较细的轨迹(wheat,10px)。灰色是由程序控制,计算用户按下鼠标至今经过的时间 t t t(这个时间也可以替换成帧数),然后根据历史记录的标准节点和标准详细节点时间复现原始轨迹,将记录时间不足 t t t但是仍未画出的详细节点画出。同时在绘制每个标准细节节点时,记录用户的位置为细节节点。(此处采用同步方法,即最临近的时间点)
在这里插入图片描述
如上图,当 t t t超过一个节点时,画出下一个节点的位置作为引导,同时将上一段的标准细节节点和用户的细节节点计算残差平方和,得到分数
s c o r e = ∑ a b ( u i x − s i x ) 2 + ( u i y − s i y ) 2 1000 ( b − a ) score=\frac{\sum^b_a(u_{ix}-s_{ix})^2+(u_{iy}-s_{iy})^2}{1000(b-a)} score=1000(ba)ab(uixsix)2+(uiysiy)2
其中u是用户细节节点,s时标准细节节点,a和b是节点对应的细节节点索引,标准节点只有两个可以不参与评分。1000可以视为难度系数来调整。将分数绘制在这段用户细节节点的中间节点的坐标处。
在这里插入图片描述
如上图,以此类推完成5段的评分,然后用户可以回放每一段的运行轨迹进行学习。
请添加图片描述
如上图,值得注意的是,由于细节节点相对时间的存在,轨迹的完全重合并不是唯一评分标准。如果途中的速度不一致,采样的节点也会有较大区别,导致额外的扣分。

在这里插入图片描述
如上图,考虑到实际使用时,引导轨迹和用户轨迹叠在一起会影响观看难以辨别(因为下面还会播放视频),会将两条轨迹分开。分开后可能会导致全轨迹出现相对偏移量,因此每一段在评分时会将u和s的坐标都分别减去第一个u和s的坐标来消除对评分的影响。

4.姿态的动作切分

1-3步已经完成了一个鼠标轨迹关节模仿小游戏(难度可调,玩法多样,评分苛刻对吧),但是要进行动作评分远不止于此,因此对上述功能进行了封装,记为追踪类。接下来我们要在追踪类上面整合封装成动作评分(记为动作类)。

首先要进行标准视频的动作切分。这是为了前后评分独立性,也方便用户回放学习。我们将人体按照PoseNet的记录方案分为17个关节位点,舍弃了对动作贡献较小的1-4号节点,连接了11条线作为躯干。

Id	Part
0	nose
1	leftEye
2	rightEye
3	leftEar
4	rightEar
5	leftShoulder
6	rightShoulder
7	leftElbow
8	rightElbow
9	leftWrist
10	rightWrist
11	leftHip
12	rightHip
13	leftKnee
14	rightKnee
15	leftAnkle
16	rightAnkle

5, 6, leftShoulder-rightShoulder
5, 7, leftShoulder-leftElbow
5, 11, leftShoulder-leftHip
7, 9, leftElbow-leftWrist
6, 8, rightShoulder-rightElbow
6, 12, rightShoulder-rightHip
8, 10, rightElbow-rightWrist
11, 13, leftHip-leftKnee
13, 15, leftKnee-leftAnkle
12, 14, rightHip-rightKnee
14, 16 rightKnee-rightAnkle

每个关节将绑定一个追踪类示例,输入姿态数据时,如果对应关节的自信度(confidence)大于阈值,才传入相应位置数据给追踪类,防止未出现的关节产生的巨大波动影响评分。由于所有节点都绑定了相对时间,因此无需担心不更新追踪类会导致意外结果,这也节省了额外的计算量。

追踪类如果认定当前姿态出现了新的节点,将会通过返回值通知动作类,标记为新的动作切分点。为了防止出现过多的动作,如果当前动作切分点和上一个的相对时间距离较小,则会合并到上一个动作。

这个过程建议预先计算,然后缓存动作结果,因为姿态预测算法本身需要大量计算量。

5.动作评分

对于每个动作,我们记录产生节点的关节和对应起始、终止节点索引,且不是必须相邻的。由于姿态预测的不稳定性,可能会出现较近的多余节点,由于最少时间间隔的限制,这些节点可能不会拥有单独的动作切分,所以需要在动作上添加节点索引以跳过这些节点,也是起止节点可能不相邻的原因。
为了降低姿态预测不稳定性,建议提供良好的光照、使用更高分辨率的相机。
按照出现节点的关节的追踪类在该动作起止节点间的轨迹进行评分求和,记为动作评分。由于追踪类内评分已经对轨迹长度进行了加权(消除轨迹长短造成的分数影响),此处可以直接求所有关节轨迹评分平均值。

6.动作回放

通过记录的坐标和相对时间对动作过程重新渲染,可以提供单一动作的回放的功能。为了便于对照标准视频,采用了预先缓存视频,调取特定的图像回放方式
在这里插入图片描述

不足之处

在光照、设备分辨率、设备性能不足的情况下会产生较大的波动,相较前两版算法可能产生意外的分数。
仍在测试更多问题

可能的发展方向

  • 对视频动作根据角度和速度进行split,达到rhythm划分的效果(降低学习难度和评分波动)
  • 以动作为unit评分,达到更细粒度的评分效果
  • 增加轨迹光效(暂定)或其他AR动作矫正、辅助教学方案
  • 增加更丰富的评分激励,如总判定、ranking、开始结束页面等等
  • 尝试采用轻量级的YoloV8n,提高体验,尝试移动设备本地部署(开发Android端)
  • 将服务器的视频实时传输改为缓存为目的的传输,分离传输和render(不过网页端这么做没意义,照旧)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值