一、项目介绍
该项目基于深度网络、机器视觉对人物运动的分析。比如,在足球比赛中,运动员奔跑时重心高度的变化。以及对战术的分析(控球球员可以传球的范围、应该选择传球还是继续带球等)和技术分析(传球的距离和落点)。
意义:运动员在比赛过程中经常会受伤,除去因碰撞和意外的受伤之外,长期的过度运动也会导致骨骼和肌肉的损伤。在长时间的比赛中,因为疲劳而导致的动作变形也会增大骨骼和肌肉的损伤,甚至是由于动作变形导致摔伤或扭伤。该项目就是通过机器视觉,分析人物关节点,再对关节点的位置分析出人物的重心位置变化。针对分析出的问题进行训练,降低损伤,增加运动寿命。
二、设计方案与结构特点
项目分成三个部分,首先DeepSort算法追踪视频中的人物,根据生成的文件将每帧中人物截取出来。然后Alphapose实别每张图中人物的关节点。最后,从第一步的人物框和第二步的关节点中分析出人物重心的变化、战术和技术。还有一些细节,不光是追踪人物,还要追踪足球,但是足球的运动速度快、体积小,难以实别和追踪,需要专门针对足球的实别调整YOLO的网络参数并训练权重。由于视频清晰度的限制,人物截取之后,图像会模糊,关节点的实别效果不好,需要使用超分辨率算法处理图像。对于战术的分析,还需要实别人物球衣的颜色,实别出同队的球员。
Alphapose总体网络结构如下图:
YOLO网络结构如下图:
Deepsort流程图如下:
NMS:非极大值抑制,图中可能包含多个同类型的物体,同一个物体可能会被多个检测框检测到。检测到同一个物体的框只保留得分最高的,并且不影响同类型的其他的物体检测框。
卡尔曼滤波:deepsort中使用卡尔曼滤波对人物运动进行预测,然后结合匈牙利算法匹配前后帧的人物位置,从而实现对人的追踪。卡尔曼滤波的本质属于"估计"范畴.先介绍下估计,所谓“估计”问题,就是对受到随机干扰和随机测量误差作用的物理系统,按照某种性能指标为最优的原则,从具有随机误差的测量数据中提取信息,估计出系统的某些参数状态变量。最早的估计方法是大名鼎鼎的数学家高斯于1795年发明的最小二乘法(,
)。最小二乘法计算简单,易于应用,但没有考虑被估参数和观察数据的统计特性,因次该方法不是最优估计。之后,1912年,英国统计学家费尔希提出最大似然法,从概率密度角度来考虑估计问题。对于随机过程的估计,1940年,控制论的创始人维纳根据火力控制系统上的需要提出一种在频域中设计统计最有滤波器的方法,该方法被称为Wiener滤波。同时期,苏联数学家柯尔莫戈洛夫提出并初次解决广义离散平稳随机序列的预测和外推问题。由于维纳滤波采用频域设计法,运算复杂,解析困难等问题,促使科学家寻求在时域直接设计最优滤波器的方法,于是,卡尔曼滤波应运而生!
匈牙利算法:匈牙利算法用于解决二分图匹配问题。在目标追踪中的一个解决方案是,根据前后帧物体位置的距离,判断是否是同一个物体。假设第一帧有10个物体,第二帧也有10个物体,等同于在这20个物体间进行匹配,由于同一帧的物体不可能是同一物体,所以这可以抽象成一个二分图。
三、API
ImageLoader类,继承DataLoder类,加载图片数据。
VideoLoader类,继承DataLoder类,加载视频数据。
DetectionLoader类,加载yolo模型,调用DataLoder子类对象。
DetectionProcessor类,调用DetectionLoader类对象,预测人物框。
STN:空间变换网络,对于不准确的输入,得到准确的人的框。输入候选区域,用于获取高质量的候选区域。
SPPE:得到估计的姿态。
SDTN:空间逆变换网络,将估计的姿态映射回原始的图像坐标。
Pose-NMS:消除额外的估计到的姿态。
Parallel SPPE:训练阶段作为额外的正则项,避免陷入局部最优,并进一步提升SSTN的效果。包含相同的STN及SPPE(所有参数均被冻结)。
PGPG(Pose-guided Proposals Generator):通过PGPG网络得到训练图像,用来训练SSTN+SPPE。
四、目录文件结构
文件目录:
doc:存放文档。
examples:存放运行样例和结果文件
models:存放sppe、ssd和yolo的权重文件。
SPPE:sppe模块,用于得到估计的姿态。
train_sppe:用于训练sppe模块的网络。
yolo:存放yolo的网络模型。
五、运行环境
torch==0.4.0
torchvision==0.2.0
visdom
nibabel
pandas
tqdm
matplotlib
opencv-python
ntpath
六、核心工作机制
先将视频输入deepsort,得到人物框和id组成的文件。再根据文件将视频中每帧的人物截取下来(一个23秒的视频能截取2万多张人物图像)。Alphapose既可以对图像中的人物标关节点,也可以对视频中的人物标关节点,但是alphapose没有追踪功能,所以暂时只使用对图像人物标关节点的部分。alphapose对人物图像标处理之后,得到一个json文件,里面包括图片中人物的所有关节点信息。
重心分析部分:根据两个结果文件,得到每帧人物框的信息和关节点信息。通过手动标出球场的四个点,使用opencv的投影变换功能,将图像中梯形的球场映射成真实的矩形球场,这里只要拿到映射关系的矩阵即可。在人物是与球场垂直的前提下,通过映射矩阵可以算出人物框底边中心像素代表的实际长度,根据此长度乘以重心的到底边的像素个数,可以得到人物重心的高度。由此,得到人物每帧的重心高度,进而分析重心高度的变化是否由超过身高的8%。
战术分析部分:使用opencv得到映射矩阵。识别球员队服颜色,分出两队成员。调整yolo的网络参数,重新训练用来专门识别足球。假设人与球的距离小于1.5米且保持2秒,就认为当前球员正在控球。然后,计算出20米内的所有球员(对手和队友),根据不同的距离,得到队友的接球范围和对手的防守范围的大小(近似看成一个圆形)。用控球球员的位置和防守范围做切线,得到不可以传球的范围。在剩下可选的范围里,找到一个最优的队友,选择传球(先考虑进攻,再考虑防守)。