任务是开发开源机器学习解决方案将使用计算机视觉来分析(自制)体育视频。

对于初学者,我想专注于篮球比赛,但该解决方案也应该适用于任何有球员和球场的运动。

进一步的文档、代码示例以及最终可行的开源解决方案将在 GitHub 上发布。

如果您想提供帮助、有建议或了解我们可以(重)使用的现有开源项目,请随时与我联系。

项目目标

短期(1 和 2)和长期(3 和 4)项目目标。

  1. 每支球队的球员追踪。

  2. 视频映射到二维篮球场。

  3. 游戏动作检测(带标签)和分析

  4. 更高级的比赛分析,如上篮、扣篮、挡拆、跑动距离等。

基本上类似于下面显示的足球分析视频,但随后是针对篮球和开源的。

FootbalAnalysis

机器学习模型

基于Player Tracking and Analysis of Basketball Plays论文,需要创建以下机器学习模型。

[型号](https://res.cloudinary.com/practicaldev/image/fetch/s--fLvYOi3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849391-f34ee280-1e7d-11ea-8044-db5b78b07ba9.png)

1)法庭检测 - 找到法庭的线路

2)人员检测 - 检测个人✅

  1. 球员检测和颜色分类 - 球员检测站在球场上并将这些人分成两队

  2. 玩家追踪 - 逐帧保存位置信息

  3. 通过 Homography 进行映射 - 转化为球场

法庭检测

解释于球场重建广播篮球视频中的摄像机校准[2]

我们从 Youtube 获得的视频帧最初是从 BGR 转换为 HSV(色调、饱和度

和值)颜色模型。然后,我们专注于 H 平面,以创建系统的二元模型。然后我们

继续对图像进行腐蚀和膨胀,以消除与球场无关的伪影。随后,我们使用 Canny 边缘检测器来检测系统中的线条。最后,我们执行霍夫变换以检测系统中的直线。

[法院](https://res.cloudinary.com/practicaldev/image/fetch/s--929FYTlO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70851421-323c6280-1e95-11ea-80b9-dde97f12cf1d.png)

法庭侦查策略

[法院](https://res.cloudinary.com/practicaldev/image/fetch/s--rDJTe9PY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/71198821-f0e0f400-2294-11ea-8253-3d6ff20fcbf9.png)

正如您在上图中所见,这些不是 NBA 球场。许多纵横交错的线定义了一个篮球场,这将使其很难自动检测。

让我们仔细看看一些策略。

天真法院检测

  • 将图像转换为 HSV

  • 在给定的色调范围内隔离像素

  • 开发按位与掩码

  • 使用 Canny 边缘检测

  • 使用霍夫变换

[屏蔽](https://res.cloudinary.com/practicaldev/image/fetch/s--sj7USyqC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/71198482-29cc9900-2294-11ea-927b-277d6298a972.png)

Python 代码“court_detection1.py”包含在这个项目中。

使用上述策略很难识别篮球场检测(线条过多)。

使用自动编码器进行二进制分割

正如 Simone Francia 的动作分类中所解释的那样,将需要用于运动场分割的自动编码器(参见第 3.2.2 节:篮球场的自动编码器模型)

[法院](https://res.cloudinary.com/practicaldev/image/fetch/s--LP-JIDM3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images .githubusercontent.com/179457/71194460-3b11a780-228c-11ea-8463-4dc84c2b4e5a.png)

字段分割数据集

为了使训练发挥作用,需要一个 100,000 帧的篮球场数据集。

为此,需要从每个游戏中提取大约 1000 帧,然后将其用于创建数据集。

可以通过简单的数据增强技术来增加数据集的大小。

[CourtMarkers](https://res.cloudinary.com/practicaldev/image/fetch/s--FWFG4moD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/71196279-07d11780-2290-11ea-87d7-63d342130ddd.png)

通过 OpenCV 函数 cv2.polylines 可以在图像平面上创建 n 个点 {p1, p2, .., pn }。然后使用这些点来绘制多边形。

def draw_poly_box(frame, pts, color=[0, 255, 0]):
    """Draw polylines bounding box.

    Parameters
    ----------
    frame : OpenCV Mat
        A given frame with an object
    pts : numpy array
        consists of bounding box information with size (n points, 2)
    color : list
        color of the bounding box, the default is green

    Returns
    -------
    new_frame : OpenCV Mat
        A frame with given bounding box.
    """
    new_frame = frame.copy()
    temp_pts = np.array(pts, np.int32)
    temp_pts = temp_pts.reshape((-1, 1, 2))
    cv2.polylines(new_frame, [temp_pts], True, color, thickness=2)

    return new_frame

进入全屏模式 退出全屏模式

这个由手动注释的多边形被解释为一个场地(篮球场),内部为白色,外部为黑色。

[BlackWhiteCourt](https://res.cloudinary.com/practicaldev/image/fetch/s--dxwSUMLs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/71196872-a8bfd280-2290-11ea-97f5-f6fc4beedea6.png)

数据集字段的数据增强

字段的标注每秒进行一帧,作为 25 fps 的视频,相当于每 25 帧标注一帧。1000 帧的标注不足以创建鲁棒的自动编码器模型;出于这个原因,已经采用了一些数据增强解决方案,以便为自动编码器模型提供足够数量的训练示例。

每个球场图像也可以以 -15 到 15 范围内的角度旋转。从每个原始球场图像创建两个其他组合,在间隔之间选择一个随机角度。

[旋转](https://res.cloudinary.com/practicaldev/image/fetch/s--d-qXYoRS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images .githubusercontent.com/179457/71199270-e3783980-2295-11ea-92f6-552c7277afea.png)

人员检测

对象检测定位图像中对象的存在,并在该对象周围绘制一个边界框,在我们的例子中,这将是一个人。

常见的对象检测模型架构是:

  • R-卷积神经网络或 R-CNN

  • 快速 R-CNN

  • 更快的 R-CNN

  • 掩码 R-CNN

  • SSD(单发 MultiBox Defender)

  • YOLO(你只看一次)

  • 个对象作为点

  • 用于对象检测的数据增强策略

您可以使用Yolo和OpenCV找到 Arun Ponnusamy](https://github.com/arunponnusamy/object-detection-opencv)的[工作示例。结果图像如下所示。

[人](https://res.cloudinary.com/practicaldev/image/fetch/s--iIr6TwhK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849159-2806100-1e7b-11ea-8c16-e68f8865e9ea.jpg)

另一种方法是使用 TensorFlow 等卷积神经网络。有关不同模型架构的更多详细信息,请参阅A 2019 Guide to Object Detection。

Mask R-CCN 允许我们从背景中分割前景对象,如这个Mask R-CNN 示例和下图所示。这将有助于在下一个模型中检测球员并根据颜色分类将他们与球队联系起来。

[输出](https://res.cloudinary.com/practicaldev/image/fetch/s--r4tqjyxs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70865878-af81d900-1f62-11ea-85d1-44db19a0f7f3.jpg)

玩家检测及颜色分类

[PlayerDetection](https://res.cloudinary.com/practicaldev/image/fetch/s--nPQ28MZ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70851455-ac6ce700-1e95-11ea-9023-cac328f030e6.png)

摘自Learning to Track and Identification Players from Broadcast Sports Videos[4]。

为了减少误报检测的数量,我们使用了同队球员穿着的事实

与观众、裁判和其他球队颜色不同的球衣。具体来说,我们训练一个

逻辑回归分类器 [32] 将图像块映射到团队标签(团队 A、团队 B 和其他),其中图像块由 RGB 颜色直方图表示。然后,我们可以过滤掉误报检测(观众和裁判),同时将检测分组到各自的团队中。请注意,可以将颜色特征添加到 DPM 检测器并为特定球队 [33] 训练球员检测器。然而,[33] 需要更大的标记训练数据,而所提出的方法只需要少量示例。

执行此步骤后,我们将准确率显着提高到 97%,同时保持 74% 的召回率。

[分类](https://res.cloudinary.com/practicaldev/image/fetch/s--XzcgR29q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70867575-317bfd00-1f77-11ea-8eff-e02e7c49014f.png)

Mask R-CNN 应用程序允许我们提取每个已识别人员的分割图像。提取每个分割图像的主要颜色应该允许我们按团队对球员进行分类。然而,由于某些未知原因,用于完成此操作的 python 代码无法识别黄色球衣颜色(还)。

另请参阅球员跟踪和篮球比赛分析。

玩家追踪

摘自Learning to Track and Identification Players from Broadcast Sports Videos[4]。

人脸识别在这个领域是不可行的,因为图像分辨率太低,人类无法识别

球员。识别球衣号码是可能的,但仍然非常具有挑战性。我们尝试使用图像阈值

检测数字的候选区域,并运行 OCR 来识别它们。然而,我们得到了非常糟糕的结果,因为图像阈值不能可靠地检测数字,并且现成的 OCR 无法识别变形球衣上的数字。球员频繁的姿势和方向变化使比赛更加复杂

问题,因为在单个摄像机视图中,人脸或数字的正面视图非常少见。我们采用了不同的方法,忽略了面部和数字识别,而是专注于将玩家识别为实体。我们从整个玩家身上提取了几个视觉特征。这些特征可以是面孔、球衣号码、皮肤或头发颜色。通过将所有这些弱特征组合到一个新颖的条件随机场 (CRF) 中,该系统能够自动识别体育运动员,即使在从单个平移倾斜变焦摄像机拍摄的视频帧中也是如此。

开源Alpha Pose 项目可以检测图像中的人体并提供人体姿势的完整描述。

Alpha Pose 是“第一个使用 130 个关键点在单张图像上联合检测人体、手部和面部关键点的实时多人系统。

[BodyPose](https://res.cloudinary.com/practicaldev/image/fetch/s--V1cKTKgq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70863757-c537d400-1f4b-11ea-9e29-9015f5b07560.png)

一旦我们可以识别出一个身体姿势,就可以计算出方向,并将其映射到 2D 比赛平面/场地/球场上,如上所示。

法院通过 Homography 映射

我们如何将视频中的球员映射到 2D 球场上?

单应性是平面(在我们的例子中是篮球场)从一个相机视图到另一个相机视图的透视变换。基本上,通过透视变换,您可以使用变换矩阵将 3D 点映射到 2D 图像上。

[映射](https://res.cloudinary.com/practicaldev/image/fetch/s--j5Oc1iYu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849554-488bf380-1e80-11ea-96ce-acbbd0dd2e50.png)

通过获得球场的尺寸,我们能够找到使用仿射变换计算的 3x3 单应矩阵。然后将每个球员的位置乘以将他们投影到模型球场的单应矩阵。

另请参阅有关A Two-point Method for PTZ Camera Calibration in Sports[22] 的科学论文

[运动中PTZ摄像机校准的两点法](https://res.cloudinary.com/practicaldev/image/fetch/s--wqwG1_KC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880 /https://user-images.githubusercontent.com/179457/70851334-1edcc780-1e94-11ea-8ede-1ec30cb5d861.jpg)

下面是一个关于如何使用 OpenCV Homography 算法的 Python 示例。这是基于 Satya Mallick](https://www.learnopencv.com/homography-examples-using-opencv-python-c/)的[文章。

    #!/usr/bin/env python

        import cv2
        import numpy as np

        if __name__ == '__main__' :

            # Read source image.
        im_src = cv2.imread('book2.jpg')
        # Four corners of the book in source image
        pts_src = np.array([[141, 131], [480, 159], [493, 630],[64, 601]])


        # Read destination image.
        im_dst = cv2.imread('book1.jpg')
        # Four corners of the book in destination image.
        pts_dst = np.array([[318, 256],[534, 372],[316, 670],[73, 473]])

        # Calculate Homography
        h, status = cv2.findHomography(pts_src, pts_dst)

        # Warp source image to destination based on homography
        im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))

        # Display images
        cv2.imshow("Source Image", im_src)
        cv2.imshow("Destination Image", im_dst)
        cv2.imshow("Warped Source Image", im_out)

        cv2.waitKey(0)

进入全屏模式 退出全屏模式

更高级的机器学习模型

在该项目的未来版本中,我们还可以考虑添加游戏开始 (SoC)、跟踪球和目标(得分)机器学习模型。

游戏开始 (SoG)

如果我们想要自动分析视频的解决方案,我们还可以考虑添加游戏开始 (SoC) 模型。这可以识别球场上某个位置的球员,这将在进行篮球分析时标记一场比赛或一节的开始。

轨迹球

当我们想要实现得分分析时,跟踪球将是一项要求。一些非常有趣的研究已经发表在这个主题上:A deep learning ball tracking system in football videos[5]

使用 OpenCV 跟踪大球的示例可在此处找到。

姿态估计器

[Shot](https://res.cloudinary.com/practicaldev/image/fetch/s--pldsBJCD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70861945-90208700-1f35-11ea-8b2b-8fd29b9bc912.png)

Alpha Pose 是“第一个在单张图像上联合检测人体、手部和面部关键点(共 130 个关键点)的实时多人系统”。该解决方案能够获取图像并检测图像中所有人物的关键点(眼睛、鼻子、各种关节等)。这允许完整描述图像中的人体姿势。

Alpha Pose可能成为检测投篮、上篮、扣篮等的基础。

[posetrack](https://res.cloudinary.com/practicaldev/image/fetch/s--PteF7pKC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent .com/179457/70861877-7e8aaf80-1f34-11ea-9049-a48fb16f8135.gif)

必读的相关文档是Sports Analytics With Computer Vision[7]。

另一篇很棒的文章概述了可用的人体姿势估计解决方案。

[下载(1)](https://res.cloudinary.com/practicaldev/image/fetch/s--pTtzpVFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user- images.githubusercontent.com/179457/71117004-8ae16780-21d5-11ea-9560-2fa224b30ab2.png)

镜头检测

我们可以使用的另一个非常有趣的机器学习模型是关于篮球投篮检测和分析的开源项目由Rembert Daems共享(感谢提供信息)。

该程序能够检测何时发生击球并从捕获的数据中填充球的飞行。它计算球的初始速度和发射角度。它能够使用单个相机估计垂直于相机平面(z 轴)的球飞行。该程序还能够检测到球的飞行何时被另一个物体中断并丢弃这些数据点。

[shot_2](https://res.cloudinary.com/practicaldev/image/fetch/s--zVCuDat9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent .com/179457/70861665-990f5980-1f31-11ea-866e-5d14fa02db0b.gif)

动作识别

Simone Francia开发了一个篮球动作识别数据集如下视频所示。我已联系 Simone 以获取更多关于如何使用他的数据集的详细信息。

防御

目标(得分)

最终,我们还希望有一个模型可以识别球员何时进球(在篮球中,这可以是一分、两分或三分的罚球)。正如 ML6 演示所证实的,需要组合不同的目标模式。例如,音频峰值可能是一个目标的指示,当然球跟踪到篮筐和“进入”“环”都是可以识别目标的事件。

另一个想法(如果可能)是对计分板进行 OCR,并查看分数何时增加以确认目标。当然,大多数自制视频不包括计分板。

需要进一步研究,欢迎提出建议。

集成学习

一旦我们有不同的模型工作,我们很可能需要“堆叠”它们。基本上使用一个模型的输出作为另一个模型的输入。或者结合相似的模型来获得更好的预测性能。

另请参阅集成学习综合指南(使用 Python 代码)

集成学习的一种技术是堆叠。

堆叠是一种集成多个分类的方法。堆叠的目的是为同一个问题探索不同模型的空间。这个想法是,您可以使用不同类型的模型来解决学习问题,这些模型能够学习问题的一部分,但不能学习问题的整个空间。因此,您可以构建多个不同的学习器,并使用它们来构建中间预测,每个学习模型都有一个预测。然后添加一个新模型,该模型从中间预测中学习相同的目标。

据说这个最终模型堆叠在其他模型之上,因此得名。因此,您可能会提高整体性能,并且通常您最终会得到一个比任何单个中间模型更好的模型。

[堆叠](https://res.cloudinary.com/practicaldev/image/fetch/s--KKdoeR5Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70852196-09b96600-1e9f-11ea-8f7a-d289dc7ec9e5.png)

https://www.geeksforgeeks.org/stacking-in-machine-learning/

训练数据

在过去的 7 年里,我录制了我儿子的篮球比赛,这些可以在YouTube上找到。我们拥有数千小时的训练数据,可用于测试和训练我们的机器学习模型!

[YouTubeData](https://res.cloudinary.com/practicaldev/image/fetch/s--yZprWBXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849594-e8498180-1e80-11ea-9450-b59bfcc9fc9b.png)

机器学习硬件(在预算内)

[Jetson-Nano_3QTR-Front_Left_trimmed](https://res.cloudinary.com/practicaldev/image/fetch/s--wraIxiG2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user -images.githubusercontent.com/179457/71237275-6387b900-2301-11ea-93d7-157b5ac136d9.jpg)

这款NVIDIA Jetson Nano 板可能是训练和部署 Sports Analytics 机器学习软件的有趣且价格低廉的解决方案。

根据 NVIDIA 的说法,这是一台功能强大的小型计算机,可让我们并行运行多个神经网络,用于“图像分类、对象检测、分割和语音处理”等应用。

架构

一旦涉及到架构,我们就会回到坚实的基础上,并且有足够的经验来创造美丽的东西。

机器学习模型可以使用ML6atDevoxx Belgium 2019[3] 解释的架构进行集成。

[GoogleArchitecture](https://res.cloudinary.com/practicaldev/image/fetch/s--ypycVdz5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849711-87bb4400-1e82-11ea-8c75-a94f2fee1446.png)

如您所见,该架构基于 Google Cloud,但我相信该架构很可能也可以使用 Amazon、IBM 甚至 Microsoft 云服务来完成。

数据处理

正如 [3] 中所解释的,一些模型只需要一个视频帧,而另一些模型则需要按时间戳(时间序列)排序的多个帧来分析例如玩家运动。

一种可能的方法可以实现如下:

[数据处理](https://res.cloudinary.com/practicaldev/image/fetch/s--C2Uwt3VR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/179457/70849976-a3741980-1e85-11ea-8cf3-ce58567f6180.png)

商业解决方案

  • 第二频谱。另请参阅 Rajiv Mageswaran](https://www.ted.com/talks/rajiv_maheswaran_the_math_behind_basketball_s_wildest_moves)的非技术性[TED 演讲。

  • PlaySight有一个人工智能解决方案来分析体育比赛。

  • 还有其他吗?

ML 运动参考

  • 球员跟踪和篮球比赛分析[1]

  • 用于广播篮球视频中摄像机校准的球场重建[2]

  • Sven Degroote 在比利时 Devoxx 的足球比赛视频分析 2019[3]

  • 学习从广播体育视频中跟踪和识别球员[4]

  • 足球视频中的深度学习球跟踪系统[5]

  • GitHub 上的镜头检测项目[6]

  • 运动分析与计算机视觉[7]

  • 准确的多人姿势估计器[8]

口罩R-CNN

  • 使用 OpenCV 示例掩码 R-CNN

单应性参考文献

  • 使用 Homography 进行对象跟踪 – OpenCV 3.4 与 python 3[20]

  • 将相机坐标映射到 2D 平面图[21]

  • 运动中PTZ摄像机校准的两点法[22]

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐