使用OpenCV+Tensorflow跟踪排球的轨迹
共 2477字,需浏览 5分钟
·
2020-09-18 05:01
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
介绍
本文将带领大家如何把人工智能技术带到体育项目中。
运动中的人工智能是一个很新的东西,以下是一些有趣的作品:
篮球
https://dev.to/stephan007/open-source-sports-video-analysis-using-maching-learning-2ag4 网球 https://www.researchgate.net/publication/329740964_Convolutional_Neural_Networks_Based_Ball_Detection_in_Tennis_Games 排球 https://www.tugraz.at/institute/icg/research/team-bischof/lrs/downloads/vb14/
在开始之前,让我们先来研究以下视频数据集的一些细节:
摄像机是静止的,位于球场后面 如果打球的运动员技术水平不是高,我们可以轻松地看到球(专业人士击球太猛,如果没有电视回放几乎不可能看到球) 球的颜色:蓝色和黄色,与地板的反差不大,这使得所有基于颜色的方法变得毫无意义
解决方案
到目前为止最明显的方法 —— 用颜色 —— 不起作用,所以我利用的是正在移动中的球。
让我们找到移动的物体并识别出它是球,听起来很简单。
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)
将这样的图片
转化成:
在这个例子中,球在上面,人脑和眼睛可以很容易地检测到它,那我们是如何决定的?可以从图中可以推断出一些规律:
这个球是团状的
这是照片上最高的斑点
但第二条规律不太管用,例如在这张照片中,最高的斑点是裁判的肩膀。
在人工智能方面来看,这是一个二元分类的彩色图像,非常类似于Cats-vs-Dogs挑战。
Cats-vs-Dogs:https://www.kaggle.com/c/dogs-vs-cats
实现的方法有很多种,但最流行的方法是使用VGG神经网络。
VGG神经网络:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
一个问题 —— 球的图片非常小,不适合用多个卷积层,所以我不得不将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%的假阴性。
但这总比什么都没有好,当然,这样还不够。
应用于游戏的模型会产生许多“假球”:
它们随机时间出现在随机位置 这个模型总是犯错误,把其他东西认作一个球
轨迹
链接
https://github.com/tprlab/vball