建设训练和测试场地以帮助将运动分析 AI 解决方案从实验室推进到现实世界是一项极具挑战性的任务。在以团队为基础的体育运动中,在冠军赛季前制定正确的比赛策略是任何职业教练和俱乐部所有者成功的关键。
尽管教练们努力在比赛中提供最佳提示并指出错误,但他们仍然无法在重新观看比赛时注意到双方的每一个细节和行为模式。要收集这些数据,分析它们,并对团队行为做出推断,您可以使用复杂的 AI 算法。
特别是,我们想要解决的任务类型是培养橄榄球队的分析能力,即比赛期间每个球员的位置以及每个球员在球场上的 3D 姿势。实时获得这些信息为制定更好的游戏策略提供了必要的证据。
在许多体育分析案例中,一类问题已经找到了有效的解决方案,但无法有效应用——主要瓶颈是缺少数据。
收集和标记数据的过程可能既昂贵又耗时。人类必须手动分析图像,与计算机相比,这种重复性工作不仅速度慢、成本高,而且精确度也较低。
此外,还有一些情况需要现代设备来生成标记数据,并需要高素质的专家来维护生产过程。这种情况显著增加了项目成本,或者在许多情况下,使利益相关者无法实现体育分析项目。
基于团队的运动:机器学习和计算机视觉的诱人机会
如果你能自动生成图像和视频数据,完全适合手头的任务,并内置完整且始终正确的地面真相,会怎么样?
在这篇文章中,我们将以足球或橄榄球运动员的 3D 姿势识别为例,展示我们实现这一目标的尝试。目标是训练人工智能模型,以准确识别足球运动员及其姿势,将其作为真实比赛画面上 3D 空间中的人体关键点。
人工智能模型专门针对使用 SKY ENGINE 人工智能平台和 NVIDIA RTX 机器生成的人工合成数据进行训练。生成的图像是完全由 SKY ENGINE 渲染器控制的模拟场景。根据模型的要求,可以提供各种基本事实。
具有 NVIDIA RTX 核心的 SKY ENGINE AI 渲染引擎为深度学习提供基于物理的渲染。异构系统由 NVIDIA Titan RTX 和 NVIDIA V100 GPU 组成。这是一种高效且功能强大的配置,可以同时生成标记的多光谱 (如果需要)数据集和训练神经网络。
这种方法的主要优点包括:
- 有效处理不平衡数据
- 准确检测制服和体育场上的标识(误报)
- 通常,带有压缩伪影的噪声、低质量数据流不会降低 AI 驱动的推理精度
- 可以有效地导出广播摄像机的未知参数
- 提供高质量的 3D 贴图
- 可以精确地对小目标进行姿态估计
- 运动和构造的复杂结构可以准确识别
- NVIDIA RTX 体系结构的高效数据处理和计算优化
下面是 SKY ENGINE AI 平台中解决的 3D 姿势估计问题的完整解决方案。
使用 SKY ENGINE AI 平台的运动分析案例
首先,必须配置渲染引擎,定义渲染数据源,并训练 AI 模型以进行人体检测和 3D 姿势估计。
资源加载和渲染引擎配置
从加载体育场几何体的资源开始。这些资源在标准 3D 建模软件中准备,并以 Alembic 格式加载到 SKY ENGINE 中。
renderer_ctx.load_abc_scene('stadium') renderer_ctx.setup()
接下来,显示体育场的加载几何体:
with example_assistant.get_visualizer() as visualizer: visualizer(renderer_ctx.render_to_numpy())
下一步需要使用 Python API 加载几何体的纹理:
stadium_base_textures = SubstanceTextureProvider(renderer_ctx, 'concrete') stadium_base_params = PBRShader.create_parameter_provider(renderer_ctx, tex_scale=50) renderer_ctx.set_material_definition('stadion_base_GEO', MaterialDefinition(stadium_base_textures, parameter_set=stadium_base_params))
如前所示, SKY ENGINE 提供了对程序纹理的完全支持,这带来了各种数据的快速生成以及基于物理的渲染( PBR 着色器)。
定义环境地图如下:
renderer_ctx.define_env(Background(renderer_ctx, EnvMapMiss(renderer_ctx), HdrTextureProvider(renderer_ctx, 'light_sky')))
此时,场景中已渲染体育场。下一步是配置整个场景并用播放器填充它。您可以使用一种方便的实例化机制来实现这一点。
“天空引擎”( SKY ENGINE )渲染器提供了几乎无限的可能性来洗牌、乘法、随机化和组织资源。从某个玩家的单个 Alembic 动画中,您将创建两个团队,每个团队由 20 名玩家组成。
renderer_ctx.layout().duplicate_subtree(renderer_ctx, 'player_GEO_NUL', suffix='team2') renderer_ctx.layout().get_node('player_GEO_NUL').n_instances = 20 renderer_ctx.layout().get_node('player_GEO_NUL_team2').n_instances = 20
默认情况下,所有材质都是随机绘制的。要创建两个合适的球队,您需要确保给定球队中的每个球员都有相同颜色的球衣。保持所有其他输入的随机性,例如头发、肤色、袜子颜色、衬衫编号等。
要实现这一点,您必须将玩家分成不同的随机分组,并定义他们的绘图策略。控制衬衫颜色的 Substance archive 输入为 Colors _ select 。在随机化组内需要相同(同步),组间需要不同。默认情况下,所有其他输入保持随机化。
shirt_sync = SynchronizedInput(SynchronizationDescription( in_strategy=Synchronization.DISTINCT_EQUAL_GROUPS)) player_material_strategy = DrawingStrategy(renderer_ctx, inputs_strategies={'Colors_select': shirt_sync}) renderer_ctx.instancers['player_GEO'].modify_material_definition(strategy=player_material_strategy) renderer_ctx.instancers['player_GEO_team2'].modify_material_definition(randomization_group='team2', strategy=player_material_strategy)
图 5 显示了每个玩家都处于相同的姿势。默认情况下, SKY ENGINE 逐帧播放 Alembic 文件中的动画,因此必须随机化此参数。
player_geometry_strategy = DrawingStrategy(renderer_ctx, frame_numbers_strategy=UniformRandomInput()) renderer_ctx.instancers['player_GEO'].modify_geometry_definition(strategy=player_geometry_strategy)
橄榄球比赛中,球员分布不均匀;他们倾向于聚集在一起,靠得更近。为了使场景看起来更自然,可以更改绘制球员位置的方式。您可以使用随机高斯分布,而不是均匀地绘制它们。它是双重随机的,因为首先and然后使用这些参数随机绘制玩家的位置。
gauss_strategy = DrawingStrategy(renderer_ctx, default_input_strategy=RandomGaussianRandomInput(sigma_relative_limits=(0.1, 0.2))) renderer_ctx.layout().get_node('player_GEO_NUL').modify_locus_definition(strategy=gauss_strategy)
在这篇文章中,我们跳过了相机、灯光和后处理的额外配置,但我们鼓励您从 GitHub repo 获取详细信息。移动到与场景语义和基本事实相关的配置。
关键点已出现在播放器的动画中。默认情况下, SKY ENGINE 会计算有关关键点的所有信息(如果它在输入资源中接收到这些信息)。您只需将它们可视化,以确保所有配置都正确。绿色关键点可见,红色关键点隐藏。
example_assistant.visualized_outputs = {SceneOutput.BEAUTY, SceneOutput.SEMANTIC, SceneOutput.KEYPOINTS}
场景看起来正确,因此可以为 AI 培训创建渲染器数据源。
datasource = MultiPurposeRendererDataSource(renderer_context=renderer_ctx, images_number=20, cache_folder_name='rugby_presentation_new')
人工智能模型训练过程
在培训阶段,您将使用在 DeepSky 库中实现的模型和培训器,该库是 SKY ENGINE AI 平台的一部分。
main_datasource = SEWrapperForDistancePose3D(datasource, imgs_transform=transform) train_data_loader = DataLoader(dataset, batch_size=Constants.TRAIN_BATCH_SIZE, num_workers=Constants.NUM_WORKERS, drop_last=Constants.DROP_LAST, shuffle=Constants.VALID_SHUFFLE, collate_fn=collate_fn) model = get_pose_3d_model(main_datasource.joint_num, backbone_pretrained=True) trainer = DefaultTrainer( data_loader=train_data_loader, model=model, epochs=Constants.EPOCHS, save_freq=1, valid_data_loader=valid_data_loader, optimizer=optimizer, evaluator=evaluator, scheduler=scheduler, serializer=serializer) trainer.train()
现在检查人工智能模型在合成数据上的训练结果,以验证所有配置是否正确。在每个历元之后,保存一个检查点并生成一些推理示例以查看训练进度。
show_jupyter_picture('gtc03_assets/trained/img2.png')
人工智能模型在真实图像上的结果
在下一步中,将在真实视频上验证结果。首先,使用预训练模型进行玩家检测,以找到边界框。有关更多信息,请参阅 GTC 2019 上提供的播放器检测教程,该教程可在天空引擎 AI GitHub repo 上获得。
checkpoint = torch.load('gtc03_assets/trained/rugby_detection.pth.tar') for k, v in sorted(checkpoint.items()): checkpoint[''.join(['_model.', k])] = checkpoint.pop(k) detection_model.load_state_dict(checkpoint) detection_model = detection_model.to(device) real_dataset = ImageInferenceDatasource(dir='gtc03_assets/real_data', extension='png') out = outputs.pop() bboxes = out['boxes'].cpu().detach().numpy() bboxes = bboxes[np.where(labels == 1)[0]] labels = out['labels'].cpu().detach().numpy() bbox_image = bboxes_viz(orig_img, bboxes)
model.eval() with torch.no_grad(): results = model((img,), ({'boxes': torch.from_numpy(bboxes).int()},)) results = results.pop() output_coords, output_bboxes = results['pred_poses_coords'].cpu(), \ results['boxes'].cpu()
这里有几个例子。图 10 显示, SKY ENGINE AI 能够训练其关键点 AI 模型之一,以检测玩家并正确估计骨骼关节的 3D 坐标。可用数据的质量极低是由于捕获了分辨率较低、压缩能力强的实况电视广播。如果不使用具有完美地面真实性的合成数据方法,这种评估任务在使用真实画面进行人工智能模型训练的传统方法中几乎是不可能的。
结论
三维姿态估计是最复杂的计算机视觉任务之一,通常需要高质量的图像、校准的摄像机和完美的照明条件。另一方面,训练用于运动分析的姿势估计算法需要昂贵的运动捕捉课程,并在球场上安装复杂的设备。
我们刚刚介绍了如何使用简单的 3D 资源和在 NVIDIA 硬件上工作的 SKY ENGINE AI 平台解决这个问题。
SKY ENGINE AI 工具用于构建团队体育应用程序,这可能会彻底改变这些游戏。球员、教练、俱乐部、决策者、球迷和广播机构可能会从这些运动的进一步民主化中受益。例如,您可以使用 SKY ENGINE AI 快速评估来自代表性不足地区或较低联赛的球员的技能,而无需个别球探的武断判断。
这种方法可以很容易地复制到训练模型中,以检测人类,估计他们的位置,并分析他们在任何条件下的运动,而不考虑环境:工厂、车间或空间站。
关于天空引擎 AI
SKY ENGINE AI 是一个模拟和深度学习平台,可生成完全注释的合成数据,并按比例训练 AI 计算机视觉算法。该平台生成照片级真实感环境和对象的高度平衡的图像数据,并提供高级域自适应算法。 SKY ENGINE AI 平台是一个工具,可供开发人员、数据科学家和 ML /软件工程师在任何行业创建计算机视觉项目。
SKY ENGINE AI 平台能够从头开始构建优化的定制 AI 模型,并在虚拟现实中对其进行培训。 SKY ENGINE AI 软件使您能够创建任何传感器、无人机或机器人的数字孪生模型,并在实际部署之前在虚拟环境中对其进行测试和培训。
SKY ENGINE AI 数据生成通过为任何计算机视觉应用程序提供完美平衡的合成数据集,使数据科学家的生活更加轻松。示例包括对象检测和识别、 3D 定位和姿势估计。其他复杂的案例包括使用雷达、激光雷达、卫星、 X 射线等分析多传感器数据。
有关更多信息,请参阅 Sky Engine 人工智能平台或Sky Engine AI GitHub 库。