2018 年 11 月

第 33 卷,第 11 期

机器学习-分析奥林匹克运动组合传感器和视觉 AI

通过Kevin Ashley |2018 年 11 月

已从库存跟踪和制造质量控制流量管理和天气预测到的一切事项使用了物联网 (IoT) 和机器学习 (ML)。其中这两个问题一起 herald 大的更改的一个方面是高风险体育竞技场。在年 4 月发行的 MSDN 杂志 》 (msdn.com/magazine/mt846466),我们探讨了要如何使用传感器来跟踪并改进性能冬季奥运会体育事件,例如 alpine 滑雪。现在在第二个本期焦点移至年夏季奥运会,其中 IoT 和 ML 正在可利用提高 springboard 深入探讨其功能。

它是美国的紧急性的区域获奥运会团队。有四个跳水活动-3 米长 springboard,10 米长平台、 3 米同步深入探讨其功能和 10 米长同步的深入探讨其功能,该帐户为 24 的总可用在每个奥运会奖牌。传感器和机器学习承诺提高培训方案的同时最大化运动员性能上的最大的阶段。

目前,视频是分析的深入探讨其功能中的首选方法,因为它已年。教练使用慢动作和逐个框架视频分析研究,并提供即时反馈。但是,此定性方法不允许严谨的分析以及性能的更改的有效比较。真正的度量值和文档的更改,需要从专用传感器中捕获的数据结婚视频的量化分析。

在此项目中,我们使用视频和传感器技术来测量跳水起飞 — 是关键的成功探讨在关键的第一个时刻。我们设计的提示的 springboard 下放置的传感器。它包括惯性度量单位 (IMU)、 加速感应器和陀螺仪测量 springboard 起飞的重要特征。这包括到看板的障碍看板、 按下的和由 springboard,springboard,和到以无线方式提升种扭曲的端到端的方法。很好起飞很好的了解,最大高度,数值调节钮所需的如向前 4 1/2 somersault 仍然非常困难分析至关重要。

如果看板已上向下,最常郁闷,如果驱动程序一直 rode 看板备份并等待它为以无线方式引发他或她可以确定传感器数据。许多 divers 不执行此操作,并往往"跳过关闭看板"上的方式,高度和旋转过程中的会丢失。此项目旨在构建的系统,它允许 divers coaches 能够快速改善质量起飞,允许困难和研究更加困难,若要成功执行所需的信息。

内部传感器

附加到跳水板的下侧提示,传感器小且足够浅,不会影响的看板的性能和运行一次充电几个小时 (图 1)。传感器就准备好测量的角度,加速程序和驱动程序的起飞期间的时间安排。最重要参数是最大 flexion 角度,确定驱动程序已传输到之前起飞板多少能源。

SensorKit 模拟和 Springboard 安装程序
图 1 SensorKit 模拟和 Springboard 安装程序

典型参数,可以测量并对教练非常重要的部分列表包括:

  • 看板; 的最大的向下 flexion指示最大板 flexion。
  • 障碍航班时间,该值指示获得的最大障碍高度。
  • 看板的联系时间,其测量从障碍登陆到起飞时间。
  • 在看板联系人后障碍,从在空中运动的时间估计的速度。
  • 在起飞,计算从角速度板提示和其加速的速度。
  • 最大 sideway 倾斜板提示,它确定是否起飞期间出现的看板的一侧的角度。
  • 加速配置文件,它提供了原始数据,更多详细分析。

在端到端解决方案中,不在研究本文的范围内,将使用捕获的智能手机或平板电脑到探讨,然后上传到云的视频同步此传感器数据。直观的 UI 将提供教练和视频中,与控件的慢动作,步骤向前和后退一步函数运动员即时访问。使用视频的传感器遥测的集成提供教练和驱动程序深刻了解每个探讨的机制,以便他们可以了解需要改进的内容。在此解决方案中我们将仅计算最大 flexion 角度,最大 springboard 速度和最大 springboard 加速。

传感器工具包和深入的应用

在我们 SensorKit 传感器收集的数据。加速感应器和陀螺仪提供计算 flexion 角度、 难航班和深入了解数据,并将其以无线方式传输到教练可以看到它的移动应用的数据。应用程序可以触发基于传感器检测到的障碍的视频录制,然后停止录制后设置的时间量已通过在传感器检测到起飞后。应用会自动将捕获的数据上传到使用 SensorKit SDK 中,在云中,并提供了添加标记和注释运动员和其研究教练 UI。

传感器需要有足够的智能来处理信号模式特定于深入探讨其功能,其中我们仅限于检测障碍步骤,可从 springboard 振荡、 估计起飞时间和发送回应用的计算的值 (图 2).查找适用于深入的应用的 SensorKit SDK 的源代码bit.ly/2ImaNQT

物理过程所述 Springboard
图 2 物理过程所述 Springboard

SensorKit SDK 提供的障碍和了解数据结构。两个类描述在代码中所示图 3

图 3 SensorDiveData 和 SensorHurdleData 类

public class SensorDiveData
{
  public long t { get; set; } // Timestamp
  public double dt { get; set; } // Duration
  public double count { get; set; } // Hurdle count
  public double g { get; set; } // Acceleration, m/s^2
  public double w { get; set; } // Angular velocity, dps
  public double angle { get; set; } // Max flexion angle, deg
}
public class SensorHurdleData
{
  public long t { get; set; } // Timestamp
  public double dt { get; set; } // Duration
  public double angle { get; set; } // Flexion angle, deg
  public double g { get; set; } // Acceleration
  public double w { get; set; } // Angular velocity, dps
}

此数据传输到通过 SensorKit SDK,它可以存储,例如使用 Cosmos DB 应用程序。SensorKit 提供有用的类来处理 Cosmos DB 的数据。

探讨的物理特性

我们传感器在两个模式下工作: 原始和计算。我们将使用原始传感器,同时从我们模拟 springboard 和实际的分析数据。有几种类型的分析。在本文中,我们将重点介绍在现有位置背面的看板后, 跟散步向前和障碍的看板的末尾开始研究按下启动起飞进以无线方式。从在我们的 GitHub 存储库github.com/kevinash/MSDNDivingSensor,可以使用深入探讨其功能。若要加载和分析传感器数据并计算我们在本文中的分析部分中使用的值的 R 文件。

根据所涉及物理特性,请考虑针对大量即将朝向自己的内容将推送。强制你进行速度变对象,它将停止,并最终加速它中另一个方向。所有这会影响我们必须考虑查找来自的速度和加速曲线的跳水起飞事件的方法。问题是确定我们基于角速度或线性加速曲线起飞中的位置。板偏移量的图表如振荡关系图所示:从水平位置看板转到其最大 flexion 点,则将返回通过水平 0 位置和摆动直到它仍是。

若要计算最大弹性偏移量,我们可以使用 angular 速度的线性加速的看板的提示。角速度将在阶段,并带有相应加速,但是,因为加速是速度的时间导数。同一关系存在之间偏移量和速度,因为速度是偏移量的时间导数。这意味着速度将为 0 处的跳水看板的最大 flexion (底部点的偏移量) 和加速位于最大值 (图 2,第 5 步)。此后,看板转到其中偏移量等于 0,速度是最大的水平位置 (图 2,第 7 步)。我们通过集成角速度随着从零我们第一个点的时间的推移计算最大 flexion 偏移角度 (图 2,第 5 步) 到角速度将成为最大起飞我们第二个点 (图 2,第 7 步)。

若要开始,在 R 代码中 (图 4) 可以调用执行 it 全部函数的分析文件,并显示结果,如下所示:

CalculateSpringBoardDivingValues (sourceFile,lag, threshold, influence,1)

在 R 中的传感器数据分析
图 4 在 R 中的传感器数据分析

让我们深入了解此调用中发生的情况的详细信息。首先,该函数将数据从加载原始传感器文件源到数据帧,使用以下代码:

df <- ReadNewFormatFile(dat2, debug_print = debug_print)

回转仪和加速感应器等的传感器使用某种程度上特定数据格式,主要用于数据优化目的。例如,陀螺仪生成中每秒 (mdp) millidegrees 角速度值。这样做是为了避免使用浮点数。在我们的计算,我们使用国际系统的单位 (SI),在大多数物理计算整个中使用。加速,我们还将转换原始传感器值为 m/s ^2,加速的标准单位。下面是在计算:

#   wx, wy, wz *  0.001 * degrees/second (ang. Velocity)
#   ax, at, az = * 0.001 * 9.81 = m/s^2 (acceleration)
df$wx <- df$wx *  0.001 # convert to degrees per second
df$wy <- df$wy *  0.001 # convert to degrees per second
df$wz <- df$wz *  0.001 # convert to degrees per second
df$ax <- df$ax * 0.001 * 9.81
df$ay <- df$ay * 0.001 * 9.81
df$az <- df$az * 0.001 * 9.81

角速度矢量指向垂直于运动的平面时旋转围绕的轴的旋转,如中所示的方向图 5。我们可以确定使用最重要的值更改轴的旋转轴。一些数学计算,对于角速度是角度的随时间变化的速率:

陀螺仪感应 Angular 方向
图 5 陀螺仪感应 Angular 方向

若要获取表示的角度,我们可以只是随着时间的推移集成角速度:

我们的偏差或错误,是最小化,因为我们只是查看 springboard 启动弹跳的时刻。在 R 中,这是我们的集成的代码:

# Interested only in [posStart:posEnd]
# When displacement is at MAX, velocity passes 0 point
revFirstMin <- which.min(rev(wSm$avgFilter[posStart:posEnd]))
# After been max negative
posLastMin <- posEnd - revFirstMin +1
# Next index when Angular Velocity goes
# through 0 is our starting integration point
nextZero <- min(which(floor(wSm$avgFilter[posLastMin:posEnd])>0))
# 0 position relative to Last Minimum
nextZero <- nextZero + posLastMin -1
# Max position after 0 position
nextMaxAfterZero <- which.max(wSm$avgFilter[nextZero:posEnd])
nextMaxAfterZero <- nextMaxAfterZero + nextZero -1
We also provided plotting functions to draw the results, as shown here:
PlotSingleChart(wSm$avgFilter[posStart:posEnd],
  "Angular Velocity Smooth OUR Segment ","cyan4", kitSensorFile,
  "Wx smooth deg.",TRUE, FALSE, d$Start[posStart:posEnd])

在上图图 6,看板时,仍通过障碍和起飞时间之后,我们绘制回转仪传感器中的数据。很明显板达到其最大 amplitude 之前起飞,其后振荡下降的时间。若要进行更精确,我们计算和最大程度减少从集成的偏差错误,我们只使用 springboard 启动剧烈波动到振荡时达到其最大值的时刻之间的时刻。

Flexion 角度了解期间使用的图表
图 6 图表 Flexion 角度了解期间

最后,我们计算最大 flexion 角度和起飞时,使用以下代码:

timeTakeOff <- d$Start[posHorizontal]
timeStart <- d$Start[posLastMin]  
writeLines (paste (
  "Hurdle landing time (Start)  = ", timeStart,"\n",
  "Take Off time (End)  = ", timeTakeOff,"\n",
  "Board contact time (from hurdle landing to takeoff) = ",
  round(difftime(
  as.POSIXct(paste(dt,df$t[posHorizontal],sep=" ")),
  as.POSIXct(paste(dt,df$t[posLastMin],sep=" "))),digits = 4)," secs \n",
  "Maximum downward flexion of the board  = ",
  round(max(abs(d$theta2Cum[posLastMin:nextZero])),digits=4)," deg.",
  " secs", sep="" ))

获取此传感器数据是潜水教练和运动员,绝对有必要,因为它为用户提供有关探讨,尤其是成功了解非常重要的起飞组件的重要信息。

视频捕获和分析

视频分析概述目前,潜水教练依赖于他们看到其 divers 向提供反馈。他们需要能够将它们与他们使用其自己的眼睛看到我们传感器收到的数据相关联。通过将传感器数据与视频关联起来,我们为教练提供更好地了解他们看到的功能。

同步使用捕获的视频的传感器遥测是实际位的一项挑战。为此,我们选择了计算机视觉库,名为 openCV 来直观确定驱动程序时在其最小的时候,看板完全出现之前起飞时的确切时间。我们然后同步传感器报告的最小的测量点与该点的视频。介绍了此实现的详细信息可在 GitHub 上的代码示例中进一步bit.ly/2IjjkUO

跟踪驱动程序在飞行计算机视觉还用于确定当驱动程序离开看板的确切时间。一种称为光学流,在对象跟踪中经常使用的简单技术上的方向性和到另一个图像中的所选点的速度提供信息。我们使用 Lucas Kanade 光学流算法来确定关闭的看板,以及用于确定在速度和跳转的高度将驱动程序跳转的时间。此视频运动分析 (如中所示图 7) 使能够掌握从每个探讨更深入地介绍的教练。

跟踪在空中运动视频运动分析与驱动程序移动
图 7 跟踪以无线方式与视频运动分析中的驱动程序移动

可以用于移动跟踪在获取源代码bit.ly/2QduA7X。最初,我们为我们捕获指定的源视频文件:

cap = cv2.VideoCapture("YOUR-VIDEO-FILE.MP4")

选择该文件后,我们会提示用户选择要跟踪的初始视频图像中的点。与此选择,我们调用 calcOpticalFlowPyrLK 方法从 OpenCV,计算的一个稀疏功能集使用迭代 Lucas Kanade 方法,如中所示的光学流图 8

图 8 调用 calcOpticalFlowPyrLK

Code samplecv2.calcOpticalFlowPyrLK(old_gray, gray_frame, old_points,
  None, **lk_params)
For visualization, we track the diver on the video:
for i,(new,old) in enumerate(zip(new_points,old_points)):
    a,b = new.ravel()
    if start is None:
      start = a
    c,d = old.ravel()
    mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
    frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
    if b > lowest_point and abs(a - start) <= THRESH:
      low = np.zeros_like(frame)
      low = cv2.circle(low, (a,b), 5, color[i+1].tolist(), -1)
      lowest_point = b
  img = cv2.add(frame,mask) # essey
  img = cv2.add(img, low)
  cv2.imshow('Frame',img)
  old_points = new_points.reshape(-1,2)

总结

目标是为此解决方案要易于使用的教练和对 divers 不可见。这些属性将允许集成到日常培训课程并使其标准的指导工具,得多的视频播放已通过过去二十年间的方式。教练将能够通过分析关键指标评估的驱动程序的输出质量:

  • 在空中运动期间障碍时间指示多少能源可供了解。
  • 板 flexion 量如何有效地指示驱动程序具有"加载 springboard"以启动到以无线方式。 
  • 在板上的时间指示驱动程序骑 flexed 的 springboard 并充分利用其能源,将它转换成高度和在起飞数值调节钮的程度。

我们的组合的传感器和视频的方法的优点是很明显的。从传感器,我们收集立即深入了解重要起飞特征,允许正确的技术指导。随着时间的推移跟踪性能指标还允许更改的评估中驱动程序起飞从历史上看,并跟踪进度。此反馈循环可以充当 divers 为了改进其起飞的指标,每个练习中,无法完成更多的高度和,因此,更多的时间才能完成每个探讨是功能强大动机。

项目的最终目标是提供更详细的了解起飞和探讨 biomechanics 我们精英的美国 divers,因此,它们可以实现在竞争中的分数较高。为此,我们希望改进视觉分析,其中涉及到接下来的步骤:

  • 通过在 springboard 上使用 visual 距离 1 百万和 2 个 m 标记 (请参阅图 5),我们也可估计相对于计算中以无线方式驱动程序的高度的轨迹的看板的大小。
  • 使用计算机视觉和机器学习来确定完全时驱动程序进入看板和追捧从看板将允许障碍时间、 看板联系时间和起飞即时的精确的计算。
  • 请考虑超出 Lucas-Kanade,可以施加某些约束的算法。Lucas Kanade 仅适用于角、 它不太适合光源变化和它很难注册大型动作。
  • 浏览实现主体的位置,从而带来从捕获的视频的估计。
  • 与其他有用的功能在应用中,同步视频,因此我们可以触发应用程序中基于经过分析的视频中的操作。

Kevin Ashley是 Microsoft 和 IoT、 机器学习和体育方面的专家的资深架构师。

Phil Cheetham目前的高级运动技术专家和美国 biomechanistChula Vista,拉古纳山奥林匹克培训中心奥林匹克委员会 (USOC)

Dan Laak名为高性能主管的美国深入探讨其功能在 2018 年起着头潜水教练 Georgia 大学在过去 31 年后。

Olga Vigdorovich是数据科学家和酷爱滑雪。她适用于 IoT 传感器数据分析,并生成可缩放的云平台基于 Microsoft Azure 上的数据模型。

Daria Fradkin是在工程学校,宾夕法尼亚大学初级研究数字媒体设计中,将计算机科学与在计算机图形中的更高级别的课程相结合的主要版本号。

Kevin Kang是第四年期本科学生学习计算机科学数据科学的选项在华盛顿大学,西雅图。


在 MSDN 杂志论坛讨论这篇文章