人体行为检测与识别
摘要
人体行为检测与识别是当前研究的重点,具有很高的研究价值和广阔的应用前景。主要应用在型人机交互、运动分析、智能监控和虚拟现实也称灵境技术(VR)领域,对于研究人体检测和识别有着重要的意义。因为人的运动的复杂性和对外部环境的多变性,使得人们行为识别和检测具有一些挑战。对人类行为和检测的研究目前处于初级阶段,有待进一步研究和开发。
本文基于matlab人体行为识别和检测的研究,本文主要研究的是从图像中判断出目标处于何种行为,例如常见的走、坐、躺、跑、跳等行为的识别。从现有的很多主流研究成果来看,最常见的行为识别系统结构包括几个模块:目标检测、目标跟踪、行为识别。本文首先对图像进行判断是否有人体目标,识别出人体后对图像进行灰度化,在对灰度图像用背景差法与背景图像比对,最后,比对提取出的人体来判断人体处于何种行为。
关键词:matlab,肤色识别,行为检测
随着社会的发展,人民生活的提高,人们越来越关注安全问题,对视频监控系统的需求也爆发式扩张,如停车场,超市,银行,工厂,矿山等安全有监控设备,但监控系统不会主动实时监控。因为它们通常在相机发生后的异常,但只有在记录进行了观察和分析,以捕获存储的视频图像结果,然后知事实发生。因此迫切需要一种监视系统,它能够在24小时的连续实时监测,并且相机自动分析人类行为识别的有效的分析所捕获的图像数据。此外,当发生异常时,系统能够守护人员准确及时报警,从而避免犯罪和其他异常情况的发生。随着监控系统到位,以帮助人们甚至完成监控任务。可以减少人力和财力的投入,由于就业监视人员进行。另外,如果长时间不运动图像信息记录,保存几下,就失去了意义和视频监控系统的存储资源浪费存储空间。因此,传统的监视系统浪费了大量的人力,并有可能引起报警,性能差的实时监控的泄漏。监控等实时行为分析系统来识别人体,不仅可以替代监控人员的工作的一部分,提高监测系统的自动化水平,同时也提高监视存储的效率,还有一个广泛的应用,并在视频监视系统的潜在经济价值之前。由于人的行为具有自由的伟大程度,因为身体宽松长裙不同程度和它的外貌和从图像捕获设备位置不同距离的表现风格将是一个很大的分歧,这是人的行为分析,找出了一定的难度。但是,人类行为的实时分析,智能监控系统,以确定关键技术及其广阔的前景药,安全性,虚拟现实,军事和潜在的经济价值,国内外研究机构和学者越来越多的关注,并在许多全球领先的刊物和会议专题讨论。美国和欧洲都进行了一些相关的研究项目。 VSAM主要项目,如美国国防部高级研究计划局,成立于1997年(视觉监视和监测),主要是在视频为主的视频场景理解技术的战场和民用研究;IBM和微软等公司越来越多地将基于视觉的手势识别技术集成到其业务。 W4的实时可视化监控系统已经能够实现定位以及人体运动和跟踪能力的人的分割,并能检测一个人是否携带物体的简单动作等等;重大项目导师制欧盟委员会Framework5计划成立于1999年,主要是对人的行为和人机交互的研究,以开发用于公共安全,安全管理系统的工具; DARPA在2000年和资助长期的人类行为识别(识别人类在距离)项目,主要用于国防研究预防恐怖袭击和民间的多模态监测技术;雷丁大学,英国已经推出了理性的项目(稳健的方法进行监测和了解的人在公共场所),ETISE(视频场景理解评估),ISCAPS(拥挤区域治安综合监控),人类的主要研究行为在视觉图像识别和场景的理解;此外还有Pfinder(人发现者)系统,该系统可以执行人民和谅解的行为,以及项目AVITRACK(飞机周围,归类车辆和个人跟踪围裙的活动模型解释和检查)实时跟踪,是共同资助欧盟和奥地利的研究,该项目的重点是视频监控技术的研究。国内机构这方面的研究也有自动化研究所模式识别,微软亚洲研究院,感知,北京大学国家实验室,大学这方面的研究国家实验室有清华大学,浙江大学。虽然起步相对较晚的时间,而且还对关键技术进行深入研究人的视觉分析。人类的行为识别主要用于运动图像序列中含有人体的分析和处理,往往涉及的检测和清除运动目标检测,运动物体的阴影,特征提取和的四个过程识别人的行为的描述和分析的运动。在这里,我们从人的行为识别技术的研究现状,以及人的行为识别技术的热点和难点,讨论四个方面阐述。
人体行为检测与识别技术除了在智能监控系统中具有有广泛的应用前景和潜力,在计算机视觉中是一个极具有吸引力及挑战性的问题。人体运动的视觉分析是一个新兴前沿的研究领域,涉及模式识别,图像处理,计算机视觉,人工智能等多门学科。它可以广泛应用于许多领域,如:运动捕捉,人机交互,监控和安全,环境控制和监测,体育及娱乐分析等,特别是在视频监控方面可广泛应用于银行、邮电、教育、交通、公安、监狱、法庭、大型公共设施、公共场所(银行、医院、停车场、商店、等公共场所甚至家庭庭院内)、大型仓库及军事基地等场所,在国防与公共安全领域起着日益重要的作用。综上所述,因此,人体动作的视觉分析具有极大的商业价值与现实意义。
本文主要对人体行为检测和识别方法进行研究,主要研究内容如下:
(1)判断是否为人体
在目标提取之前,首先要对输入的图片进行检测。本文通过肤色检测判断目标是否为人体。
(2)人体目标提取
如果是人体导入背景图片与背景图片做差,再通过背景差阈值分割法进行提取。
(4)行为识别
在解决了以上的问题之后,接下来就是要选择一种合适的算法来进行人体姿态识别,这也是本文研究的重点和难点。本文采用一种人体目标的连通区域的长宽比例来对人体行为进行识别。
第2章 基于人脸检测的人体识别
人脸是一个很常见的,非常复杂的区域具有很强的代表性,是人体生物特征最直接的表现,并与其他人的特点相比中包含的脸部的其他生物信息有以下几个特点:
(1)是最丰富的面部特征。
(2)应用非常方便,无需使用其他辅助设备。
(3)人脸特征是最熟悉的人性化特点,很容易被别人接受;
(4)人脸包含特征信息可直接用于使用,它不易被仿冒;
在人类的知识里面,人们对人的理解是最丰富的,人脸的结构非常清晰,从脸部和五官的位置之间的关系非常了解对方,人类已经没有什么困难判断一个给定的通过人脸检测或识别个人身份的图像是否具有正面是真的很难。另外,通过观察一个面的外部特征,它可以在很大程度上决定一个人的性别,表情,种族,身份和性格等直到与心理因素的某些内容。但是,自动检测与识别的脸是一个具有挑战性的经典研究,特别是要建立一个实用的系统,可全自动面部识别是非常困难的。主要的困难主要有以下几个方面:
(1)面部器官,形状,尺寸,颜色,质地和千变万化的面部表情,是很复杂的,很难形容一个统一的模式;
(2)人脸表面经常有一些配套的异物,如眼镜,胡须,耳环等;
(3)的复合物的实际应用中,如复杂的背景,光强,脸姿势如此不确定。
。
颜色空间颜色空间是定义、创建和观察颜色的方法。另外还有一些针对某些类型的图像应用通过统计或物理分析,由RGB线性或非线性导出的颜色空间,静态肤色模型目前常用的静态肤色建模方法有三种类型:辨别肤色范围、高斯密度函数的估计和直方图的统计,本文采用辨别肤色范围的方法。规定肤色范围用数学表达式明确规定肤色范围是一种简单的肤色建模方式,假设输入像素的颜色落入RCr=[140;170]和RCb=[80;120]限定的矩形区域,就认为是属于皮肤颜色像素。在不同的亮度分量y上的矩形区域(RCr,RCb)不同。这种简单的判断方式运行起来即快速又高效,特别是在实时系统中更具有可用的价值。
由统计表明不同种族的人类的皮肤颜色区别主要受亮度的影响,而受颜色的影响比较小,所以直接考虑YCbCr空间的CbCr分量,映射为CbCr空间,在CbCr空间下,受亮度变化的影响少,且是两维独立分布。通过实践,选取大量皮肤颜色样本进行统计,发现皮肤颜色在CbCr空间的分布呈现出良好的聚类特性。
根据肤色识别原理识别人体肤色,再根据裸露皮肤最大的区域为人脸如图2-2所示:
图2-2(1)卧姿的人脸定位
图2-2(2)跳跃的人脸定位
图2-2(3)行走时的人脸定位
图2-2(4)坐姿的人脸定位
图2-2(5)奔跑时的人脸定位
第3章 行为识别
日常生活人的基本姿态有站、坐、躺,组成一个姿态集合A:
A={跳,走,跑,坐,躺} (3.1)
当前检测的姿态
,但是只有当图片中有人体时才能被检测出来,所以当图片中没有人体时则认为图片中的信息是非人体。
图3-1 识别流程图
3.1 灰度化
颜色可分为彩色和黑白。颜色中不包含任何的色彩成分,仅由白色和黑色组成的是黑白。在颜色模型RGB中,当R=G=B,那么颜色(R,G,B)则表示为一种黑白的颜色;其中R=G=B的值是灰度值,所以黑白色即灰度颜色。灰度与彩色之间是可以相互转化的,由灰度化转为彩色的称为伪彩色处理过程;由彩色转化为灰度的叫做灰度化处理过程
。
相应地,数字图像可区分为灰度图像和彩色图像。通过伪彩色处理和灰度化处理,可以使伪彩色图像与灰度图像之间进行相互转化。
使彩色的R,G,B分量值相等的过程就是灰度化。灰度的级别只有256级,即灰度图像仅能表现256种颜色(灰度),主要是因为R,G,B的取值范围是0 ~ 255。
灰度化的处理方法主要有如下3种[6]:
(1)最大值法:使R,G,B的值等于3个值中最大的一个,即
(3.11)
利用这种方法可以形成高亮度的灰度图像。
(2)平均值法:利用R,G,B的值求出平均值,即
(3.12)
平均值法可以形成相对比较柔和的灰度图像。
(3)加权平均值法:依据重要性或其他指标给R,G,B赋上不同的权值,并且使R,G,B的值加权平均,即
(3.13)
其中Wr,Wg,Wb分别为R,G,B的权值。当Wr,Wg,Wb取不相同的值时,加权平均值法
就会形成不同的灰度图像。绿色是人眼最敏感度的颜色,红色次之,对蓝色最低,因此使将得到比较合理的灰度图像。由理论和实验推导证明,当Wr = 0.30,Wg =0.59,Wb=0.11时,即当
(3.14)
(3.15)
时,能得到最合适的灰度图像。
背景差分法别名背景减法,背景差分法的原理是将当前的图像与背景图像进行差分来得到目标区域,这种方法能很好的识别和提取运动目标,是目前运动分割中最常用的一种方法。但是需要构建一幅背景图像,这幅背景图像必须不含要检测的目标或其他不需要检测目标,并且应该能不断的更新来分辨当前背景的变化。
背景差分法法是静止背景下运动目标识别和分割的另一种做法。如不考虑噪音n(x,y,t)的影响,视频帧图像I(x,y,t)可以看作是由背景图像b(x,y,t)和运动目标m(x,y,t)组成:
(3.21)
由式(4-14)可得运动目标m(x,y,t):
(3.22)
而在实际中,受噪音的影响,式(4-15)不能得到真正的运动目标,而是由运动目标区域和噪音组成的差分图像d(x,y,t),即:
(3.23)
得到运动目标需要依据某一判断原则进一步处理,最常用的方法为阈值分割的方法:
(3.24)
式中T为一阈值
图3-2(1)为背景差分法的流程图:
图3-2(1)
背景差分法实现步骤:
通过这次毕业设计的摸索,可将背景差分法的实现步骤总结如下:
(1)进行图像的预处理:主要包括对图像进行灰度化以及滤波。
(2)背景建模:这是背景差法较为重要的第一步。目前大多的思路都是根据前N帧图像的灰度值进行区间统计从而得到一个具有统计意义的初始背景。由于背景比较简单则选取图3-1(2)作为背景图:
图3-2(2)为背景图片
(3)前景提取:将图像与背景做差,即可求得背景差图,然后根据一定的方法对改图进行二值化,最终获得运动前景区域,即实现图像分割。
关于图像的二值化,目前主要的难点在于阈值的选取,随着运动物体在整个监控区域内的运动,所拍摄的图片具有不同的灰度特性,因此阈值的选取是一个研究热点,目前多采用的方法有最大类间方差法,一维交叉熵阈值法,二维交叉熵阈值法以及其他的自适应阈值选取方法等。由于本人对此研究不深,故选固定的阈值。
运用阈值法原理进行分割,阈值法是比较简单的图像分割方法,是一种常常运用的并行区域的技术。阈值是用运在区分目标图片和背景图片的灰度门限。如果要检测的图像只有目标和背景两类,那么只需要选取一个阈值这种方法称为单阈值分割,这种方法是将图像中每个像素中的灰度值与阈值相对比,灰度值大于阈值的算一种,灰度值小于阈值的为另一种。如果图像中存在多个检测目标或无关目标,那么就选多个阈值将每个目标及背景区分开,这种方法称为多阈值分割阈值,由于本人只有一个目标则采用单阈值分割,图3-3(1)为分割前后的比对
sit walk
图3-3(1)
行为分析最基本的两个问题:行为描述和行为识别。
由于人体具有一定的比例关系,例如,手臂在身体的上半部分,脚在身体的下半部分。可以想象,如果在某个区域内白点数(白色像素达标目标)比较多,则说明有肢体出现在该区域。如果事先能够定义好所有可能的姿态集合,并根据每一个姿态确定其区域组合,即可事先对姿态的判断。以左脚为例,若通过计算、和区的目标比例(即白点数与该区域的比例)后发现中的目标比例最大,则可判定左脚有拾起动作,角度大概在20~40之间。为了更好地确定动作的角度,可以把区域划分得更细(该算法首先需要确定人体的标准位置,用红色矩形框标出,计算出矩形框的高H和宽L,根据高宽的比例来判断人体的姿态。
这种方法的缺点在于,在除法运算的角度是粗糙的,进行更详细的动作,如拾取小角度肢,四肢弯曲(如臀部)等不能分割,分辨不够精确。有极个别的行为长宽比会重合,行为识别结果如图3-1所示
图3-4(1)卧姿判断
图3-4(2)坐姿判断
图3-4(4)行走判断
图3-4(4)跳跃判断
图3-4(5)奔跑判断
3.4小结
本章是基于第1章识别出人脸之后进行姿态识别的着重介绍,首先运用背景差分法,排除背景对识别的干扰;然后进行人体目标的提取,再根据外接框的长宽比,以此判断出人体处于何种姿态。
[1] 李智毅.新一代Web应用开发技术AJAX[C]//孙立峰.第二届和谐人机环境联合学术会议论文集. 北京:清华大学出版社,2007.31-34
[2] 王培,冯曼菲.Web 2.0开发技术详解[M].北京:人民邮电出版社,2006.389-403,495-520.
[3] Garrett J J. Ajax:A New Approach to Web Applications[EB/OL]. http://www.adaptivepath.com/publications/essays/archives/000385.php,2005-2-18
[4] [美]Ryan Asleson , Nathaniel T.Schutta.Ajax 基础教程,金灵等译.北京:人民邮电出版社,2006.
[5] 徐驰. Ajax模式在异步交互Web环境中的应用[J]. 计算机技术与发展,2006,16(11):229-233.
[6] 姚国新.基于Ajax的WEB应用技术的研究与实现[D]:[硕士学位论文].陕西:西北大学信息科学与技术学院,2006.
[7] 刘相滨,向坚持,王胜春,等.人行为识别与理解研究探讨[J].计算机与现代化.2004(12):10-15.
[8] 王亮,胡卫明,谭铁牛.人运动的视觉分分析综述[J],计算机学报.2002(25):19-23.
[9] 韩思奇,王蕾.图像分割的阈值法综述[J].系统工程与电子技术,2002(24):12-17.
[10] 朱秀昌,刘峰,胡栋编著.数字图像处理与图像通信[M].北京邮电大学出版色.2002:234-259.
[11] 张宏林,蔡锐.数字铜线模式识别及工程实践[M].北京人民邮电出版社.2007:325-373.
[12] 黄福珍,苏剑波.人脸检测[M].上海交通大学出版社.2006:257-369.
[13] 胡学龙.数字图像处理(第2版)[M].电子工业出版社.2011;137-152.
[14] 于殿泓.图像检测与处理技术[M].西安电子科大.2006:125-141.
[15] 王志波,陈庆财.步态识别综述[J].办公自动化.2012(04):23-39.
[16] 周维柏,李蓉.基于轨迹特征分析的行人异常行为识别[J].电脑编辑技巧与维护.2010(12):35-51.
[17] 于海滨.基于头部特征提取的人体检测与跟踪及其应用[D].浙江大学.2007:1-9.
[18] 刘翔楼,张明,邓艳茹.一种人脸对象的区域分割方法[J].科学技术与工程.2011(12):21-34.
[19] 张洪明,赵德斌,高文.基于肤色模型、神经网络和人脸结构模型的平面旋转人脸检测[J].计算机学报.2002(11):15-27.
[20] 张继涛,王伟,高君林.基于肤色分割和模板匹配的人脸检测技术研究与实现[J].自然科学报.2009(01):30-45.
[21] 朱喜.基于FPGA的图像预处理单元的设计与实现[D].湖南大学.2010:5-17.
[22] 冯柳.基于FPGA的图像处理算法的研究与设计[D].西南交通大学.2008:12-21.
[23] 梁路宏,艾海舟,徐光欲.人脸检测研究综述[J].计算机学报.2002(25):5-10.
[24] Daxis J,Bobick A.The Recognition of Human Movement Using Temporal Templates[J].IEEE Trans PAMI,2001,15(3):257-267.
[25] Kale A, Roy-Chowbury A, Chellappa R Fusion of gait and face for human Identification[C] In: Intl confon Acoustics, Acoustics, speech and Signal. Processing Canada: Montreal, 2004,22-37.
[26] A F Bobick,J W Davis.The recognition of human movement using temporal templates[J],IEEETrans.Pattern Anal.& Mach.Intell.,2001,3(21):257-267.
附录1 部分关键源码及解释
在这部分,将结合具体的源代码具体说明系统的执行流程和逻辑。
%申明数据库的位置
input = 'dataset';
%申明前景检测输出图像的位置
output = 'forground';
output2 = 'result';str1 = dir(input); %存储每个动作的文件夹
bk = imread('bk.png');%读入背景图片
bk = rgb2gray(bk);% 彩色背景转灰度背景
threshold = 40; %背景差阈值radio_jump = [];
radio_lie = [];
radio_run = [];
radio_sit = [];
radio_walk &#61; [];for x &#61; 3:length(str1) %循环每个动作文件夹xstr2 &#61; dir([input &#39;\&#39; str1(x).name &#39;\*.png&#39;]); %存储每个动作文件中的图片信息mkdir_fun(output, str1(x).name); % 在前景输出文件夹中&#xff0c;为每个动作创建文件夹mkdir_fun(output2, str1(x).name);%[x y x_with y_with]%计算外接框的长宽比radio &#61; bb(max_index).BoundingBox(3)/bb(max_index).BoundingBox(4);if x &#61;&#61; 3radio_jump &#61; [radio_jump;radio];endif x &#61;&#61; 4radio_lie &#61; [radio_lie;radio];endif x &#61;&#61; 5 radio_run &#61; [radio_run;radio];endif x &#61;&#61; 6radio_sit &#61; [radio_sit;radio];endif x &#61;&#61; 7radio_walk &#61; [radio_walk;radio];endimshow(im)% 判断外接框内是否有肤色&#xff0c; 如果有肤色&#xff0c; 才是人&#xff0c; 才进入行为判断c &#61; floor(bb(max_index).BoundingBox(1)) ; %xr &#61; floor(bb(max_index).BoundingBox(2)); %yc_width &#61; bb(max_index).BoundingBox(3); %x_withr_width &#61; bb(max_index).BoundingBox(4); % y_withrectangle(&#39;Position&#39;, [c r c_width r_width])sum_im &#61; im(r:r&#43;r_width,c:c&#43;c_width,:); %外接框图像skin &#61; skin_fun(sum_im); %寻找是否有肤色skin &#61; medfilt2(skin);bb_skin &#61; regionprops(skin,&#39;BoundingBox&#39;); %如果有肤色,切割出连通域min_index &#61; 1;min_height &#61; 720;for z &#61; 1:size(bb_skin,1)if bb_skin(z).BoundingBox(2) <&#61; min_height;min_height &#61; bb_skin(z).BoundingBox(2);min_index &#61; z;endendif size(bb_skin,1) >&#61;1 %如果找到肤色rectangle(&#39;Position&#39;, [c r c_width r_width])rectangle(&#39;Position&#39;, [c2 r2 c_width2 r_width2])text(c2&#43;c_width2&#43;5,r&#43;r_width2&#43;5,&#39;face&#39;) ;%jumpif radio<&#61; 0.5text(c-5,r-5,&#39;jump&#39;) ;end%lieif radio>&#61; 1text(c-5,r-5,&#39;lie&#39;) ;end%runif radio >0.54 && radio<0.6text(c-5,r-5,&#39;run&#39;) ;end%sitif radio >&#61;0.6 && radio <1text(c-5,r-5,&#39;sit&#39;) ;end%walkif radio<&#61;0.54 && radio>0.5text(c-5,r-5,&#39;walk&#39;) ;endelse %如果没找到肤色text(c-5,r-5,&#39;No Human&#39;) ;endsaveas(gcf,[output2 &#39;\&#39; str1(x).name &#39;\&#39; str2(y).name]);pause(0.005)imwrite(fg,[output &#39;\&#39; str1(x).name &#39;\&#39; str2(y).name]);end
end% mean(radio_jump) 0.468
% max(radio_jump) 0.6440
% min(radio_jump) 0.3299% mean(radio_lie) 4.4732
% max(radio_lie) 6
% min(radio_lie) 1.4% mean(radio_run) 0.57
% max(radio_run) 0.7
% min(radio_run) 0.34% mean(radio_sit) 0.6
% max(radio_sit) 0.7
% min(radio_sit) 0.59% mean(radio_walk) 0.4
% max(radio_walk) 0.54
% min(radio_walk) 0.27plot(radio_jump,&#39;b&#39;);
hold on;
plot(radio_lie,&#39;g&#39;);
hold on;
plot(radio_run,&#39;k&#39;);
hold on;
plot(radio_sit,&#39;y&#39;);
hold on;
plot(radio_walk,&#39;r&#39;);