[AI开发]目标跟踪之计数

news/2024/7/16 8:13:38 标签: 人工智能

基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景)、计数(交通类应用场景、安防类应用场景)以及行为检测(交通类应用场景、安防类应用场景)。我会写三篇文章依次介绍这三个主题。

(1)目标跟踪之速度计算

(2)目标跟踪之计数

(3)目标跟踪之行为检测

后面会陆续添加链接。

本篇文章以交通类应用场景为例,介绍车辆断面计数方法。

 

人工计数方式

设想一个场景,你蹲在地下通道旁边,要统计穿过这条通道最近5分钟的人流量,你实际的做法是什么?目光是停留在一个人身上,从TA进入通道直到离开吗?当然不是,因为这样的话你根本没有那么多双眼睛。正常人会在通道中某个位置想象出来一条虚拟分界线,目光紧盯这条线附近区域即可,有人跨线计数就加一。他们是不会关注这条直线两边稍远区域的目标,因为那里有什么、有多少目标都不会影响最终的计数结果。

如上图,对于A区域和B区域范围内的目标,观察者是不需要考虑的,只有经过黄色虚拟计数线的目标才会纳入计数范畴。在A和B区域出现的目标停留、调头等都不影响最终的计数结果。

 

自动计数原理

自动计数原理其实跟人工计数一致,计数算法应该同样假设出一条虚拟的分界线,目标穿过这条虚拟的分界线时,总计数加一。前面提到过,目标经过跟踪算法处理后,会得到一个唯一目标标识和对应的运动轨迹坐标点集合,通过这两个数据可以很快判断某个目标是否穿越某条直线。2D平面中判断一个点(X,Y)在一条直线(X1, Y1)(X2, Y2)左侧还是右侧的算法很简单,下面是对应代码:

 1 // check if point at one side of line
 2 bool LeftOfLine(Point p, Point p1, Point p2)
 3 {
 4     if (p1.X == p2.X)
 5     {
 6         return p.X < p1.X;
 7     }
 8 
 9     if (p1.Y == p2.Y)
10     {
11         return p.Y < p1.Y;
12     }
13 
14     if (p2.X < p1.X)
15     {
16         Point tmp = p2;
17         p2 = p1;
18         p1 = tmp;
19     }
20 
21     int ret = (p2.Y - p.Y) * (p2.X - p1.X) - (p2.Y - p1.Y) * (p2.X - p.X);
22     return ret < 0;
23 }    

上面代码可以判断点P是否在P1和P2组成直线的左侧,如果是返回True,否则返回False。(直线左侧和右侧并不太恰当,在实际使用过程中,如果P1和P2已经确定,该方法返回True代表点在直线的一侧,返回False代表点在直线的另一侧)。目标刚出现时,我们通过以上方法判断它在直线的某一侧(方法返回结果为A),目标在移动过程中,会不断得到新的位置点(轨迹点集合中最新的一点),我们还是通过以上方法来判断目标在直线的某一侧(方法返回结果为B),如果A!=B,说明目标跨越了直线,此时计数应该加一。已经参与计数的目标设置一个Flag,后面不再参与计数逻辑。

下面给出5种情况,说明自动计数逻辑中,目标参与计数和不参与计数的规则:

(1)理想情况下,目标从监控画面底部P1进入时,即可被检测算法检测到,并被跟踪算法跟踪到,之后连续跟踪,直到离开监控区域,从P2处消失。目标跨域虚拟计数线(图中红色虚线),计数生效。

(2)检测算法准确性不高,目标到特定位置P1才被检测到,直到离开监控区域,从P2处消失。目标跨域虚拟计数线,计数生效。

(3)检测算法准确性不高,目标还未跨越虚拟计数线就不能被检测到了。计数不生效。

(4)检测算法准确性不高,或者跟踪算法准确性不高,目标虽然被跟踪到,但是跟踪到的轨迹并不是连续的,并且轨迹刚好在虚拟计数线那里断掉了。计数不生效。

(5)检测算法准确性不高,目标轨迹没有跨域虚拟计数线,这个情况跟(3)一致。

注意,以上举例都是假设目标从监控画面底部进入视野(去向),当目标从监控画面顶部进入视野时(来向),情况类似。

 

影响自动计数准确性的因素

根据前面的讨论,其实影响自动计数准确性的因素很好归纳:

(1)检测算法准确性。目标如果还未跨越虚拟计数线时,检测算法就检测不到该目标了,那么计数肯定丢失;

(2)跟踪算法准确性。跟踪算法效果不好时,目标轨迹不连续,很可能刚好在虚拟计数线那里断掉;

(3)虚拟计数线的位置。虚拟计数线不能太远,很多检测算法对远处的小目标检测效果不理想;当然也不能太近,我们在计数时,为了过滤错误的检测目标,要求必须保证目标轨迹点的数量要大于某个值,比如目标在跨越计数线时,要求目标轨迹点集合中的点数量大于25(必须被连续跟踪超过1秒,假设FPS为25),如果虚拟计数线太近,目标从监控画面下方进入时并且速度很快,那么它不会被连续跟踪超过1秒。

以上是目标跟踪中关于计数的详细说明,有问题留言私信皆可。

转载于:https://www.cnblogs.com/xiaozhi_5638/p/11010749.html


http://www.niftyadmin.cn/n/712046.html

相关文章

java开发为啥要会linux,Java开发要会的Linux命令(一)

作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服务器上都是Linux系统.所以,要和服务器机器交互,就要通过shell命令.1、查找文件find . -name "*.xml" 递归查找所有的xml文件f…

搜索专题: HDU2102 A计划

这不知道是公主被抓走了第几次了&#xff0c;反正我们的骑士救就对了&#xff08;别说了&#xff0c;我都救我都救...&#xff09;;这次的迷宫有些特别&#xff0c;双层&#xff0c;带电梯&#xff08;&#xff1f;&#xff09;&#xff0c;而且这个电梯还有生命危险&#xff0…

MyBatis——谈谈占位符(#、$)的理解与使用

文章目录&#xff1a; 1.#占位符 1.1 #占位符的特点 1.2 使用 #{ } 对数据库执行 update 操作 2.$占位符 2.1 $占位符的特点 2.2 使用 ${ } 对数据库执行 select 操作 3.#{ }、${ } 占位符的综合使用 1.#占位符 1.1 #占位符的特点 MyBatis处理 #{ } 占位符&#x…

量化信噪比 非均匀量化_非均匀量化-Read.PPT

非均匀量化-Read03.11.20 第二章 数字通信技术-2 数字通信技术-1 主要内容 1、差错控制编码的基本思想。 2、PCM的三个基本过程。 3、抽样定理。 4、语音信号的抽样周期。 5、量化的基本思想。 6、均匀量化的弊端。 2.2.2 量化—非均匀量化 关于非均匀量化的主要内容&#xff1…

linux视频嗅探工具,Linux 5.13增加来自英特尔的KCPUID组件 帮助准确识别新推出的CPU...

原标题&#xff1a;Linux 5.13增加来自英特尔的KCPUID组件 帮助准确识别新推出的CPU 来源&#xff1a;cnBeta.COM今天上午&#xff0c;在新开放的Linux 5.13合并窗口的 "x86/misc "拉动请求中&#xff0c;增加了新的KCPUID实用工具。KCPUID是由英特尔添加到Linux内核…

C# System.IO.Path

Path的常用方法 函数列表 对一个路径做相应操作&#xff0c;包括文件路径&#xff0c;目录路径&#xff0c;通常会用到Path这个类&#xff0c; 本文列举一些常用的操作。 获取指定路径字符串的目录信息 public static string GetDirectoryName(string path) 直接看几个示例了&a…

理解代码的二进制级别重用

理解代码的二进制级别重用在软件开发中&#xff0c;经常提到源代码重用&#xff0c;Dll重用等概念&#xff0c;而代码的二进制级别重用则相对晦涩。本文将从软件发布的角度一步一步讲解二进制级别重用的内涵&#xff0c;希望对大家有帮助。需要说明的是&#xff0c;在行文过程中…

C#中几种单例模式

1.静态代码块 /// <summary>/// 静态代码块/// 仅在第一次调用类的任何成员时自动执行/// </summary>public class SingletonStatic{private static readonly SingletonStatic _instance null;static SingletonStatic(){_instance new SingletonStatic();}private…