实验程序视频 下载

1 问题描述

高密度环境下的行人统计一直没有得到很好的解决,主要原因是对高密度人群中的行人检测和跟踪是一个很难的问题,如下图所示环境,存在的困难包括:

检测方面:

由于人群整体处于运动状态,占据了背景的60%以上的面积,导致许多目标检测的方法,如基于背景差的运动目标检测、分割方法难以奏效。另外,由于人群存在大量遮挡,导致基于行人轮廓的检测方法,如HOG也难以奏效。

跟踪方面:

高密度环境中的多目标跟踪,由于存在大量的遮挡、合并、分离,实现准确的跟踪是一个富有挑战性的研究问题。

本实验的目的是对高密度行进人群中的行人流量进行统计,并能够区分上行和下行。实验的基本思路是:

在一个行人头部大小的带状区域中进行头部检测(HaarLike Adaboost方法),然后利用一个滑动的跟踪门对检测的头部结果进行关联,同时利用运动历史图分析的方法估计行人轮廓的运动方向,最后对序列关联特征进行分析给出上下行的统计结果。

下面分三个部分:头部检测、方向分析、关联统计,对算法进行描述。

2 头部检测

如图所示复杂环境下,能够较好的在高密度人群中区分行人的特征只有头部。当摄像机架设一定高度时,行人头部遮挡较少,对检测和跟踪较有利。

头部检测优势在于:头部具有结构化的一些特征,相对于肤色、发色而言,受光线、噪声、阴影等影响较小。不足在于:头部的特征变化多样,不同的装束、肤色、方向都会有较大的差别。

我们采用了较为成熟的基于HaarLike特征的Adaboost分类器算法,对头部进行检测。

《AdaBoost头部分类器训练实验报告》一文中对算法基本原理,分类器样本的选择、处理和分类器的训练、测试进行了详细的描述,在这里不再赘述。只对实验中分类器的具体应用方法进行描述:

Step1: 分类器设置:载入分类器,实验中使用的分类器的原始尺寸为10*10。在检测过程中通过逐级放大分类器实现不同尺寸头部检测(检测头部尺寸范围为10*10-28*28)。

Step2:图像预处理:根据实际情况缩放图像(双线性差值)至合适大小,使图像中行人头部尺寸介于检测范围内(10*10-28*28)。并在图像中设置一高度为30(可以容纳1个头部高度),宽度为图像宽度的检测区域,将图像转换为灰度图像,此后所有操作均在此范围内进行,这样大大提高了检测算法的速度。如下图所示:

Step3:头部检测:为了能够检测不同尺度的头部,将分类器以一定的比例(如1.1)逐级放大后遍历检测区域。例如要检测10*10至28*28尺寸范围内的头部,要将分类器(10*10)以1.1比例逐级放大12次,放大比例分别为:1.0 1.1 1.21 1.331 ……,然后用放大后的分类器以步长2在检测区域图像中遍历检测。输出头部的位置和矩形尺寸。

注:一般来说,真实的头部的检测结果会出现一个位置多个尺度矩形检测结果重叠的情况,如上图所示。在之前的实验中,将重叠矩形数量少于1的检测结果滤除,这样可以滤除一部分误检。但是,这样做的同时也会显著增大漏检。所以在本次实验中没有进行该步操作,使尽量完整的初期检测结果参与后期的判决。

3 方向分析
      目标运动方向分析的一种最常用方法是光流法,光流法通过相邻两帧图像中光流近似目标的运动。光流法比较适于估计较短时间内的目标运动趋势(如相邻几帧),且光流法对图像噪声非常敏感,如下图,为实验中视频的两种光流的计算结果。

由于视频中环境复杂噪声大,且相邻两帧图像中目标的运动不规律,所以光流分析效果并不理想。

基于运动历史图的运动分析方法比较适于估计目标较长时间内的运动趋势。该方法累积目标在一段时间内的运动,通过计算时间域梯度估计目标的运动方向。

实验中算法如下:

Step1:计算检测区域的Sobel边缘图(Sobel算子简单,计算速度快),由于只考虑目标上下行的速度,所以只计算图像在垂直方向上的梯度,核如下:

  
4 关联与统计

由于行人头部目标在检测区域中的运动持续时间较短,位移较小,且较少发生遮挡,所以利用跟踪门进行目标的关联,实验中效果较好。

每个头部模型的特征描述为:{x, y, dx, dy, width, height, score, scoreperfrm , scoremax,  frame, startfrm },解释如下:

特征参数

解释

更新条件

x

中心x坐标

目标匹配时

y

中心y坐标

目标匹配时

dx

x方向运动的累积量

目标匹配时

dy

y方向运动的累积量

目标匹配时

width

矩形宽度

目标匹配时

height

矩形高度

目标匹配时

score

目标重复出现(匹配)的次数

目标匹配时,++

scoreperfrm

每帧中目标重复出现(匹配)的次数

目标匹配时,++,每帧结束时清零

scoremax

每帧中目标重复出现(匹配)次数的最大值

每帧结束时更新

frame

目标上一次重复出现(匹配)的时刻(帧计数)

每次匹配时

startfrm

目标第一次出现的时刻(帧计数)

目标出现时

其中,目标匹配的条件为:头部检测结果rect的中心落在模型中心的跟踪门内。跟踪门根据检测区域、头部大小以及运动速度进行设置,实验中设为10,即是以模型中心为中心的20*20的一个矩形跟踪门。

Step1:目标模型初始化

当前头部检测结果rect没有发现与之匹配的模型时,增加一个新的模型,x,y设置为当前rect中心,dx为cos(orient/180*PI),dy为sin(orient/180*PI),width, height与rect宽高相同,score为0,scoreperfrm为0,frame和startfrm为当前帧编号F。其中orient为方向分析中头部的运动方向(0-360)。

Step2:目标模型的更新

当头部检测结果rect与已有模型匹配时,采用滑动平均的方法对目标模型的x,y,width,height分别以速率alpha1,alpha2进行更新。若当前检测rect的中心为rx,与之匹配的目标模型中心为x,则模型参数x更新为:

x=x*(1-alpha1)+rx*alpha1

其他参数的更新类似。

学习速率alpha1,alpha2变化范围在为0.-1.0之间,值越大,模型参数更新越快,实验中分别设置为0.95,0.35,目的是使位置更新较快,而宽高更新较慢。

每当模型成功匹配一次,score=score+1,scoreperfrm=scoreperfrm+1, frame更新为当前帧编号F,dx=dx+cos(orient/180*PI), dy=dy+ sin(orient/180*PI)。

当每一帧的检测结果更新结束后,令scoremax=max(scoremax, scoreperfrm),即scoremax记录该目标在每帧中检测结果匹配次数的最大值。

Step3:行人的统计

当每一帧检测的目标模型的匹配更新结束后,遍历所有目标模型,进行行人统计和上下行判决。

基本思想:真实的目标模型一般存在时间(帧数)较长,存在期间匹配次数较多,且在单帧中匹配次数的最大值较大。所以可以根据目标模型存在的帧数、重复出现(匹配)的次数、匹配次数的均值、以及单帧中匹配次数最大值,判定是真实目标还是噪声。同时,多数噪声目标不存在运动,可以通过运动方向滤除一部分噪声。

当模型有较长时间没有被匹配时,我们认为该目标已离开检测区域。根据模型中的frame值和当前帧F的差值可以判决目标是否已经消失或离开检测区域。

行人判决准则为:

行人:F-frame> BAD_FRAME且score>GOOD_SCORE

且score / (frame - startfrm +1) > GOOD_SCORE_RATIO

且|dy|/( frame - startfrm+1) > GOOD_DIR_AVER

且scoremax >= GOOD_SCORE_MAX

行人方向:目标上下行判决:dy>0为下行, dy<0为上行。

实验中,BAD_FRAME为6,GOOD_SCORE为2,GOOD_SCORE_RATIO为0.7-0.9,GOOD_DIR_AVER为0.01,GOOD_SCORE_MAX为3。

注:GOOD_SCORE_RATIO 平均匹配率门限,通过调节该参数在一定程度上实现漏检和误检的均衡,当该参数增大时,误检率降低,漏检率升高,反则反之。该参数一定程度上可以根据实际视频中行人通过检测区域的速度设置,速度快,则小,反则反之。

5 实验

利用VC++6.0和Intel OpenCV1.1编写实验程序,分别对低密度和高密度行人视频进行行人统计。

实验1:VideoProcess(420 340).exe

实验视频:00011.AVI (400*304,时长6分45秒)

参数调整:

为了使头部尺寸在检测范围内(10-28),将图像放大至 420*340

GOOD_SCORE_RATIO  0.7

实验结果:

实际通过检测区域行人(头部)共计110人次(人工统计结果),算法检测结果为109人次。

其中 漏检8人次,漏检率7.3%

误检7人次,误检率6.4%

在检测正确的行人103人次中,行人运动方向计算错误1次。

分析:

漏检主要原因:1 打伞 2 骑车速度过快 3 头顶头发花白(老太太)4 戴白色帽子 5 受车辆通过时阴影遮挡

误检主要原因:衣服某些区域被误检为头部。

方向计算错误的原因:行人骑车速度过快。

检测速度:每帧约耗时26-27ms,CPU占用率50%。 (Pentium Dual-Core T4400 2.2GHz)

实验2:VideoProcess(352 288).exe

实验视频:acvis09-5950.avi (640*480,时长47秒)

参数调整:

为了使头部尺寸在检测范围内(10-28),将图像放大至 420*340

GOOD_SCORE_RATIO  0.9

实验结果:

实际通过检测区域行人(头部)共计61人次(人工统计结果),算法检测结果为73人次。

其中 漏检6人次,漏检率9.8%

 

6 结论

该行人统计方法柔性较好,针对不同的应用场景参数调整较少。实时性好,在普通PC上能够实现30FPS的检测速度。统计准确率较高,当行人密度低时能达到90%以上的准确率,当行人密度高时能达到70%以上的准确率。初步达到了实际应用需求。

 

http://lh2078.blog.163.com/blog/static/56811372201201894446772/

http://www.so.com/s?q=行人检测&src=se_zoned

http://blog.csdn.net/wangningbo128/article/details/6581581

http://ice.dlut.edu.cn/lu/hhd.html 大连理工大学human head detection

http://news.gg-robot.com/asdisp2-65b095fb-49995-.html

http://www.vanaheim-project.eu/assets/BalaSubburamanDescampsCarincotte-PETS-2012.pdf  The head detector is based on state-of-art cascade of  boosted integral features

http://www.psychnology.org/File/PNJ7(3)/PSYCHNOLOGY_JOURNAL_7_3_PERREIRA.pdf  Fast, low resource, head detection and tracking for interactive applications

http://research.microsoft.com/pubs/80582/ECCV_CAT_PROC.pdf 微软研究院猫头检测

目标检测之人头检测(HaarLike Adaboost)---高密度环境下行人检测和统计的更多相关文章

  1. MQ在高并发环境下,如果队列满了,如何防止消息丢失?

    1.为什么MQ能解决高并发环境下的消息堆积问题? MQ消息如果堆积,消费者不会立马消费所有的消息,不具有实时性,所以可以解决高并发的问题. 性能比较好的消息中间件:Kafka.RabbitMQ,Roc ...

  2. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  3. 利用redis实现分布式事务锁,解决高并发环境下库存扣减

    利用redis实现分布式事务锁,解决高并发环境下库存扣减   问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...

  4. 【高并发】高并发环境下如何优化Tomcat配置?看完我懂了!

    写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行模式 Tomca ...

  5. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  6. 【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!

    写在前面 随着系统并发量越来越高,Tomcat所占用的内存就会越来越大,如果对Tomcat的内存管理不当,则可能会引发Tomcat内存溢出的问题,那么,如何防止Tomcat内存溢出呢?我们今天就来一起 ...

  7. 高并发环境下,Redisson实现redis分布式锁

    原文:http://tlzl0526-gmail-com.iteye.com/blog/2378853 在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好, ...

  8. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  9. 高并发环境下全局id生成策略

    解决方案: 基于Redis的全局id生成策略:(推荐此方法) 基于雪花算法的全局id生成: https://www.cnblogs.com/kobe-qi/p/8761690.html 基于zooke ...

随机推荐

  1. 移动电子商务:五个技术标准与Trustonic TEE解决方案【转】

    转自:http://www.vonwei.com/post/mobileTrustonicTEE.html 转载申明:本站原创,欢迎转载.但转载时请保留原文地址.原文地址:http://www.von ...

  2. synchronous interrupt and asynchronous interrupt

    Asynchronous interrupt 中斷请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设,对CM3来说是"异步"的: e.g. usb otg device S ...

  3. shell的各种运行模式?

    交互式shell和非交互式shell,login shell和non-login shell.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录.. 交互式模式就是shell等待你的 ...

  4. K均值聚类(C++)

    #include<math.h> #include<stdio.h> #include<stdlib.h> #include<iostream> usi ...

  5. Network | Cookie and Session

    Cookies are arbitrary pieces of data chosen by the web server and sent to the browser. The browser r ...

  6. Codeforces 583 DIV2 GCD Table 贪心

    原题链接:http://codeforces.com/problemset/problem/583/C 题意: 大概就是给你个gcd表,让你还原整个序列. 题解: 由$GCD(a,a)=a$,我们知道 ...

  7. java程序容错

    程序最怕出错的方式就是直接闪退 编程应该以这种方式进行,保证结构不出错,数据可容错的方式 比如 fungetsonmfrominternet(){变量 a a=从网络返回数据 return a } 在 ...

  8. 怎样去主动拿一个锁并占有?synchronized关键字即可

    怎样主动去拿一个?synchronized关键字即可 怎样去释放一个锁呢?要求锁对象主动释放,打乱占有当前锁的线程即可

  9. 【spring boot】application.properties官方完整文档【参考使用】

    官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...

  10. 解决unknown import path "golang.org/x/sys/unix": unrecognized import path "golang.org/x/sys"

    问题描述 当我们使用 go get.go install.go mod 等命令时,会自动下载相应的包或依赖包.但由于众所周知的原因,类似于 golang.org/x/... 的包会出现下载失败的情况. ...