一、基础概念

在之前的四节中,我们尝试解决:

1,球员识别、足球识别、裁判识别;

2,队伍的分类

3,平面坐标的换算

存在关键的问题是:每一帧的画面,每次都是重新识别,无法将特定的人与坐标对应上。

我们需要知道每个球员、裁判的实时位置,并将实时位置记录对应到关键帧,能够通过世界坐标的变换,得到想要的足球参数。

1.1 识别目标

利用对象跟踪,实现定人的实时追踪。

1.2 实现思路

1)初始帧画面,利用对象检测识别球员、裁判、球,并生成编号便于跟踪。

2)利用CSRT实现多目标追踪,跟踪检测到的对象,确保不丢失。

3)设计简单的刷新算法,确保视频范围内人员进出画面进行新的目标检测。

4)探讨当跟踪丢失(如对象离开画面、人员重叠后的跟踪丢失)

二、代码实现

2.1 对象检测

参见《足球视频AI(二)——球员与球的目标检测》

2.2 CSRT目标追踪技术

2.2.1 依赖包

Nuget Install OpenCvSharp4
Nuget Install OpenCvSharp4.Extensions
Nuget Install OpenCvSharp4.runtime.win
Nuget Install Numpy.Bare

其中OpenCvSharp包中,提供了类TrackerCSRT的实现。

CSRT概念性的内容需要大家翻阅数据,在此不再详述,本系列主要是实操内容。

2.2.2 跟踪的数据结构

    internal class TrackerObject{public TrackerObject(Tracker tracker, YoloPrediction prediction) {Tracker = tracker;Prediction = prediction;}public Tracker Tracker{ get;set;}public Rect Rect { get;set;}public YoloPrediction Prediction { get; set; }}

该数据结构,将首次对象检测到的球员Bound,存储在YoloPrediction中。

因采用了多跟踪器的实现,所以每个球员、裁判、球对应一个Tracker对象。

2.2.3 接口定义

    public interface ITracker<T> : IDisposable{bool NeedFlush { get;}public int MaxCount { get; set; }void Init(List<T> detections, Mat frame);List<T>? Update(Mat frame);}

1, 对于人的跟踪,我们设计的简单的算法,假设视频首帧中检测到14人,其它球员在视频的视界范围外。存在以下情况:

​ 1),新的人员跑进视界;

​ 2),既有人员从视界中跑出去;

​ 3),跟踪器丢失了跟踪。

​ 算法中每格60帧重新对象检测,通过人员总数的变化率大于30%,则重设跟踪(已有跟踪没有进行鉴别)。

​ 当触发了30%阈值情况,则NeedFlush标志为True;MaxCount用来定义视界中的人员总数。

2, 对于球的跟踪,仅适用于跟踪丢失的情况。

2.2.4 跟踪器设计

    internal class MutiTrackerCV : ITracker<YoloPrediction>{private List<TrackerObject> trackers;private int MissCount=0;/// <summary>/// <inheritdoc/>/// </summary>public int MaxCount { get; set; }/// <summary>/// <inheritdoc/>/// </summary>public bool NeedFlush{get => MaxCount == 0 ? true : ((float)MissCount / MaxCount > 0.3);} public MutiTrackerCV(){trackers = new List<TrackerObject>();}public void Dispose(){for (int i = 0; i < trackers?.Count; i++){TrackerObject? tracker = trackers[i];tracker.Tracker?.Dispose();tracker = null;}}/// <summary>/// <inheritdoc/>/// </summary>public void Init(List<YoloPrediction> detections, Mat frame){trackers = new List<TrackerObject>();int i = 0;foreach (var d in detections){i++;var tracker = TrackerCSRT.Create();var rect = new Rect((int)d.Rectangle.X, (int)d.Rectangle.Y, (int)d.Rectangle.Width, (int)d.Rectangle.Height);tracker.Init(frame, rect);if (null != d.Label)d.Label = new YoloLabel() { Color = d.Label.Color, Kind = d.Label.Kind, Name = d.Label.Name, Id = i};var trackerObject = new TrackerObject(tracker, d) { Rect = rect};trackers?.Add(trackerObject);}MaxCount = trackers.Count;}/// <summary>/// <inheritdoc/>/// </summary>public List<YoloPrediction>? Update(Mat frame){var missObjects = new List<TrackerObject>();foreach (var tracker in trackers){var rect = (Rect)tracker.Rect;var ismiss = tracker.Tracker?.Update(frame, ref rect);if (ismiss == null || ismiss == false)missObjects.Add(tracker);elsetracker.Prediction.Rectangle = new System.Drawing.RectangleF(rect.X, rect.Y, rect.Width, rect.Height);}foreach (var tracker in missObjects)trackers.Remove(tracker);MissCount = missObjects.Count;return trackers?.Select(p => p.Prediction).ToList();}}

其中,Tracker?.Update函数返回的是单个跟踪对象是否丢失的标志位。

当为false时说明跟踪对象丢失——例如白色的足球,滚动仅纯白色区域后。再出现时跟踪会丢失。

2.2.5 目标跟踪实现

[Fact]public void TestPlayerTracker(){var detector = new DetectorYolov7();var mutiTracker = new MutiTrackerCV();var mats = LoadImages.LoadVideo("test.mp4");int frameNumber = 0;//逐帧处理foreach (var mat in mats){if ((frameNumber % 60) == 0){//目标检测var predictions = detector.Detect(mat);var playerNumber = 1;//绘制对象Boundpredictions.ForEach(item=>{//略...区分人、球//略...原始视频CV绘制球员Bound//原始视频CV绘制球员号码Cv2.PutText(mat, $"{item.Label?.Id}", new OpenCvSharp.Point(item.Rectangle.X, item.Rectangle.Y),HersheyFonts.HersheySimplex, 0.5, Scalar.AliceBlue, 1);//略...平面投影坐标点绘制,参见《足球视频AI(一)——位置与平面坐标的转换》//略...平面投影球员号码绘制playerNumber++;});//跟踪人员if (mutiTracker.NeedFlush || (predictions.Count > mutiTracker.MaxCount * 1.3))mutiTracker.Init(predictions, mat);}//刷新跟踪mutiTracker.Update(mat);frameNumber++;}Assert.True(mutiTracker?.MaxCount >0);}

三、总结

通过目标跟踪的实现,确定球员、裁判、球三个要素的唯一性。

结合二维平面投影,记录顺时的位置,便可以统计相关的比赛数据。

其中,总移动距离、顺时速度、持球速度、传射、防守等换算信息,不是我们研究的重点,属于工程化问题。

足球视频AI(五)——球员与球的对象跟踪相关推荐

  1. 足球视频AI(二)——球员与球的目标检测

    一.基础概念 1.1 识别目标: 1)固定机位的视频中球员逐帧识别 2)固定机位的视频中球逐帧识别 3)位置换算与记录 1.2 实现思路 1,利用OpenCV的相邻帧差异识别移动物体 2,利用YOLO ...

  2. 足球视频AI(一)——位置与平面坐标的转换

    依赖: C# OpenCVSharp WPF Numpy 目的:解决足球场上,人物投影到二维平面的位置坐标 图A / B/ C 一.基础概念 1.1标准球场的定义: 参考:https://zh.m.w ...

  3. 百度VidPress Sports团队获SoccerNet-v2足球视频理解竞赛双料冠军

    2021欧洲杯足球赛近日"姗姗来迟",牵动了无数球迷的心.精彩的球赛视频背后,令人意想不到的是 AI 技术正在重塑体育视频产业的内容生产方式. 在近期举办的国际计算机视觉与模式识别 ...

  4. 视频AI,助力体育赛事转播走进智能时代

    摘要: 2018俄罗斯世界杯经过近20天的激战,已经进入到最关键的阶段.本次赛事除了精彩纷呈的比赛之外,还加入很多高科技的元素,例如门线.VAR技术等等.让本届世界杯成为科技含量最高的一届世界杯. 2 ...

  5. 视频AI对话杭州云栖:新一代视频智能生产的探索与实践

    在今年的杭州云栖大会AB区中庭,有一个全透明建筑备受瞩目,这就是云栖数据指挥中心.在这块大屏中的媒体中央厨房部分,正是采用了视频智能生产方案,将多模态内容理解与云导播和云剪辑相结合,使原来小时级别的视 ...

  6. 攻克视频AI界难题,直通芒果TV offer,这场算法大赛你一定不能错过

    一场面向顶尖 AI 技术人才的数据竞赛正广募英雄,获奖者不仅有奖金回报,还有机会直接进入芒果 TV 算法岗位面试.首届「马栏山杯」国际音视频算法大赛正在火热进行中. 在当前热门的人工智能领域,就业竞争 ...

  7. 云端智创 | 基于视频AI原理的音视频智能处理技术

    本文内容整理自「智能媒体生产」系列课程第二讲:视频AI与智能生产制作,由阿里云智能视频云高级技术专家分享视频AI原理,AI辅助媒体生产,音视频智能化能力和底层原理,以及如何利用阿里云现有资源使用音视频 ...

  8. 阿里云高校计划视觉AI五天训练营教程学习笔记

    阿里云高校计划视觉AI五天训练营教程学习笔记 Day 1 Topic: 视觉生产技术 定义:通过(一个或者一系列)视觉过程,产出 **新的** 视觉表达. 分类 通用基础框架 关键维度 精细理解--举 ...

  9. 阿里云视频AI全能力解读

    摘要: 结合人工智能视频理解流程和用户的需求场景,我们将视频AI的功能分成四个大部分,视频智能审核.视频内容理解.视频智能编辑.视频版权保护.其中视频审核功能包括视频鉴黄.暴恐涉政识别.广告二维码识别 ...

最新文章

  1. 基于SOA分布式架构的dubbo框架基础学习篇
  2. redis如何实现分布式锁?
  3. Spring bean 实现生命周期的三种解决方案
  4. oracle 命名空间 用户
  5. sizeof 是关键字不是函数!使用sizeof需要注意?
  6. CPU 乱序执行验证
  7. CRM呼叫中心和社交媒体集成的技术实现
  8. ASP.net mvc Code First 更新数据库
  9. erp框架 saas_传统ERP软件和SaaS管理软件的区别
  10. php object 对象不存在。增加对象_《相亲者女》:找一个匹配的对象,但永远不存在...
  11. [转载] Spring的数据库操作---- Spring框架对JDBC的整合---- spring集成jdbc概述
  12. 树莓派进阶之路 (023) - Windows下用串行连接控制树莓派(转)
  13. 在腾讯云主机上使用URLOS一键安装yoshop萤火虫小程序商城
  14. Java技术未来十年发展
  15. 制造业OEER语言数据挖掘之相关性分析
  16. The Book Thief
  17. 石油远程《机械设计》第一次在线作业
  18. 广州市 如何报计算机模块,【求助】广州到底去哪里报考计算机等级考试
  19. vins 解读_VINS-mono详细解读
  20. 本机号码一键登录!推荐 Flutter 极光认证插件

热门文章

  1. android返回首页
  2. 这一篇彻底搞懂JS中的prototype、__proto__与constructor真的很好
  3. 教你如何求一个集合的所有非空子集的方差和
  4. 维特智能单轴高精度旋转角度传感器航向倾角仪无漂移HWT101CT
  5. 当a=1,b=2,c=3时,if(ac)b=a;a=c;c=b;的执行结果详解
  6. 函数:fopen的使用方法
  7. 2019 CCF CSP-J2 第4题:加工零件 ← 链式前向星
  8. 案例分享:Qt高频fpga采集数据压力位移速度加速度分析系统(通道配置、电压转换、采样频率、通道补偿、定时采集、距离采集,导出excel、自动XY轴、隐藏XY轴、隐藏显示通道,文件回放等等)
  9. Staf/Stax安装
  10. 【2023秋招】10月9日字节跳动校招题目以及满分解析