一个开源小项目,如何使用「分类网络」实现排球追踪

目标检测与深度学习

共 2523字,需浏览 6分钟

 · 2021-03-14

      01      

背景概述

笔者最近接触到了一个很有趣的问题,有关于排球位置追踪。如果有看过排球比赛的话,大家想必都知道,排球的实时运动轨迹对排球的落点有很大的帮助。而如果可以预知排球的落点,就可以很好的在比赛中防住对手,把握取胜先机。因而产生了一个很有趣的问题:是否有可能预测比赛中的排球运动轨迹?这其实是一个典型的物体追踪问题,也是一个在笔者看来很有趣的题目。


然而解决这类问题并不容易。
  • 首先,基于排球的视频数据集数量稀少,有了真值标注的数据集更是少之又少,如何搜索合适的数据是一个不好处理的问题。
  • 其次,排球本身形状较小,直接进行小物体检测,可能易于其他目标混淆,所以用检测实现追踪不是非常理想。
  • 再考虑到实时性的需求,直接调用追踪框架,可能参数过多,实时测试性能表现不佳。

      02      

数据集选择与初始解决方案


考虑到以上种种挑战,开始阶段对于方案的选择并不容易,尤其是标好物体框的排球视频数据集更是非常难找。可是视频数据集是很重要的,一个好的数据集对最终的表现有很大影响。经过仔细评估,最终我选择了一个开源的排球数据集。选择的原因是清晰度较高,拍摄时长恰好,但是该数据集没有可供使用的真值。

为了解决没有真值的问题,我用了以下方法,也是跟别人学习来的。通过观察排球在视频中的位置,我发现排球在运动的时候,倾向于在图像中的较高点。所以如果有办法能把图像中较高点的物体所在位置拿到(比如一些封装好的轮廓),自然就得到了真值。为了实现这一方法,我用了基于自适应混合高斯背景建模的背景减除法(MOG)。

接下来是提出一个合理的解决方案。基于检测精度的要求,希望尽可能的画出大致轨迹,不要求绝对准确但是大致可以用。基于运行速度的要求,希望可以做到实时测试得出结果。考虑到前文所提,一开始的方向大致在调用追踪模型看表现。后来发现实时性无法满足。因而该方案不能直接使用。

之后我仔细看了一下数据集视频。该数据集有以下特点,让我意识到也许有捷径可以走。

  • 球的形状固定,飞行轨迹为抛物线形,所以可能可以尝试用拟合路径的方式来替代。

  • 如果可以把球所在的位置标出来,然后提取出来周围的像素,说不定可以拿来学习,帮助判断对应的一张输入图像有没有球,并且帮助映射球的飞行轨迹。

  • 由于排球自身有落点的问题,每一次落点后轨迹都会断开重连,如何在不使用数据相关方法的基础上,设计方案使得衔接自然合理,也是一个重点。


鉴于以上这些特点,我更新了一下之前的设计方案,使用球定位+识别的方法,而不是直接套用单物体检测框架来实现任务需求。

      03      

设计和实现方案

实现方案大致如下:

  • 使用前文提到的数据生成方法,产生真值数据供分类模型使用

  • 使用深度学习网络建模分类,训练网络并产生预测结果

  • 给定预测数据,送入深度学习网络进行预测,生成类标(预测是否为排球)

  • 对属于排球的帧按照先后时间标记,依次生成追踪结果,用绿色圈标记


首先是生成真值数据,具体实现相对复杂。由于我们的假设(排球比赛中,排球是在移除背景后位置最高的点)不一定成立,实际情况下,需要做额外的处理。首先是要看拿到的到底是不是排球,此外还要把排球附近的背景移除掉,因为这些背景可能对分类结果有很大的干扰。

这里举一个实际的例子, 排球一般是白色背景,而室内场景的日光一般也是白色的,以及场地附近的墙体也会是白色,两者会互相叠加,因而有可能不利于物体分类。之后我们会用形态学操作去进一步处理得到的排球对应的图像块。具体来说,我们会对这些结果进行进一步腐蚀,得到的结果会只留下排球,把周围的背景像素都过滤掉。

在此之后,我使用了一个非常简单的 backbone 去做特征提取,简单来说就是conv->pool->conv->pool->conv->pool,之后因为我们的目的是去做分类,所以损失函数是二分类交叉熵函数。


测试反而比较麻烦。分为好几个流程:

1.生成数据。生成过程中因为不能用数据联系(data association), 需要手动存好图像帧的相对时间(先后顺序)。在实验中我们设计阈值为t=4,即为如果识别出的排球的帧数差大于t,就会切断当前轨迹追踪,并重新生成新轨迹。

2.对生成数据进行预处理。包括
  1. 数据去背景

  2. 标定所有物体,产生物体框(使用cv2即可)

  3. 对于每一个潜在的物体框,按照排球的大概尺寸进行过滤,存储并切取当前像素对应的区块


3.取步骤2结果,依次进行预测,对所有预测类标正确的图,按照 id 进行标记,然后依次分配并且进行阈值判断,从中获得所有追踪轨迹。

      04      

结果展示



      05      

总结

在这篇文章我简单的介绍了如何使用分类方法去做一个追踪器。有兴趣的同学可以查看我的 GitHub,上面有详细的代码: https://github.com/Cli98/volleyball-tracking-demo

✄------------------------------------------------


看到这里了,说明您也喜欢这篇文章,您可以点击「分享」与朋友们交流,点击「在看」使我们的新文章及时出现在您的订阅列表中,或顺手「点赞」给我们一个支持,让我们做的更好哦。


欢迎微信搜索并关注「目标检测与深度学习」,不被垃圾信息干扰,只分享有价值知识!


浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报