一、基础概念

1.1 识别目标:

1)固定机位的视频中球员逐帧识别

2)固定机位的视频中球逐帧识别

3)位置换算与记录

1.2 实现思路

1,利用OpenCV的相邻帧差异识别移动物体

2,利用YOLO7的机器学习识别对象,本文主要介绍YOLO7方案

二、代码实现

依赖项:

Nuget Install IVilson.AI.Yolov7net
Nuget Install OpenCvSharp4
Nuget Install OpenCvSharp4.Extensions
Nuget Install OpenCvSharp4.runtime.win
Nuget Install Numpy.Bare

2.1 接口定义

    public interface IDetector<T> :IDisposable{List<T> Detect(Mat mat);}

2.2 OpenCV实现

 public class DetectOpenCV : IDetector<YoloPrediction>{private readonly BackgroundSubtractorGMG fgbg;public DetectOpenCV(){fgbg = BackgroundSubtractorGMG.Create(5);}public event EventHandler<byte[]>? OnMiddelTime;/// <inheritdoc/>public List<YoloPrediction> Detect(Mat mat){Point[][] contours;HierarchyIndex[] hierarchies;List<YoloPrediction> predictions;var topRows = (int)mat.Rows / 8;var midleRows = Convert.ToInt32(mat.Rows / 3.5);predictions = new List<YoloPrediction>();//高斯处理Cv2.GaussianBlur(mat, mat, new Size(13, 13), 0);//二值化var thresh = BackgroundSubtract(mat);OnMiddelTime?.Invoke(null, thresh.ToBytes());//视距最远端处理var k1 = np.array(new[,]{ {1, 1, 1, 1},{1,1,1,1},{1,1,1,1},{0,1,1,0},{0,1,1,0},{1,1,1,1},{1,1,1,1},{1,1,1,1}}, np.uint8);var k1m = InputArray.Create(k1.GetData<int>(), MatType.CV_8U);var k2 = Mat.Ones(25, 15, MatType.CV_8UC1);var up_area = new Mat(thresh, new Rect(0, 0, thresh.Rows, topRows));Cv2.Erode(up_area, up_area, k1m);Cv2.Dilate(up_area, up_area, k2);//视距中间处理k1 = np.array(new[,]{ {1, 1, 1, 1},{1,1,1,1},{0,1,1,0},{0,1,1,0},{0,1,1,0},{1,1,1,1}}, np.uint8);k1m = InputArray.Create(k1.GetData<int>(), MatType.CV_8U);k2 = Mat.Ones(30, 20, MatType.CV_8UC1);var middel_area = new Mat(thresh, new Rect(0, topRows, thresh.Rows, midleRows - topRows));Cv2.Erode(middel_area, middel_area, k1m);Cv2.Dilate(middel_area, middel_area, k2);//视距近景处理var down_area = new Mat(thresh, new Rect(0, midleRows, thresh.Rows, thresh.Height - midleRows));k2 = Mat.Ones(60, 30, MatType.CV_8UC1);Cv2.MorphologyEx(down_area, down_area, MorphTypes.Close, k2);//边缘检测Cv2.FindContours(thresh, out contours, out hierarchies, RetrievalModes.List, ContourApproximationModes.ApproxNone);//检测对象的转换var lable = new YoloLabel() { Id = 0, Kind = YoloLabelKind.Generic, Name = "person" };foreach (var c in contours){var rect = Cv2.BoundingRect(c);if (rect.Width < 20 || rect.Height < 30)continue;if (rect.Y >= midleRows && rect.Height <= 50)continue;if (midleRows >= rect.Y && rect.Y >= topRows && rect.Height <= 35)continue;var prediction = new YoloPrediction(lable);prediction.Rectangle = new System.Drawing.RectangleF(rect.X, rect.Y, rect.Width, rect.Height);predictions.Add(prediction);}return predictions;}/// <summary>/// 球场去背景/// </summary>/// <param name="frame"></param>public Mat BackgroundSubtract(Mat frame){var fg = new Mat();fgbg.Apply(frame, fg);return fg;}public void Dispose(){fgbg?.Dispose();}}

调用目标检测

        [Fact]public void TestCVFindContours(){var detector = new DetectOpenCV();List<YoloPrediction> lst;using (var mat = LoadImages.Load("field_2.jpg")){lst = detector.Detect(mat);}Assert.True(lst.Count > 0);}

2.3 YoloV7实现

https://github.com/WongKinYiu/yolov7

YOLOv7:可训练的免费赠品袋为实时物体检测器设置了新的最先进技术

2.3.1 编译yolov7-tiny.onnx

1, Github 源码下载到本地并安装Python环境。

2, 下载yolov7-tiny.pt

安装Visual Studio Code 开发工具
打开工具->文件->打开目录...  选择yolov7目录->终端->新建终端
将下载的yolov7-tiny.pt 拷贝到yolov7根目录

按yolov7官网的说明,在新建的命令终端执行以下指令

python export.py --weights=yolov7.pt --grid --simplify

查看输出的yolov7-tiny.onnx 文件,拷贝到C#项目中

2.3.2 集成C#

    public class DetectorYolov7 : IDetector<YoloPrediction>{private readonly Yolov7 _yolo;public DetectorYolov7(){_yolo = new Yolov7(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Assets/yolov7-tiny.onnx"));_yolo.SetupYoloDefaultLabels();}/// <inheritdoc/>public List<YoloPrediction> Detect(Mat mat){var items = _yolo.Predict(mat.ToBitmap());return items;}public void Dispose(){_yolo?.Dispose();}}

调用目标检测

        [Fact]public void TestYoloDetect(){var detector = new DetectorYolov7();List<YoloPrediction> lst;using (var mat = LoadImages.Load("field_2.jpg")){lst = detector.Detect(mat);}Assert.True(lst.Count > 0);}

2.4 标记人或球

        /// <summary>/// 单个对象上画矩形框/// </summary>/// <param name="item"></param>/// <param name="image"></param>protected virtual void PlotBox(YoloPrediction item, Mat image){var x = item.Rectangle.X;var y = item.Rectangle.Y;var width = item.Rectangle.Width;var height = item.Rectangle.Height;var lineSize = (int)Math.Floor((double)image.Cols / 1000);lineSize = lineSize <1 ? 1: lineSize;if (item.Label?.Name?.Equals("sports ball") == true)Cv2.Rectangle(image, new OpenCvSharp.Rect((int)Math.Floor(x), (int)Math.Floor(y), (int)Math.Floor(width), (int)Math.Floor(height)), Scalar.White, lineSize);else if (item.Label?.Name?.Equals("person") == true)Cv2.Rectangle(image, new OpenCvSharp.Rect((int)Math.Floor(x), (int)Math.Floor(y), (int)Math.Floor(width), (int)Math.Floor(height)), Scalar.Yellow, lineSize);elseCv2.Rectangle(image, new OpenCvSharp.Rect((int)Math.Floor(x), (int)Math.Floor(y), (int)Math.Floor(width), (int)Math.Floor(height)), Scalar.Green, lineSize);if (item.Label?.Id > 0)Cv2.PutText(image, $"{item.Label?.Id}", new OpenCvSharp.Point(x, y), HersheyFonts.HersheySimplex, 0.5, Scalar.AliceBlue, lineSize);}

三、总结

实际应用中,Yolov7的目标检测的优势:

1,在广角、侧面、固定机位的镜头下(如足球转播)效果比Opencv明显较好。

2,识别准确率高

劣势:

1,在无人机(高空人物非常小)效果不好,需要训练

2,在广角(鱼眼)效果不好,需要训练

3,在帧处理性能,尤其是CPU设备上处理能力较慢(300毫秒一帧),而GPU能达到30毫秒。

存在不足的地方是,高分辨率、远景的足球视频中,对于足球的识别非常不准确。

因此,后续我们介绍如何自训练Yolov7的模型。

足球视频AI(二)——球员与球的目标检测相关推荐

  1. 足球视频AI(五)——球员与球的对象跟踪

    一.基础概念 在之前的四节中,我们尝试解决: 1,球员识别.足球识别.裁判识别: 2,队伍的分类 3,平面坐标的换算 存在关键的问题是:每一帧的画面,每次都是重新识别,无法将特定的人与坐标对应上. 我 ...

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

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

  3. 超越Mask-RCNN:谷歌大脑的AI,自己写了个目标检测AI

    方栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI 这是一只AI生出的小AI. 谷歌大脑的Quoc Le团队,用神经网络架构搜索 (NAS) ,发现了一个目标检测模型.长这样: △ 看不清请 ...

  4. 增量学习不只有finetune,三星AI提增量式少样本目标检测算法 | CVPR 2020

    作者 | VincentLee 来源 | 晓飞的算法工程笔记 该论文研究了非常有意义的增量式少样本目标检测场景iFSD(Incremental Few-Shot Detection),场景设置如下: ...

  5. 听听优秀的人讲 AI!带你探知目标检测以及分割的现状和挑战

    目标检测和目标分割是计算机视觉里两个基础的研究任务,它们彼此之间存在很紧密的联系,而且目前已经被广泛应用于各种不同的视觉交互的产品中.目标检测和分割任务的背后有很多的技术需要我们去了解,它们之间的关联 ...

  6. 基于昇腾AI异构计算架构CANN的通用目标检测与识别一站式方案初体验

    前言 强大的社会粘性不断催温数字化发展,目标检测与识别作为计算机视觉领域的一项关键技术,应用场景广泛,前景十分广阔,从城市治理.楼宇园区.互联网等领域,延伸至智能家居.金融.医疗影像等更多创新领域.随 ...

  7. (二十七)论文阅读 | 目标检测之MAL

    简介 图1:论文原文 该论文是发表在CVPR2020{\rm CVPR\ 2020}CVPR 2020上的一篇关于目标检测的论文,针对以往目标检测算法在分类和回归时都是使用的同一组anchor{\rm ...

  8. 【OpenMMLab AI训练营第二期】Class6:目标检测与MMDetection

    目标检测与MMDetection 目标检测的基本范式 什么是目标检测 发展 目标检测技术的演进 基础知识 框 交并比IoU 目标检测的基本思路 滑窗 感受野 使用卷积实现密集预测 边界框回归 非极大值 ...

  9. tensorflow精进之路(二十三)——Object Detection API目标检测(上)(Fast R-CNN算法)

    1.概述 上一讲,我们使用slim库对图片进行检测,每个物品用同一种颜色标注,显得乱七八糟的.这一讲,我们来学习目标检测.目标检测就是,输入一张图片,输出是将该图片中所含的所有目标物体识别,并标记出他 ...

最新文章

  1. NASA指定首批9名宇航员,参与波音和马斯克商业载人航天
  2. tensorboard scalar图下载失败不完整解决
  3. 如何给视频中插入视频,字幕,以及去掉前后广告
  4. el-table 行背景颜色_使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作
  5. 【项目合作】移动端人体姿态估计
  6. php多个进程写文件路径,php 控制多个进程同时读写一个文件
  7. mysql指定某行或者某列的排序
  8. 社会化生态农场品,社群+农产品,大有搞头
  9. 申通回应被京东“封杀”;Kotlin 1.4.0 发布 | 极客头条
  10. oracle wallet使用与维护---oracle无密码登录
  11. Charles破解和安装【破解APP抓包限制】Xposed+JustTrustMe关闭SSL证书验证
  12. python_计算股票指标
  13. 损失函数(MSE和交叉熵)
  14. 【离散数学】一阶/谓词逻辑思维导图
  15. Mutex与Semaphore 第一部分:Semephore
  16. 美专家起诉欧洲对撞机可能撞出黑洞毁灭地球
  17. mac 连接上l2tp但是无法访问公网
  18. 人工智能之配置环境教程二:在Anaconda中创建虚拟环境并在VsCode中使用
  19. macbook历代_盘点历代苹果笔记本,简直就是一部MacBook瘦身史
  20. 浪潮开卖人工智能裤子丨Facebook走回头路?人工审核政治广告丨甲骨文发布自动化数据库【软件网每日新闻播报│第10-9期】

热门文章

  1. JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合
  2. SheetJS - XLS sheet_to_json() 方法解析 Excel 时不解析表格标题(表格第一行或N行)
  3. Git恢复之前版本的两种方法reset、revert(图文详解)
  4. C++:for循环执行顺序
  5. 降维(PCA、SVD、LDA)
  6. 为videojs添加自定义组件
  7. 经典目标检测算法:RCNN、Fast RCNN、 Faster RCNN 基本思想和网络结构介绍
  8. wifidog php,用php写wifidog的认证服务器
  9. LSTM反向传播详解(完结篇)Part3/3代码实现
  10. 【照虎画猫】京东首页商品菜单列表的实现