作者 | Constantin Toporov
编译 | Flin
来源 | towardsdatascience
介绍
在有了将人工智能应用于体育项目方面的经历之后, 我受到启发继续前进. 家庭练习不足以成为我的目标, 我的目标是团队比赛.
运动中的人工智能是一个很新的东西. 这里有一些有趣的作品:
篮球
网球
排球
我是个排球迷, 让我们谈谈最后一个网站. 这是一个奥地利研究所的网站, 他分析了当地业余联赛的比赛.
其中有一些文档需要阅读, 更重要的是打开视频数据集.
排球是一项复杂的运动, 有许多不同的方面. 所以我从一个很小但很重要的部分开始 -- 球.
跟踪球是一项非常著名的任务. 谷歌提供了很多链接, 但其中有许多只是一个简单的演示. 显然, 在摄像机前识别和跟踪一个彩色的大球是无法与真实的比赛用球检测相比较的, 因为现实世界中的球很小, 移动速度很快, 而且融入了背景中.
最后, 我们想得到这样的结果:
在开始之前, 让我们注意一下视频数据集的一些细节:
摄像机是静止的, 位于球场后面
打球的运动员技术水平没那么高, 我们可以自由地看到球 (专业人士击球太猛, 如果没有电视回放几乎不可能看到球)
球的颜色: 蓝色和黄色, 与地板的反差不大. 这使得所有基于颜色的方法变得毫无意义
解决方案
到目前为止最明显的方法 -- 用颜色 -- 不起作用. 我利用的是正在移动中的球.
让我们找到移动的物体并识别出它是球, 听起来很简单.
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 挑战.
Cats-vs-Dogs: https://www.kaggle.com/c/dogs-vs-cats
实现的方法有很多种, 但最流行的方法是使用 VGG 神经网络.
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
来源: http://www.bubuko.com/infodetail-3683452.html