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

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

(2)目标跟踪之计数

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

至此,三个主题都结束了。

本篇文章以交通类应用场景为例,介绍车辆异常行为分析方法。车辆异常行为通常又称“车辆异常交通事件”,指车辆在行驶道路上出现的违法行为,一般包括 停车、逆行(倒车)、占用应急车道、拥堵等等。本篇文章分别介绍这四种车辆异常交通事件的分析方法。

注意:高速交通中,通常异常交通事件还包括行人闯入、抛洒物、烟火等,由于这些跟车辆没有直接关联,本文不涉及此类事件。

定位目标轨迹点

前面系列文章已经提到过,目标检测算法会输出目标的位置,一个四元组(Left、Top、Width、Height),代表一个矩形框,该矩形框住的范围就是图像中目标的位置。我们在进行目标行为分析时,需要先找到一个二维点(X,Y),使它最能代表目标在地面上的位置,原因很简单,因为画面中的目标实际是在三维世界中的地面上移动。大家可能第一反应应该选择矩形框的中心点(Left + Width / 2, Top + Height /2),虽然这个点非常好计算,但是实际应用中该点并不非常准确,通过它并不能准确地反映目标在地面上的实际位置。

如上图所示,黄色矩形框代表货车在画面中的位置,如果选取矩形框中心点来定位车辆在路面上的位置,那么货车应该在行车道(右侧车道)上行驶,而实际情况货车正在超车道(左侧车道)上。显然用这种方式去判断车辆在路面上的位置非常不准确。

另外一种方式是选取矩形底边的中心点(Left + Width/2, Top + Height),这种方式比前一种更准确,但是当车道方向与摄像夹角非常大时,定位误差非常明显。

如上图,黄色矩形框代表客车在画面中的位置,如果选取矩形框底边中心点来定位车辆在路面上的位置,那么客车应该压线了,而实际情况客车行驶正常。

实际经验得到,只取矩形框底边中心点还不够,还需要根据车辆行驶方向与垂直方向的夹角大小来动态调整该点的X指,也就是说,最终选取的点应该是 (Left + Width/2 + delta, Top + Height),其中delta可正可负,最终的效果如下:

停车

停车时,目标静止不动,理论上目标轨迹点不变,我们只需要判断轨迹点在连续若干帧之内都没发生变化即可(Xm == Xn && Ym == Yn)。但现实场景中,由于目标检测算法的准确性,同一个目标即使静止不动,每一帧检测到的矩形框也有可能不一样(位置不同、大小不同等),最后得到的轨迹点也不会重合。因此更好的判断方式是:目标轨迹点连续若干帧之内欧氏距离(平面直线距离)不大于某值,比如50像素,那么我们即可认为车辆静止不动(停车事件发生)。

逆行(倒车)

逆行时,目标第M帧轨迹点和第N帧轨迹点的射线与道路方向之间的夹角如果大于某值,比如大于90°,那么判定为逆行。其中M<N

占用应急车道

当车辆行驶时,判断目标轨迹点在连续若干帧内是否都在应急车道中,若是,则为占用应急车道,其他类似的区域事件判定逻辑与这个一样

拥堵 和 缓行

连续若干帧内静止车辆数大于某值,车辆静止的逻辑可以参照前面停车的逻辑。当路面多辆车静止不动时,判定道路发生拥堵。该方式很简单,但是通常情况下,除了这种堵死的情况外,我们更需要知道是否出现缓行(提前应对拥堵发生)。

缓行有两种方式去判断:

(1)结合前几篇文章提到的测速,如果发现多辆行驶车辆的速度都小于某值(可以分级定义),那么判定道路缓行;

(2)很多情况下,车速测不出来(前面文章中有提到,没有参照物的道路测不出车速),那么我们需要使用其他方式先判断单个车辆是否缓行:在连续若干帧中,车辆轨迹点直线距离小于某值,但是大于另外一个值(保证车辆没有停止)。如果连续多帧中出现缓行的车辆数大于某值,那么判定整个道路进入缓行状态。

目标行为分析难点

前面所有的行为逻辑判断全部基于理想状态下:检测算法比较准确,矩形方框锁定目标比较稳定,不会出现丢帧、矩形框抖动严重(位置、大小跳跃厉害)。实际应用场景中,由于各种各样的因素,目标锁定不够准确,会对目标行为分析造成非常大的负面影响。

另外,上面所有判断逻辑全部基于像素单位(图像二维坐标系),这个判断依据存在一定缺陷,检测算法能检测到很远的车辆,虽然这时候车辆一直处于运动状态,但是它反应到平面二维画面上时,车辆几乎静止不动,根据前面的判断逻辑,这种情况会出现停车、拥堵等误报。避免这种误报的方式之一是尽量将摄像头斜对行车道,而不是刚好在车道的正前方/正后方。

除此之外,还有其他一些局限性,比如上面提到的各种阈值的调整,也是非常考验人的一项工作。一般视频分析应用很难同时满足多个场景,针对不同的需求最好做一些特定的优化。

随机推荐

  1. Maven学习(四)-- 生命周期和插件

    标签(空格分隔): 学习笔记 Maven生命周期是抽象的,不做任何实际的工作,在Maven的设计中,实际的任务都交由插件来完成. 每个构件步骤都可以绑定一个或者多个插件行为,而且Maven为大多数构建 ...

  2. 用fscanf()从文件取数据时,如何判断文件结束

    例子:从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中.再从该文件中读入这些数据,将其中小写字母转换成大写字母后再显示屏上输出. 有两种方法 1.使用feof()函数 #inclu ...

  3. c缺陷与陷阱笔记-第一章 词法陷阱

    1.运算符的贪心性,匹配最长的运算符,例如 n-->0,从-开始,-是运算符,--是运算符,-->就不是,所以是 n -- > 0,--是 a---b,-是,--是,,---不是,所 ...

  4. Ice_cream’s world III--2122

    Ice_cream’s world III Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. 译-Web Service剖析: XML, SOAP 和WSDL 用于独立于平台的数据交换

    本文是翻译内容,原文参见: Anatomy of a Web Service: XML, SOAP and WSDL for Platform-independent Data Exchange We ...

  6. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  7. rem 是如何实现自适应布局的

    摘要:rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高.本文讲的是如何使用rem实现自适应.· rem这是个低调的css单位,近一 ...

  8. Jquery模拟多选框(checkbox)

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  9. Tunnels HDU - 4856

    BFS寻找每个点到其他点的最小距离 再状压DP,DP[i][j] i二进制表示每个点的到达状态,j为当前所在点 #include<iostream> #include<cstring ...

  10. 国内+海外IDC资源合作

    主营业务:服务器租用.托管.机柜大带宽.安全防御.云主机.海外专线.海外托管.CDN加速.站群 资源覆盖: 华南:广东东莞.深圳.广州.湛江.福建厦门.泉州.福州 华北:北京.天津.山东 华东:江苏苏 ...