您的位置:首页 > 运维架构

使用OpenCV+Tensorflow跟踪排球的轨迹

2021-01-04 23:16 1036 查看

介绍

本文将带领大家如何把人工智能技术带到体育项目中。

运动中的人工智能是一个很新的东西,以下是一些有趣的作品:

在开始之前,让我们先来研究以下视频数据集的一些细节:

  • 摄像机是静止的,位于球场后面
  • 如果打球的运动员技术水平不是高,我们可以轻松地看到球(专业人士击球太猛,如果没有电视回放几乎不可能看到球)
  • 球的颜色:蓝色和黄色,与地板的反差不大,这使得所有基于颜色的方法变得毫无意义
    解决方案
    到目前为止最明显的方法 —— 用颜色 —— 不起作用,所以我利用的是正在移动中的球。

让我们找到移动的物体并识别出它是球,听起来很简单。

OpenCV包含用于检测带有背景移除的移动对象的工具:

mask = backSub.apply(frame)
mask = cv.dilate(mask, None)
mask = cv.GaussianBlur(mask, (15, 15),0)
ret,mask = cv.threshold(mask,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

将这样的图片


转化成:


在这个例子中,球在上面,人脑和眼睛可以很容易地检测到它,那我们是如何决定的?可以从图中可以推断出一些规律:

  • 这个球是团状的

  • 这是照片上最高的斑点

但第二条规律不太管用,例如在这张照片中,最高的斑点是裁判的肩膀。


但 highest-blob 方法提供了进一步的初始数据。
我们可以收集这些斑点并训练分类器来区分球。
此数据集如下所示:

在人工智能方面来看,这是一个二元分类的彩色图像,非常类似于Cats-vs-Dogs挑战。

实现的方法有很多种,但最流行的方法是使用VGG神经网络。

一个问题 —— 球的图片非常小,不适合用多个卷积层,所以我不得不将VGG简化为一个非常简单的架构:

model = Sequential([
Convolution2D(32,(3,3), activation='relu',       input_shape=input_shape),         MaxPooling2D(),            Convolution2D(64,(3,3), activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(64, activation='relu'),
Dropout(0.1),
Dense(2, activation='softmax')
])

model.compile(loss="categorical_crossentropy",   optimizer=SGD(lr=0.01), metrics=["accuracy"])

该模型简单,结果一般:大约20%的假阳性和30%的假阴性。

但这总比什么都没有好,当然,这样还不够。

应用于游戏的模型会产生许多“假球”:

实际上有两种假球:

  • 它们随机时间出现在随机位置
  • 这个模型总是犯错误,把其他东西认作一个球
    轨迹
    下一步,我们的想法是这样:球不会随机移动,而是遵循抛物线或线性轨迹。
    对这个几何体上的水滴运动进行验证将切断随机和一致的错误。
    有一个记录一次打球的轨迹的例子:

    其中有向路径为蓝色,静态路径为绿色,随机路径为灰色。
    只有蓝色的轨迹才是有用的,它们至少由3个点组成,并且有一个方向。方向是非常重要的,因为有了方向就可以预测下一个点,以防它在实际流中丢失,并且没有检测到新的路径。
    这个逻辑应用到片段中产生一个相当真实的跟踪:

    链接
    Github存储库
  • https://github.com/tprlab/vball
    参考链接:https://towardsdatascience.com/ball-tracking-in-volleyball-with-opencv-and-tensorflow-3d6e857bd2e7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: