OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:OpenCV中八种不同的目标追踪算法

目标跟踪作为机器学习的一个重要分支,加之其在日常生活、军事行动中的广泛应用,受到极大的关注。在AI潮流中,大家对于深度学习,目标跟踪肯定都会有过接触了解:在GPU上通过大量的数据集训练出自己想使用的垂直场景后再在实际场景中使用。但麻烦的是,大数人拥有的是CPU,有没有办法能在自己的电脑上用CPU就能实现自己的目标跟踪能力。OpenCV的跟踪API给出了答案:我行。

在这篇文章中,我们会介绍在OpenCV上的8种目标检测算法,优势和局限性, 然后会给出代码示例,如何使用它。我们的目标不是对每一个跟踪器都有深入的理论理解,而是从实际使用的角度来理解它们。

目标跟踪基本原则

在视频目标跟踪中的期望是在当前帧中正确找到跟踪的对象,因为我们已经在所有(或几乎所有)以前的帧中成功跟踪了该对象,所以我们知道对象是如何移动的。换句话说,我们知道运动模型的参数。运动模型只是一种奇特的表达方式,它会知道物体在前一帧中的位置和速度(速度+运动方向)。而如果对这个物体一无所知,则可以根据当前的运动模型来预测新的位置,从而非常接近物体的新位置。

我们还可以建立一个外观模型来编码对象的外观。外观模型可用于在运动模型预测的位置的邻域内搜索,以便更准确地预测物体的位置。

目标跟踪可以描述为:运动模型预测物体的大致位置。外观模型微调此估计,以便根据外观提供更准确的估计。

如果对象非常简单,并且没有改变它的外观,我们可以使用一个简单的模板作为外观模型并查找该模板。然而,现实生活并不那么简单。对象的外观可能会发生显著变化。为了解决这个问题,在许多现代追踪器中,这个外观模型是一个在线训练的分类器。

分类器的任务是将图像的矩形区域分类为对象或背景。分类器接受图像区域作为输入,并返回介于0和1之间的分数,以指示图像区域包含对象的概率。如果确定图像区域是背景,则分数为0;如果确定区域是对象,则分数为1。

在机器学习中,我们使用“在线”这个词来指的是在运行时动态训练的算法。离线分类器可能需要数千个示例来训练分类器,但是在线分类器通常在运行时使用很少的示例进行训练。

分类器是通过向其提供正(对象)和负(背景)示例来训练的。如果您想构建一个用于检测猫的分类器,您可以使用包含猫的数千个图像和不包含猫的数千个图像对其进行训练。通过这种方式,分类器学习区分什么是猫,什么不是猫。

OpenCV八种目标跟踪算法

1、GOTURN Tracker

Goturn是一种基于深度学习的对象跟踪算法。最初的实现是在Caffe,目前已经移植到OpenCV跟踪API。

Goturn是一种基于深度学习的跟踪算法,是回归网络的一般对象跟踪的缩写。大多数跟踪算法都是在线训练的。换句话说,跟踪算法学习运行时跟踪的对象的外观。

因此,许多实时追踪器依赖于在线学习算法,这通常比基于深度学习的解决方案快得多。

Goturn改变了我们将深度学习应用于跟踪问题的方式,通过离线方式学习对象的运动。Goturn模型接受了数千个视频序列的训练,不需要在运行时执行任何学习。

Goturn如何工作?

Goturn由David Holded、Sebastian Thrun和Silvio Savarese在题为“用深度回归网络学习100 fps跟踪”的论文中介绍。

图1 GoTurn示意图

如图1所示,Goturn使用一对来自数千个视频的裁剪帧进行培训。

在第一帧(也称为前一帧)中,对象的位置是已知的,帧被裁剪为对象周围边界框大小的两倍。第一个裁剪帧中的对象始终居中。

需要预测对象在第二帧(也称为当前帧)中的位置。用于裁剪第一帧的边界框也用于裁剪第二帧。因为对象可能已移动,所以对象可能未在第二帧中居中是大概率事件。

 训练卷积神经网络(CNN)预测第二帧边界框的位置。

Goturn架构

在Goturn如何工作,看到的是一个黑盒,Goturn架构则让我们了解了盒子里面藏着什么。

图2 Goturn架构

图2显示了Goturn的体系结构。如前所述,它将两个裁剪的帧作为输入。

注:在图2中,上一帧显示在底部,是居中的,我们的目标是找到当前帧的边界框,显示在顶部。

两帧都通过一组卷积层。这些层只是caffenet架构的前五个卷积层。这些卷积层(即pool5特性)的输出被连接成长度为4096的单个矢量。这个向量被输入到3个完全连接的层中。最后一个完全连接的层最终连接到包含4个节点的输出层,这些节点表示边界框的顶部和底部点。

 ( 每当我们看到一组卷积层,并对其含义感到困惑时,可将它们视为改变原始图像的过滤器,这样可以保留重要信息,并丢弃图像中不重要的信息。

通过简单地展开张量,将卷积滤波器末端获得的多维图像(张量)转换成一个长的数字矢量。这个向量作为输入到几个完全连接的层,最后是输出层。全连通层可以看作是一种学习算法,它利用卷积层从图像中提取的有用信息来解决现有的分类或回归问题。)

与其他基于深度学习的追踪器相比,Goturn速度更快。它在caffe的gpu上以100fps的速度运行,在opencv cpu上以20fps的速度运行。尽管跟踪器是通用的,但理论上,通过将传输集与特定类型的对象进行偏移,可以在特定对象(例如行人)上获得更好的结果。

局限性:神经网络体现的优势,往往就是它的劣势。神经网络依赖于训练集中样本所能代表的场景种类,对于不存在的场景,就会存在问题。如在实际使用中,希望跟踪手掌,把手掌移到脸上时,跟踪器锁定在脸上,并不会在手掌上。而跟踪脸,并用手堵遮住脸,但追踪器能够跟踪通过遮挡的脸,这说明训练集存在大量的手掌遮脸的场景。

2、BOOSTING Tracker助推跟踪器

该跟踪器基于ADaboost的在线版本,ADaboost是基于HAAR级联的人脸检测器内部使用的算法。这个分类器需要在运行时用对象的正负示例进行培训。以用户(或其他对象检测算法)提供的初始边界框为对象的正例,边界框外的许多图像部位作为背景。给定一个新的帧,分类器在前一个位置附近的每个像素上运行,并记录分类器的得分。对象的新位置是得分最大的位置。

缺点:速度较慢,并且表现不好,跟踪失败后,不能及时呈现错误报告。

3、MIL Tracker 密尔跟踪器

这个跟踪器的概念与上面描述的BOOSTING Tracker相似。最大的区别是,它不只是将对象的当前位置视为一个正示例,还会在当前位置周围的一个小邻域中查找,以生成几个潜在的正示例。你可能认为这是一个坏主意,因为在这些“积极”的例子中,大多数的对象都不是中心。

这就是多实例学习(mil)来拯救的地方。在mil中,您不指定正负示例,而是指定正负“bags”。正面的图像收集并非都是正面的例子。一个正面的bag包含了以对象当前位置为中心的区域,以及它周围的一个小邻域中的区域。即使被跟踪对象的当前位置不准确,当来自当前位置附近的样本放入正袋中时,很有可能该袋至少包含一个图像,并且该对象很好地居中。

优点:性能不错。它不会像助推跟踪器那样漂移,并且在部分遮挡下也能正常工作。

缺点:失败率较高。

4、KCF跟踪器

 KCF代表kernelized correlation filters。这个追踪器建立在前两个追踪器中提出的想法之上。该跟踪器利用了这样一个事实:在MIL跟踪器中使用的多个正样本具有较大的重叠区域。这些重叠的数据导致了一些很好的数学特性,这些特性被跟踪器利用,从而使跟踪速度更快、更准确。

优点:准确度和速度都比MIL跟踪器好,它报告跟踪故障比BOOSTING和MIL这两个追踪算法好。

缺点:无法从完全遮挡中恢复。

5、TLD跟踪器

 TLD代表跟踪、学习和检测。顾名思义,这个跟踪器将长期跟踪任务分解为三个组件(短期)跟踪、学习和检测。在作者的论文中,“跟踪器跟踪对象从一帧到另一帧。探测器定位到目前为止观察到的所有外观,并在必要时纠正跟踪器。学习估计检测器的错误并更新它以避免将来出现这些错误。”这个跟踪器的输出有点跳跃。例如,如果您正在跟踪一个行人,并且场景中还有其他行人,则此跟踪器有时可以临时跟踪一个与您要跟踪的行人不同的行人。在积极的一面,这条轨迹似乎是在更大的比例、运动和遮挡上跟踪一个对象。如果你有一个隐藏在另一个物体后面的视频序列,这个跟踪器可能是个不错的选择。

 优点:在多帧遮挡下效果最好。此外,跟踪最佳的超比例变化。

 缺点:很多误报使它几乎不可用。

6、MEDIANFLOW跟踪器

在内部,这个跟踪器可以实时地跟踪物体的前后方向,并测量这两个轨迹之间的差异。最大限度地减少这种向前向后的误差,使他们能够可靠地检测跟踪故障,并在视频序列中选择可靠的轨迹。

在测试中发现这个跟踪器在运动可预测和对象小的情况下工作得最好。与其他跟踪者不同的是,即使跟踪明显失败,跟踪者也知道跟踪何时失败。

 优点:出色的跟踪故障报告。当运动是可预测的并且没有遮挡时,效果非常好。

 缺点:大幅度运动跟踪,模型会失效。

7、MOSSE 莫斯跟踪器

最小平方误差输出和(mosse)使用自适应相关进行对象跟踪,当使用单帧进行初始化时,可产生稳定的相关滤波器。Mosse跟踪器对光照、比例、姿势和非刚性变形的变化具有鲁棒性。对于遮挡,跟踪器能够在对象重新出现时暂停并恢复到停止的位置。

优点:速度快。

缺点:准确率不如CSRT和KCF高。

8、CSRT跟踪器

在具有信道和空间可靠性的鉴别相关滤波器(DCF-CSR)中,我们使用空间可靠性图从帧中调整滤波器支持到所选区域的一部分进行跟踪。这样可以确保选定区域的放大和定位,并改进对非矩形区域或对象的跟踪。它只使用两个标准功能(HoGs and Colornames)。它也在相对较低的fps(25 fps)下工作,但提供了更高的目标跟踪精度。

优点:比KCR精度高。

缺点:速度较慢。

OpenCV跟踪算法使用代码实现(C)

1、创建跟踪算法

2、对跟踪算法做初始化操作

3、跟踪监测刷新,获取到下一帧跟踪目标的坐标(x、y、宽、高)

4、利用坐标做跟踪所需要的操作,如画框等

实际检测结果对比

  图片1起始跟踪;图片2运动后跟踪

如上跟踪算法显示,以CBA比赛作为跟踪对象。从跟踪过程中两帧数据可以感知不同跟踪算法在对动态人物变动所体现的差异。

1、MEDIANFLOW、BOOSTING、MIL在针对人物大小有变化时跟踪比较不理想,跟踪不到目标。

2、CSRT、KCF能对运动画面有较好跟踪,但是在遮挡场景下,不能支持,效果较差。

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍: 在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

缺省参数

缺省参数 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int main() {Func(); // 没有传…

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用

Rust 所有权规则 一个值只能被一个变量所拥有&#xff0c;这个变量被称为所有者。 一个值同一时刻只能有一个所有者&#xff0c;也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为&#xff0c;旧的所有者会把值的所有权转移给新的所有者&#…

共襄盛举!400+组织携手发布「2024集成光子学路线图」

3月25日&#xff0c;麻省理工学院微光子中心与PhotonDelta基金会联合领导&#xff0c;携手全球400余家科技、学术及工业界组织&#xff0c;共同发布了2024年版集成光子学路线图。 该路线图被称为IPSR-I&#xff08;Integrated Photonics System Roadmap – International&#…

某眼实时票房接口获取

某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

课程设计项目1.3:双音多频(DTMF)通信设计仿真

01.课程设计内容 02.代码效果图 %参考程序&#xff1a;DTMF信号的产生 kcsj131s.m 差分方程法产生DTMF信号 clear clc fs8000; w2*pi/8000*[941 1336;697 1209;697 1336;697 1477; ...770 1209;770 1336;770 1477;852 1209;852 1336;852 1477];%各信号对应的数字频率 tab[2*co…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

权限问题(Windows-System)

方法&#xff1a;用命令来写一个注册表的脚本 &#xff1f;System是最高级用户&#xff0c;但不拥有最高级权限 编写两文档&#xff1a;system.reg 和 remove.reg,代码如下&#xff1a; system.reg&#xff1a; Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\*…

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号&#xff1a;Qt 学习笔记 / 03 文章目…

图论基础(python蓝桥杯)

图的基本概念 图的种类 怎么存放图呢&#xff1f; 优化 DFS 不是最快/最好的路&#xff0c;但是能找到一条连通的道路。&#xff08;判断两点之间是不是连通的&#xff09; 蓝桥3891 import os import sys sys.setrecursionlimit(100000) # 请在此输入您的代码 n, m map(int,…

什么是工业协议转换软件?

在现代工业自动化领域&#xff0c;随着技术的不断革新和智能化水平的提升&#xff0c;各种工业设备和系统之间的通信变得日益重要。然而&#xff0c;由于历史、技术差异和标准多样化等原因&#xff0c;不同的工业设备和系统往往采用各自独特的通信协议&#xff0c;导致它们之间…

Android Studio 打开Local Changes界面

在编写代码的过程中&#xff0c;经常要回顾本地仓库做了那些修改。打开Local Changes界面&#xff0c;能做到一目了然&#xff0c;不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可

如何使用VNC+Cpolar实现Windows电脑公网远程控制Ubuntu系统桌面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

官宣!一文掌握2024百度CreateAI开发者大会最新议程

4月16日上午9:00&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会将在深圳国际会展中心&#xff08;宝安&#xff09;开幕。此次大会将是近十年来&#xff0c;粤港澳大湾区规格最高的AI大会&#xff0c;将聚焦炙手可热的AI话题&#xff0c;在大会主论坛、分论坛…

卡尔曼滤波笔记

资料&#xff1a;https://www.zhihu.com/question/47559783/answer/2988744371 https://www.zhihu.com/question/47559783 https://blog.csdn.net/seek97/article/details/120012667 一、基本思想 在对一个状态值进行估计的时候&#xff0c;如果想测量值更准&#xff0c;很自然…

Windows搭建Lychee图片管理系统结合内网穿透实现公网访问本地图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

【机器学习】科学库使用第3篇:机器学习概述,学习目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

计算机网络|谢希仁版|数据链路层

数据链路层 数据链路层研究的是什么&#xff1f;数据链路层的几个共同问题数据链路与链路帧通信规程 三个基本问题封装成帧透明传输差错检测可靠传输 点对点协议PPPPPP协议应满足的需求PPP协议的组成PPP协议帧的格式各字段的意义字节填充零比特填充PPP协议的工作状态 使用广播信…

三电源切换电路。

一个三电源切换电路 电路描述 1、Q1、Q2为NMOS&#xff0c;Q3、Q4和Q5为PMOS管&#xff0c;D1为二极管。 2、BAT1和BAT2为电池&#xff0c;BAT2的容量比BAT1大&#xff0c;VIN_5V为外部电源&#xff0c;VOUT为输出&#xff0c;给系统供电。 3、VOUT会从优先级高的电源取电&a…