基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法实现视频监控系统

Daisy

发布日期: 2018-09-28 22:21:45 浏览量: 1891
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

摘要

传统的门禁视频监控系统一般是无法对人员进出门禁时进行人头检测,只能通过简单的硬件设施将监控画面传到后端,由监控人员人工进行监视判断。这样会加大监控成本也增加了监控人员的压力,同时也对监控人员的身体健康产生较大影响。所以就有必要设计一款新型门禁监控视频系统来实现人头检测功能,本文设计出的一款基于WPF的门禁监控视频系统,将基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法进行比较,在人员进出门禁系统时进行人头检测并将检测结果以图像方式进行保存。

基于WPF的门禁视频监控系统,采用C#与EmguCV的技术,是实现对人员出入门禁系统时进行人头检测。论文主要分析了两种算法的特征值的提取方法以及利用这两种算法进行人头检测,设计出一个可以检测人头的门禁监控视频。

关键词:视频监控; 人头检测; C#; EmguCV; AdaBoost; SVM

Abstract

Traditional access control videosurveillance systems are generally unable to detect the head of personnelentering and leaving access only through a simple hardware facilities willspread to the rear end of the monitor screen, the monitoring personnel tomonitor artificial judgment. This will increase monitoring costs are increasingpressure monitoring personnel, it will be have a greater impact on healthmonitoring personnel of the body. Therefore it is necessary to design a newaccess control system to achieve video head detection, designed out of aWPF-based access control and video systems, will head detection algorithm basedon AdaBoost and Haar features characteristic of SVM-based Hog head detectionalgorithm comparing head detection and test results performed at the personnelaccess to the access control system to save the image mode..

WPF-based access control videosurveillance systems, using C # and EmguCV technology is to achieve when peoplehead out access system testing. Thesis analyzes the eigenvalues extraction andthe use of these two algorithms two algorithms detect head, designed to detecta surveillance video access control head.

Key words: Video Monitor, Head Detection,C#, EmguCV, AdaBoost, SVM

第1章 绪 论

1.1 选题背景和意义

随着视频监控技术的迅速发展与设备成本的不断下降,视频监控已经遍布于城市的各个角落成为了一种重要的视频信息来源。目前,视频监控系统在银行的安全防范、道路的交通管理、公安刑事侦查等特殊领域已经发挥了及其重要的重用。由于上述领域对于实用的监控视频采集、处理与分析技术和应用表现了十分迫切的需求,各类监控视频信息处理相关的基础理论研究与应用系统的设计开发也越来越受到政府、科研院以及公司的重视。

目前使用的监控系统系统大多只具有录像功能,因此只能提供事后查询,并不能对当时情况作出及时判断并提出警告,例如门禁监控,传统的门禁系统往往将门禁前的视频图像发到视频墙上,由人工监视什么时间人员可以进出,进出是否刷卡,是否有异常情况发生。所以有很多不足产生:

  • 工作强度大,持续时间长,容易对负责浏览视频的工作人员的视觉会造成很大的影响,危害身体健康。
  • 监控成本上,人力成本的持续投入使得成本不断增加。
  • 长时间高强度、高压力的工作状态下,负责视频浏览的工作人员注意力难以集中,容易出现一些重要信息的遗漏和误判现象。
  • 门禁系统刷卡与视频无关联,在突发情况下,监控人员很难判断出发生的原因。

为了解决现阶段门禁的不足。本文设计出基于门禁的视频监控软件系统,在本系统中实现了门禁硬件与视频监控的交互。减轻监控人员的负担,记录异常情况的发生和截图。

1.2 视频监控研究现状

目前美国以及欧洲地区等西方先进国家仍然掌握着大部分智能视频监控系统的核心算法技术,在国际市场上的智能视频监控系统中占据很大的优势。美国国防部高级研究项目署(Defense advanced research projects agency , DARPA)于1997年建立了视觉监控重大项目VSAM(Visualsurveillance and monitoring),该项目对用于民用场景和战场中视频监控的自动理解技术进行了重点研究。马里兰大学研发成功的实时视频监控系统W4主要任务是是被监控场景中的行人,将形状分析和目标跟踪技术相结合,对人的外表进行模型构建。高级研究计划VACE(Video Analysis and Content Extraction)于2003年由美国ARDA机构开始主持。在对车辆和行人的跟踪及其交互作用识别的相关研究方面上,英国雷丁大学(University of Reading)取得了一系列的研究成果。IBM 公司于 2006 年 11月 7 日宣布已开发并销售一款用于分析视频实时监控系统的安全软件—智能监控系统(S3:Smart Surveillance System),它能够将视频摄像头捕捉到的信息通过计算机网络传递到整个系统软件上,发现监控环境中的潜在安全隐患并自动报警以色列也在智能视频监控领域取得了很大的研究成果,他们的产品主要用在边界不含以及商业调查分析领域[7]-[8]。

在对智能视觉监控领域的研究方面,国内起步比较晚,目前,中国科学院自动化研究所模式识别国家重点实验室在国内的研究机构中处于领先地位,取得了一系列研究成果。除此之外,国内还有一些高校也在这一领域投入了相当的研究精力,如上海交通大学、清华大学、华中科技大学、北京航空航天大学、北京理工大学等[3]。中国科学院自动化研究所模式识别国家重点实验室已经成立了智能视频监控研究小组,正在开展智能视频监控方面的研究,研究内容包括:快速准确的运动检测,实时性、鲁棒性的基于三维模型的车辆与行人的定位、识别和跟踪,基于移动摄像机的视觉监控技术,多摄像机的协作监控,事件的机器学习方法,异常现象的检测、报警与目标的行为预测,对目标运动情况给出语义上的解释的方法以及远距离的身份识别等等。目前视觉监控研究组针对目前交通管制中大量人力和物力资源的浪费,提出了一种基于三维模型的交通监控系统,采用了基于三维线框模型的车辆定位算法和基于改进的扩展卡尔曼滤波的车辆跟踪算法;研究组在自主研发的交通场景模拟平台上最终实现了交通监控原型系统等。

1.3 本文研究内容和章节安排

本文将监控视频作为研究对象,基于监控视频本身的特点,对监控视频摘要技术进行了研究。在门禁视频监控中,分析人进出门禁的情况,并进行统计某一时刻进出人员数量。

基于以上工作,将本文安排为四章,具体如下:

1.绪论

简单介绍视频监控系统的研究背景,意义以及视频监控系统的现状和发展趋势,总结前人的基础上,结合项目实际应用阐述本论文的主要工作。

2.视频监控中的关键技术

本章主要介绍了视频监控系统中应用到的一些关键技术,例如EmguCV图像处理、人头检测技术中的AdaBoost和SVM技术、C#编程其中的WPF编程技术、目标跟踪[9]-[10]等。

3.人头检测算法的实现

本章主要介绍了人头检测中所用到的两个算法,即基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法,以及如何生成特征数据和利用特征数据进行检测。

4.视频监控系统软件设计与实现

本章主要从系统的需求分析开始。分析系统的需求,提出需要的功能,然后进行概要设计,划分出功能模块,与各个功能模块之间的接口,从而进行系统各模块的详细设计,在进行类图的设计最终完成各个功能实现本系统的开发

5.实验结果对比分析

对系统中所使用的AdaBoost算法和SVM人头检测算法进行分析比较,得出各个算法的优势和劣势,从而为后期的系统优化做好准备。

第2章 视频监控系统中的关键技术

2.1 图像处理技术

图像处理(Image Processing),用计算机对图像进行分析,已达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

OpenCV[4]( Open Source Computer Vision Library)是一个基于(开源)发行的跨平台计算机视觉库,由一系列C函数和少年C++类构成,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

由于门禁视频监控系统在.NET平台下实现,不能直接运行C/C++类库,所以需要对OpenCV进行封装,所以在本论文中使用了EmguCV。

EmguCV是.NET平台下对OpenCV图像处理库的封装。也就是OpenCV的.NET版。它运行在.NET兼容的编程语言下调用OpenCV的函数,如C#等。

2.2 WPF

WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的永华界面框架,属于.NETFramework3.0的一部分。它提供了统一的编程模型(MVVM模型)、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

WPF具有强大的数据绑定功能,存储和访问数据由Microsoft SQL Server和ADO.NET之类的技术提供,涉及两个步骤:

  1. 将数据从托管对象复制到控件中,在控件上可以显示和编辑数据。

  2. 确保将使用控件对数据进行的更改复制回托管对象。

为了简化应用程序开发,WPF 提供了一个数据绑定引擎以自动执行这些步骤。数据绑定引擎的核心单元是Binding 类,它的任务是将控件(绑定目标)绑定到数据对象(绑定源),关系如图2-1所示:

WPF 主要编程模型是通过托管代码公开的。在 WPF 的早期设计阶段,曾有过大量关于如何界定系统的托管组件和非托管组件的争论。CLR 提供一系列的功能,可以令开发效率更高并且更加可靠(包括内存管理、错误处理和常规类型系统等),但这是需要付出代价的。图2-2说明了WPF 的主要组件.关系图的红色部分(PresentationFramework、PresentationCore 和 milcore)是 WPF 的主要代码部分。 在这些组件中,只有一个是非托管组件–milcore。

milcore是以非托管代码编写的,目的是实现与DirectX 的紧密集成。WPF 中的所有显示都是通过DirectX 引擎完成的,因此硬件和软件呈现都很高效,WPF 还要求对内存和执行进行精细控制,milcore 中的组合引擎受性能影响关系大,需要放弃 CLR 的许多优点来提高性能。

2.3 人头检测技术

人头检测,就是把视频监控图像中出现的人物的人头目标从视频中检测出来,目标提取,就是当人头检测算法检测到了视频里面有人头目标时,就把这个目标从视频中分割出来,为我们下一步进行目标统计提供数据支持。

基于人体检测的统计方法可以实现人与人间距较大,并且没有遮挡情况下的统计目的,但是在实际中,由于人员的无序性,以上的情况基本上不会出现,很难做到对每个人员的计数,所以就要减少由这些问题引起的误差,我们就需要选取合适的目标作为计数对象,而不论人员的多少,人的头都是不会被遮挡住的,所以人头作为我们的统计目标,能够最大化的降低误差。

人头检测时现在具有较高的理论研究课题,同样具有较高的实际应用价值,随着研究人员的不断研究,新的检测方法也在不断的出现。从总体来看主要还是分两大类,即基于知识的方法和基于统计学习的方法。

基于知识的学习放大的人头检测时通过一定的先验知识(如肤色、颜色、形状等)描述人头区域,并且根据这些规则去判断一个区域是否包含有人头区域。模板匹配则是典型的基于知识理论的检测方法,该方法通过利用模板对是否是人头区域进行描述,以及包括颜色、形状以及其他的组合。Viecente等人则是用形状作为模板[14],首先是假定人头全部是由俯视得到的图喜爱那个并且大致为圆形,然后把人头轮廓通过Hough变换以后再与标准圆形模板进行匹配,最后时限了人头检测和定位。而Jin等人则是采用边缘检测和椭圆形状匹配相结合,就是把人头作为类似椭圆的目标,首先要对视频中移动目标进行运动检测,提取运动物体边缘轮廓,并在轮廓图像上根据一定的宽高比进行椭圆匹配[11],获得人头区域。

当前,人头检测主要采用统计模式识别的方法,分别为基于统计的特征抽取和基于特征统计的分类。AdaBoost算法作为统计学习方法中的一种,由Freund等人与1996年提出,算法的最初是想是基于弱学习模型,该模型假设存在一种弱学习算法经过训练获得若干个弱分类器,通过对弱分类器进行组合可以获得任意高精度的分类器。AdaBoost训练需要事先确定待选特征库,训练过程就是从待选特征库中挑选最具备分类能力的特征。目前常用的特征提取方法主要有Haar特征,并结合积分图进行求取。支持向量机(Support Vector Machine,SVM)是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折中,以获取最好的推广能力。

具体实现过程请见下一章节。

2.4 门禁视频监控系统工作流程

门禁视频监控系统监控过程中,人头检测可以采用AdaBoost检测算法,也可采用SVM检测算法,虽然算法不同,但检测结果几乎接近。系统的工作包括以下几步:

1.预处理

主要包括视频图像的加载、解析。

2.加载样本数据

加载人头的样本数据,为检测做好准备

3.进行人头模板检测

与样本数据进行模板匹配,获取视频图像中的人头

4.人头校验

对检测到的人头进行校验,去除误检。

5.进行跟踪

对检测到的人头进行跟踪。

图2.3给出了门禁监控视频的大致流程

2.5 本章小结

门禁视频监控的实现是建立在许多技术基础之上,本章主要介绍一些关键技术,例如使用Emgucv/OpenCV图像处理库,可以更方便的进行图像处理;如何生成样本数据以及使用模板匹配进行人头检测,可以快速检测出人头;使用WPF进行界面设计使代码与界面分离,减少耦合度;使用面向对象的编程技术,可以快速开发、减轻开发人员的压力。WPF其实不仅仅是图形引擎而已,它将给Windows应用程序的开发带来一次革命,因为新的架构提供了一种全新的开发模式。对于开发人员而言,界面显示和代码将更好的得到分离,这与从前的桌面应用程序开发有很多不同(界面设置和代码是融合在一起的),这是比较具有革命性的改变之一。

第3章 人头检测算法实现

3.1 分类器设计原理

机器学习的目的是把数据转换成信息。在学习了一系列数据之后,我们需要机器能够回答和对这些数据进行分析,最终获取我们所需要的数据。及其学习会从很多样本数据中获取特征,并且作为数据库,根据分类规则对这些特征进行学习,而最后生成的模型就是我们所要获得分类器。

3.2 基于Haar特征点的AdaBoost人头检测算法

3.2.1 AdaBoost

AdaBoost是一种基于级联分类模型的分类器。级联分类模型可以用下图表示:

级联分类器:级联分类器就是将多个强分类器连接在一起进行操作。每一个强分类器都由若干个弱分类器加权组成。

3.2.2 算法描述

人头检测可视为一个两类分类问题,其中一类为人头(正样本),另一类为非人头(负样本),假设 AdaBoost 学习算法的输入为训练样本集

其中,xi表示第i个训练样本,yi表示样本类别,且yi属于(+1, -1),+1表示正样本,−1表示负样本。因此,对于每个样本,在训练过程中都事先知道其样本类型,以便对算法做出的预测正确与否进行判断。

在算法训练阶段,首先对每个样本赋予相同的初始权重W,之后进行K轮训练,并且在每轮训练结束后根据当前分类结果调整训练样本的权重,减小正确分类样本的权重,同时增加错误分类样本的权重,从而使每个弱分类器主要围绕难以正确分类的样本进行学习。经过K 轮训练得到一个由K 个弱分类器(每个弱分类器对应一个特征)组成的弱分类器序列

其中,hi表示第i个弱分类器,ai为弱分类器的加权系数。最后对K个弱分类器进行组合,得到最终的强分类器H。虽然每个弱分类器hi的分类预测能力只比随机稍好,但通过对K个弱分类器进行组合,能够使强分类器H获得任意高的精度。

AdaBoost 算法流程如图3-2所示。算法主要由离线训练和在线检测两部分组成,在训练阶段首先对正负样本进行训练,从特征库中选取最优特征并组合成强分类器,在检测阶段,用训练好的分类器对各个待检测窗口进行检测。

3.3 基于Hog特征点的SVM人头检测算法

3.3.1 SVM

支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类间隔最大实际上就是使得推广性中的置信范围最小。推广到高维空间,最优分类线就成为最优分类面。

支持向量机是利用分类间隔的思想进行训练的,它依赖于对数据的预处理,即,在更高维的空间表达原始模式。通过适当的到一个足够高维的非线性映射,分别属于两类的原始数据就能够被一个超平面来分隔。如下图3-3所示:

空心点和实心点分别代表两个不同的类,H为将两类没有错误的区分开的分类面,同时,它也是一个最优的分类面。原因正如前面所述,当以H为分类面时,分类间隔最大,误差最小。而这里的H1·H2之间的距离margin就是两类之间的分类间隔。支持向量机将数据从原始空间映射到高维空间的目的就是找到一个最优的分类面从而使得分类间隔margin最大。而那些定义最优分类超平面的训练样本,也就是上图中过H1·H2的空心点和实心点,就是支持向量机理论中所说的支持向量。显然,所谓支持向量其实就是最难被分类的那些向量,然而,从另一个角度来看,它们同时也是对求解分类任务最有价值的模式。

支持向量机的基本思想可以概括为:首先通过非线性变换将输入空间变换到一个高维空间,然后在这个新空间中求取最优线性分类面,而这种非线性变换是通过定义适当的内积函数来实现的。支持向量机求得的分类函数形式上类似于一个神经网络,其输出是若干中间层节点的线性组合,而每一个中间层节点对应于输入样本与一个支持向量的内积,因此也被叫做支持向量网络。如图3-4所示:

由于最终的判别函数中实际只包含于支持向量的内积和求和,因此判别分类的计算复杂度取决于支持向量的个数。

不难发现,支持向量机作为统计学习理论中的经典代表使用了与传统方法完全不同的思路,即不是像传统方法那样首先试图将原输入空间降维(即特征选择和特征变换),而是设法将输入空间升维,以求在高维空间中问题变得线性可分或接近线性可分。因为升维知识改变了内积运算,并没有使得算法的复杂性随着维数的增加而增加,而且在高维空间中的推广能力并不受到维数的影响。

3.3.2 算法描述

假设训练样本集为其中xi表示第i个样本,n为样本数,yi属于(-1, +1)为类别标志。对线性和非线性的情况如下:

1.线性SVM

如存在分类超平面方程:

满足

则认为训练样本集是可分的。其中,<W·Xi>为向量W与Xi的内积。

SVM 算法就是在这种线性可分情况下寻找最优分类面。如果一个分类面不但能将两类样本无错误地分开,并且到两类中离该分类面最近样本点的距离最大,则这个分类面就是最优分类面,如图
3-5 所示。

从以上分析可知,线性判别函数的一般形式为g(X)=W·X+b,若W为权重向量,且假设最小函数间隔为1,即在正样本点X+和负样本点X-上使函数间隔为1,即对于离分类面最近且平行于最优分类面上的样本点满足:

则分类间隔为:

其中,为向量的几何范式。这样,在两类中所有样本都满足,则最优分类超平面满足:

而求解最优分类超平面需要最大化分类间隔2/||W||2,则问题转化为:

但是,当两类分类数据不能完全线性分开时,最大间隔将是负数。因此需要对式3-7的约束条件进行调整:

其中,C为惩罚系数,C越大表示对错误分类的惩罚越大。根据拉格朗日乘子算法,有:

其中,ai>=0、Bi>=0为拉格朗日乘子。

对W,ξ ,b求偏导,并置0,有:

将式3-10带入式3-9中,得到:

式中,0<=ai<=C对应标准支持向量(Normal Support Vector,NSV),ai=C对应边界支持向量。由Kaeush-Kuhn-Tucker条件,在最优点,有:

结合式(9)-(11)可计算出阀值参数b为

假设共存在Nnsv个标准支持向量,则为了提高计算的准确性,对每个标准支持向量分别计算b,并取均值,从而得到最终阀值b为:

2.非线性SVM

非线性 SVM 与线性 SVM 的区别在于,非线性 SVM 是通过一个非线性函数将样本X映射到一个高维线性特征空间,并在这个空间中构造最优分类超平面,并得到分类器。因此在该情况下,分类超平面为

判别函数为:

最优分类超平面问题描述为

得到的对偶最优化问题为:

其中,K(Xi, Xj)为核函数,判别式为

其中,阀值为

3.4 视频图像及样本采集及训练流程

1.样本采集

进行人头训练与检测需要大量的视频序列和训练样本。本文视频序列部分源自实际监控录像,部分采用Kinect拍摄,人头样本由手工截取,选择不同背景下的不同行人,并截取2000余张,人头样本一千余张,负样本为不包含人头的背景图片随机产生。为了方便训练,所有样本均归一化到相同尺度,本文为20x24像素大小。人头正、负样本示例如图3-6和图3-7所示。


2.训练流程

本论文训练人头的流程如下:

  1. 准备训练样本集合;包括正样本集和负样本集;根据机器学习的基础知识我们知道,要利用机器学习算法进行样本训练,从而得到一个性能优良的分类器,训练样本应该是无限多的,而且训练样本应该覆盖实际应用过程中可能发生的各种情况。实际应用过程中,训练样本不可能无限多,本次使用了一千个正样本,一千个负样本
  2. 收集到足够的训练样本之后,需要手动裁剪样本。本人使用的方法为利用收集到门禁视频行人进出大门的的视频作为训练样本集合,写个了简单程序,只需要鼠标框选一下,就将框选区域保存下来。
  3. 裁剪得到训练样本之后,将所有正样本放在一个文件夹中;将所有负样本放在另一个文件夹中;并将所有训练样本缩放到同样的尺寸大小。OpenCV自带的例子在训练时,就是将样本缩放为64*128进行训练的;
  4. 提取所有正样本的Hog特征;
  5. (提取所有负样本的Hog特征;
  6. 对所有正负样本赋予样本标签;例如,所有正样本标记为1,所有负样本标记为0;
  7. 将正负样本的Hog特征,正负样本的标签,都输入到SVM中进行训练;采用线性SVM进行训练。
  8. SVM训练之后,将结果保存为文本文件。这样就可以利用训练样本训练出来的分类器进行人头检测了。

其中在AdaBoost特征选取上,考虑到人头普遍位于样本的中心位置,因此特征在样本中的位置进行一定的限制,使特征的各个子窗口不落在样本的四个角上,如图3-8所示,在生成特征库时,限制矩阵梯度和自生长梯度特征各特征子窗口全部位于图中的椭圆内,采用该方法一面可以尽可能减少背景梯度对特征形成的干扰,另一方面可以减少特征库的规模,提高训练速度。

由于SVM算法是针对有限样本进行训练,参与训练的样本数不亦过大,否则会使训练变慢甚至无法完成。因此,本文在AdaBoost人头样本中随机挑选了四分之一,作为SVM训练的正样本,负样本由背景图随机产生,进行聚类。

第4章 视频监控系统设计与实现

4.1 视频监控系统的需求分析

门禁软件已经广泛使用在企事业单位、工厂、公司等办公场所,职员,工人佩带名牌进入办公地点,通过名牌对出入口通道进行管制的功能对单位的组织纪律,以及安防都非常有帮助。

目前很多的门禁软件会加上对出入口通道视频监控来进一步进行监控,来对出入口通道进行更好的监控,传统的门禁系统一般是无法实现门禁和视频在软件层面联动的,只能通过简单的硬件连接看到现场的实时监控录像,而视频门禁系统则可以在人员进出门禁时,联动视频监控系统对现场的照片和录像进行抓拍进行人头检测并保存在门禁服务器中,同时还可以及时在软件界面上弹出对应的现场监控画面。这样不仅让照片、录像和对应的门点事件绑定在一起,可以随时通过查询将现场情况进行再现,还可以确保系统内的警情得到及时确认和处理。

4.1.1 系统目标

系统开发的主要目标是能够针对上述问题,利用图像处理,目标检测与跟踪,相机标定,透视投影变换等理论知识,设计出对视频图像进行处理的算法,来达到对视频中人员人头的检测并进行统计图片保存,同时兼顾先进性、可靠性、安全性、经济型、可扩充性、可维护性和规范性做到一切应从实际出发,使监控系统具有较高的实用效能。本系统操作简单便捷,监控人员不需要经过严格复杂的培训技能即可上手使用。

4.1.2 功能需求

为了使用者能够方便使用此系统,系统功能还将包括辅助系统和效果显示系统。系统用例图如图4-1所示。

辅助系统主要包括选择视频源,启用/禁用视频检测,视频检测算法,显示视频图像。用例图如图4-2所示。

在显示系统中,主要是显示未开启检测的视频图像和开启视频的视频图像,以及保存图像。图4-3显示了系统的基本用例。

4.1.3 功能分配

根据功能需求部分所描述出的系统用例图,画出该系统主要功能,如下表3-1所示。

模块 详细功能
辅助系统模块 辅助模块主要处理人头检测之前的操作。例如选择视频源,开启视频检测,添加/删除视频源等功能
人头检测模块 通过AdaBoost算法或者SVM算法,进行人头检测,将检测到的数据再次进行分析,筛选符合的人头
显示模块 将检测到符合的人头在图像上进行显示,提供保存图像等操作

4.1.4 性能需求

1.精度

在显示检测图像中,人头检测错误率不超过2个。

2.时间

本门禁视频监控系统视频延迟时间在2秒内。

3.系统灵活性

本系统具有可扩充性,可维护性和规范性。

4.2 系统开发环境介绍

1.硬件环境

本系统对计算机硬件要求不高,处理器基于X86或X64指令集均可,摄像头最低可为低解330线,拍摄画面清晰,没有用肉眼不可分辨的事物。

2.软件平台

此系统主要运行在Windows操作系统下,推荐Windows XP及其以上版本。因为Windows XP系统兼容性,对新技术。新产品都有良好支持,是设计开发人员常用的操作系统。另外,Windows XP系统集成了微软的防火墙技术,保障了用户计算机使用安全。

3.开发环境

Windows平台下选择Microsoft Visual Studio 2013开发工具,它是目前最流行windows平台应用程序开发环境[2]。Visual Studio 2013是一个基本完善的开发工具集它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight及Windows Phone。

Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。Visual studio 2013具有功能全面,灵活性好,效率高,深入底层的优点。另外,VisualStudio 2013具有MFCAppWizard/Class Wizard等功能强大的编程向导工具,在很大程度上简化了应用程序的开发,也提高了编程效率。VisualStudio 2013自然是本项目开发的首选。

4.3 系统概要设计

4.3.1 总体设计

系统大体分为3个模块,包括辅助模块、人头检测模块和显示视频图像模块,如图4-4所示

4.3.2 辅助模块设计

辅助系统模块其结果如图4-5所示:

主要完成任务有:

  1. 选择人头检测算法:在 WPF中下拉框中选取一种作为接下来的视频图像检测算法。可以选择的检测算法有:SVM 人头检测算法和AdaBoost检测算法。如果不选择,默认为AdaBoost检测算法
  2. 选择视频播放源:在WPF中的TreeView控件中对视频进行选择,左键选中视频名称前的复选框,则会获取在后台数据库中存放的对应视频名的视频路径,从而打开该视频,并在视频信息显示框中显示视频名称以及视频路径。
  3. 视频源的添加和删除:在WPF中TreeView控件中进行右键操作,会出现添加视频源和删除视频源的功能,在添加视频源功能中,使用者只需添加视频所位于的根节点以及视频名、视频路径即可。在删除视频源的功能中,使用者只需选择视频位于的根节点以及视频名即可。

4.3.3 人头检测模块

系统核心的匹配人头检测模板结构如图4-6所示

此模块主要完成任务有:

  1. AdaBoost人头检测:加载人头信息的样本库,将图像进行均衡化,然后进行人头模板匹配。得到匹配后的人头位置。
  2. SVM人头检测:加载人头矩阵的信息样本,进行人头模板检测,得到匹配的人头位置。

4.3.4 显示模块

显示模板主要是(1)开启视频检测后显示人头检测后的视频图像,(2)未开启视频检测后视频图像。其主要结构如图4-7所示

该模块只要实现图像的显示和保存操作。显示图像直接利用EmguCV中的ImageBox控件来实现,保存图像默认保存格式为png,用户只需要在C:data\pic下找到对应的图像文件即可,操作简单容易上手。

4.3.5 接口设计

1.外部接口设计

系统外部接口主要实现系统输入射出设备,例如鼠标,键盘事件的响应。系统利用WPF(Windows Presentation Foundation),设计相应对待鼠标、键盘监听响应程序。

2.内部接口设计

内部接口设计主要实现各个子系统之间的数据流的处理

系统首先由用户在辅助系统选择待播放视频和人头检测算法开始,根据显示的已选择视频文件的视频路径,进行播放视频,如果使用者开始视频检测算法,辅助模块会将选择的视频检测算法传递到检测模块,在这里,所有的视频了图像将获得该算法下最大程度的人头检测。待人头检测完成后,人头检测模块会将检测好的视频图像传递给显示模块显示图像和检测信息以及提示保存图片信息。其数据流向如图4-8所示。

4.3.6 维护设计

系统各模块相互独立,减轻了许多维护升级上的麻烦,只需要在制定模块中作出改动,而不会影响其他模块的正常使用。

4.4 系统详细设计

4.4.1 辅助功能模块详细设计

辅助功能模块主要操作是选择待播放视频,添加视频,删除视频以及选择人头检测算法。

添加播放视频功能中,视频格式为“AVI”或者“WMV”视频文件。主要方法及功能如表4-2所示:

方法名 功能
void menuSelectAllChild_Click(object sender, RoutedEventArgs e) 选中所有子项菜单事件
void menuExpandAll_Click(object sender, RoutedEventArgs e) 全部展开菜单事件
void menuUnExpandAll_Click(object sender, RoutedEventArgs e) 全部折叠菜单事件
void menuSelectAll_Click(object sender, RoutedEventArgs e) 全部选中事件
void menuUnSelectAll_Click(object sender, RoutedEventArgs e) 全部取消选中
void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 鼠标右键事件
void TreeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 鼠标左键事件
int ChildrenSelectNum(MonitorCameraTreeModel model) 获取子项选中的数量
void menuAddItem_Click(object sender, RoutedEventArgs e) 点击添加视频文件
void menuRemoveItem_Click(object sender, RoutedEventArgs e) 点击删除视频文件

4.4.2 人头检测模块详细设计

AdaBoost模板检测主要利用人头样本进行检测,SVM模板检测主要利用人头样本矩阵数据进行人头检测。其主要方法和功能如下表4-3所示:

方法 功能
MDeteInfo GetAdaBoostHead(Image\<Bgr, Byte\> image) 进行AdaBoost算法人头检测
float[] GetData() 获取样本数据
MDeteInfo GetSVMHead(Image\<Bgr, Byte\> image) 进行SVM算法人头检测
bool StroageImage(Image\<Bgr,Byte\> image) 保存图片

4.4.3 各部分类图

1.程序基于面向对象实现设计,其类图为:

详细描述如下:

方法名 功能
void PlayVideoInvoke (MonitorCameraTreeModel model) 播放视频委托
dTimer_Tick(object sender, EventArgs e) 定时器委托
void CloseVideoInvoke(MonitorCameraTreeModel model) 关闭视频委托
void PlayVideo(MonitorCameraTreeModel model) 播放视频
void DisplayPic(string picPath) 显示图片
void CloseVideo(Video _video) 关闭视频
Window_Loaded(object sender, RoutedEventArgs e) 加载窗体时激发
InitImageBox() 初始化ImageBox
void InitBackgroundworker() 初始化backgroundworker
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 报告进度
backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 操作完成、取消、异常时执行的操作
backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 调用RunWorkerAsync时发生
TvTestDataBind() 数据绑定
Window_Closed(object sender, EventArgs e) 窗口关闭
void OpenCheckedClick(object sender, RoutedEventArgs e) 点击开启检测
DisplayMessage(string message) 显示操作消息
void ShowDeteInfo(string info) 检测信息显示

2.显示结果类图

3.进行人头检测类图

4.5 系统实现

4.5.1 辅助功能模块实现

辅助功能模块包括视频源的加载,选择视频后播放视频、视频添加/删除的功能, 在视频播放功能上,首先需要从视频数据源中获取,本系统中,使用xml文件来存储视频源数据,使用XmlDocument类即可实现对Xml数据的访问以及添加数据删除数据等等功能。其部分代码如下:

1.遍历xml节点

  1. // 将节点转换为元素,便于得到节点的属性值
  2. XmlElement xe = (XmlElement)xnl;
  3. // 得到Book节点的所有子节点
  4. XmlNodeList xnl0 = xe.ChildNodes;
  5. camerModel.Name = xnl0.Item(0).InnerText;
  6. camerModel.IsChecked = Convert.ToBoolean(xnl0.Item(2).InnerText);
  7. camerModel.IsExpanded = Convert.ToBoolean(xnl0.Item(3).InnerText);

2.添加一个视频(节点)

  1. // 建立一个节点
  2. XmlElement newTreeModel = doc.CreateElement("children");
  3. XmlElement chilId = doc.CreateElement("childId");
  4. chilId.InnerText = model.ChildId;
  5. XmlElement name = doc.CreateElement("childName");
  6. name.InnerText = model.ChildName;
  7. XmlElement videoPath = doc.CreateElement("videopath");
  8. videoPath.InnerText = model.Videopath;
  9. newTreeModel.AppendChild(chilId);
  10. newTreeModel.AppendChild(name);
  11. newTreeModel.AppendChild(videoPath);
  12. xnFnodel.AppendChild(newTreeModel);

3.删除视频(删除节点)

  1. foreach (var xmlNode in xmlNodeList)
  2. {
  3. XmlElement xe1 = (XmlElement)xmlNode;
  4. XmlNodeList xnl3 = xe1.ChildNodes;
  5. if (xnl3.Item(1).InnerText == model.ChildName)
  6. {
  7. xe1.ParentNode.RemoveChild(xe1);
  8. }
  9. }

4.5.2 人头检测实现

在人头功能检测中,我们需要加载人头数据,而人头数据则是利用上面提及的AdaBoost算法和SVM级联器生成的人头样本数据,在这里我们需要加载这些人头样本数据。首先需要加载人头数据:

1.AdaBoost样本数据加载

在C盘data文件夹下的cascades包含了人头样本数据,使用har分类器加载数据,其代码如下:

  1. HaarCascade cascade = newHaarCascade(@"C:\data\cascades.xml");

2.SVM样本数据加载

同样,在C盘data目录文件夹下有个HogDetector.txt,里面包含目标检测的图像特征-HOG特征,使用HOGDescriptor提取特征并进行训练,其代码如下:

  1. if (hog == null)
  2. {
  3. Size winSize = new Size(64,64);
  4. Size blockSize = new Size(16, 16);
  5. Size blockStride = new Size(8, 8);
  6. Size winStride = new Size(8, 8);
  7. Size cellSize = new Size(8, 8);
  8. int nbins = 9;
  9. hog = new HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins, 1, 1, 0.2, true);
  10. float[] data = GetData();
  11. hog.SetSVMDetector(data);
  12. }

而GetData()方法实现则为加载人头样本数据,因为SVM级联生成的为txt数据,所以需要进行文件读取,C#可以利用StreamReader类进行文本的访问,使用该类中的EndOfStream属性判断是否读取结束,这样就可以访问txt数据了。获取数据代码如下:

  1. var line = reader.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  2. var arr = new float[line.Length];
  3. for (var i = 0; i < line.Length; i++)
  4. {
  5. arr[i] = (float)Convert.ToDouble(line[i]); //将数据转换为float类型
  6. data.Add(arr[i]);
  7. }

人头检测的实现由两种方式:

(1) 使用AdaBoost算法进行人头检测

在加载完AdaBoost所需的样本数据后,将图像进行灰度化和均衡化,并利用EmguCV中的DetectHaarCascade方法进行目标检测,其主要代码如下:

  1. double scale = 1.3;
  2. Image<Bgr, Byte> smallframe = image.Resize(1 / scale, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); //重新设置图片大小
  3. Image<Gray, Byte> gray = smallframe.Convert<Gray, Byte>(); //获取灰度图像
  4. gray._EqualizeHist(); //均衡化
  5. // 开始进行检测
  6. MCvAvgComp[][] faceDetected = gray.DetectHaarCascade(
  7. cascade,
  8. 1.1,
  9. 2,
  10. Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
  11. new Size(30, 30));
  12. int count = 0;
  13. // 检测到的目标显示到图像上
  14. foreach (var item in faceDetected[0])
  15. {
  16. count++;
  17. image.Draw(item.rect, new Bgr(Color.Red), 3);
  18. }
  19. model.Frame = image;
  20. model.HeadCount = count;

(2) 使用SVM算法进行人头检测。

利用前面获取的样本数据,利用EmguCV中HOGDescriptor对象进行目标检测。其主要过程为(1)提取Hog特征,(2)调用其DetectMultiScale方法获取检测目标,其主要代码如下:

  1. Rectangle roiRect = new Rectangle(144, 206, 406, 360);
  2. Rectangle[] rectangle = Hog.DetectMultiScale(image);
  3. if (rectangle.Length > 0)
  4. {
  5. Rectangle temp = new Rectangle();
  6. bool pushFlag;
  7. foreach (var item in rectangle)
  8. {
  9. image.Draw(item, new Bgr(Color.Red), 3);
  10. }
  11. }

4.6 系统效果演示

系统主窗体如图4-15所示:

系统未开启视频检测时运行界面如图4-16所示:

系统开启AdaBoost检测算法如图4-17所示:

系统开启SVM检测算法如图4-18所示:

系统添加视频源如图4-19所示:

系统删除视频源如图4-20所示:

4.7 本章小结

本章从系统整体需求出发,得出系统所需的功能,进而设计出各个模块,然后再是各个类来实现各个模块,以及各个类模块的主要实现代码最终实现了满足需求门禁视频监控系统。在进行人头检测中,分别采用了AdaBoost人头检测算法和SVM人头检测算法,并对两个算法进行了比较,在下章会详细介绍两个算法之间的区别。在本章第6小结,还进行了系统效果演示,对门禁视频监控系统了更加深刻的认识。

第5章 实验结果对比分析

5.1 AdaBoost和SVM算法效果对比

采用AdaBoost检测算法,针对第一组测试视频时,其测试结果如图5-1所示,采用SVM检测算法,针对第一组图像,其检测结果如图5-2所示,两幅图片一对比,可以很明显的看出,在监控图像不是很清晰时,由于周边环境不是很明亮时,AdaBoost检测算法存在很大的错误检测。使用SVM检测能够准确检测出人头。但在光线明亮的环境中,如图5-3所示,在光线明亮下AdaBoost检测结果,图5-4在光线明亮下SVM检测结果,很显然AdaBoost也存在很大的错误检测,而SVM虽然检测出了人头,但是也出现了检测数量不对,存在少检测情况。

AdaBoost检测结果 SVM检测结果
AdaBoost检测结果 SVM检测结果

通过上面几幅图片可以看出,AdaBoost算法的检测正确结果没有SVM算法检测正确结果高原因在于:

  • 虽然本次使用了2000余张样本图像,但还是样本图像过少,使得建立出的样本数据过少,在后面进行特征提取时,不能全面获取所有数据,导致检测结果不准确,从而影响检测质量
  • 本次选取的特征样本正样本和负样本数量几乎一样多,导致加大了被误判样本的权值,在训练过程中,每次迭代都会对那些分类错误的样本进行加权,但多个这样的样本多次分类错误过后,他们的权重过大,进行左右误差的计算和分类器的挑选,使分类器的精度下降,出现典型的“退化问题”[12]。

5.2 结论分析

本系统采用了AdaBoost人头检测算法和SVM人头检测算法,显然基于SVM算法的人头检测比简单的AdaBoost人头检测算法精度要高,SVM算法略占优势。虽然在AdaBoost检测算法上出现很多不足,但为后期的算法优化作出铺垫。

总 结

论文是在分析了人头检测算法的基础上完成的,主要任务是利用监控摄像头获取监控视频,然后利用图像处理的相关算法,特别事人头检测算法的是实现,以及利用检测算法完成人头目标检测。通过阅读大量文献,研究与实验,选择了基于Haar特征点的AdaBoost算法和基于Hog特征点的SVM算法来实现人头的检测,同时对AdaBoost算法和SVM算法作了对比,具体有:

  • 论文详细论述了基于统计学的图像处理技术,尤其是基于Haar特征点的AdaBoost和基于Hog特征点的SVM算法的原理和实现。从理论上说明了AdaBoost和SVM人头检测算法的可行性和正确性,并在系统实现了部分,利用C#和EmguCV对着两种算法进行了实现。但根据随后的结果分析,可以看出SVM算法的精度是基本令人满意的,SVM人头检测算法比AdaBoost人头检测算法更加出色。
  • 采用模块化对系统进行设计,使得实现和维护变得更加轻松。另外,采用面向对象的实现方式,把数据和方法实现分离开来,是程序封装更加彻底,减少了开发中不必要的麻烦。
  • 增加了不同算法之间的对比。使得可以更加清晰明了地看出各个算法之间的差异以及优缺点。从不同算法的人头检测效果中也可以看出自己对此程序将来升级维护的方向。

但是,这里仍然有许多需要完善和解决的问题:

  • 检测结果精确度问题,不管是AdaBoost人头检测还是SVM人头检测,图像中的人头检测结果都存在漏检,需要对特征点数据加强筛选。
  • 使用GPU加速提高算法效率:采用SVM检测算法时,算法占用大量CPU和内存,需要进行更精确的优化。
  • 界面的优化,界面仍存在许多很多需要优化的地方
  • 结合门禁卡,实现人员进出门禁时,自动比较刷卡次数与出入人员数量是否一致,是否有人员未刷卡,并及时作出相应的判断。
  • 系统在安全性方面还需要进一步的加强。为用户提供可靠的保障

参考文献

[1] 陈东伟,韩娜.嵌入式数据库在基于多核处理器的视频监控中的应用〔J〕.郑州大学2007(4):52-55.

[2] 杨富国.Visua1C++程序开发案例解析[M].北京:清华大学出版社;北京交通大学出版社2006.

[3] 王华. 智能视频监控系统设计与实现. 山东大学2013

[4] 刘瑞祯.OpenCV教程基础篇[M].北京:北京航空航天大学出版社 2007

[5] http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html?highlight=matchtemplate

[6] 黄佳.基于OPENCV的计算机视觉技术研究.上海.华中理工大学

[7] HatemH, Beiji Z, Majeed R, et al. Head Pose Estimation Based On Detecting FacialFeatures[J]. 2015.

[8] HaritaogluI,Harwood D,Davis L. UW4: real-time surveillance of people and theiractivities[J]H. IEEE Trans PaRem Analysis and Machine Intlligence,2000,22(8):809—830

[9] 郑金荣.视频监控系统中运动目标跟踪算法的研究[D].硕士学位论文,江南大学,2009

[10] 徐振兴.基于机器视觉的行人检测和跟踪技术研宄[D].硕士学位论文,浙江理工大学,2012

[11] 牛胜石. 基于AdaBoost 和 SVM 的人头检测[D].硕士学位论文,中南民族大学,2010

[12] 廖红文,周德龙.AdaBoost及其改进算法综述[J].浙江工业大学.2012(21)

[13] https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx

[14] 胡铮.面向视频监控的目标检测和跟踪技术.[D].浙江大学.2011:10~12

致 谢

光阴似箭,四年的本科生学习生活很快就要结束了。在西南科技大学的这四年里,我周围发生了很大的变化,最重要的是我四年前制定的目标实现了,四年让我收获颇丰。

本论文的工作是在我的导师的悉心指导下完成的。在本课题的研究以及论文的撰写的过程中,老师给与我精心的指导;在生活中,老师也给与我了无微不至的关怀。正是这些指导和关怀使得我在本科生的学习期间取得了很大的进步。老师严谨的治学态度、科学的工作方法以及朴实的生活作风对我有着深远的影响。在此,向老师表达衷心的谢意。

前几届的师兄对于我的工作学习以及论文都提出了许多宝贵的意见,对于论文的内容以及存在的问题提供了许多指导以及帮助。同时感谢所有在我学习期间教导过我的老师,谢谢你们在我求学的过程中给与的关怀和帮助,你们的一言一行都将成为我人生未来的宝贵财富。

在课题研究以及论文的撰写过程中,许多同学对我论文中的研究工作也提供了热情的帮助,在此向他们也表达我的感激之情。最后特别感谢我的父母,他们一直在我的身边默默地鼓励、关心、支持我,是他们的理解和支持使能够专注于研究和学习,顺利完成我的学业。

上传的附件 cloud_download 毕业设计文档和程序.7z ( 4.11mb, 33次下载 )
error_outline 下载需要13点积分

keyboard_arrow_left上一篇 : 基于JSP实现的试题库管理系统 基于JAVA的聊天室系统 : 下一篇keyboard_arrow_right



Daisy
2018-09-28 22:37:39
基于WPF的视频监控系统,采用C#与EmguCV的技术,实现对人员出入门禁系统时进行人头检测。主要分析了两种算法的特征值的提取方法以及利用这两种算法进行人头检测,设计出一个可以检测人头的门禁监控视频

发送私信

离开的不会再回来,回来的不再完美

12
文章数
15
评论数
eject