基于OpenCV的变电站监控视频智能分析
2016-10-22王华键王一智董芸含刘一寰俞晓婷顾玖
王华键,王一智,董芸含,刘一寰,俞晓婷,顾玖
基于OpenCV的变电站监控视频智能分析
王华键1,王一智1,董芸含1,刘一寰1,俞晓婷1,顾玖1
(南京工程学院电力工程学院,南京 211167)
随着计算机技术的飞速发展,机器能代替人类所做的事情越来越多,而正是软硬件技术的不断更新,机器计算能力的不断加强,才使快速处理视频帧,图像等这些庞大的数据量成为现实。OpenCV是一款十分强大的图像处理开源程序库,使用面对对象高级语言C++开发,由intel公司维护。基于OpenCV来开发计算机图像处理的程序能大大缩短开发周期,性能也有所保证。使用者不必深究其算法的实现原理,从而把精力集中在所需实现的功能上。本文重点研究的是人脸识别的生物认证技术,适用于变电站环境下的简单安防系统。
计算机视觉;OpenCV;C++;运动检测;人脸识别
0 引言
视频,实际上就是一帧帧的图像组成的,要实现对视频数据的分析,首先要做的就是熟悉图像数据在计算机中是如何存储,显示的。我们可以将图像数据看作成一个二维矩阵,行和列数表示图像的大小,矩阵中的每个元素都是一个整数(0-255)数值的大小表示颜色深度。掌握数字图像的存储方式及原理后,便可以利用OpenCV提供的编程接口来快速开发程序了。
1运动检测部分
1.1核心技术要点:
1.读取视频序列
2.处理视频
3.检测并标识运动的物体
1.2读取视频序列
OpenCV提供了一个便于使用的框架来提取帧,首先需要创建cv::VideoCapture 类的实例,然后再循环中提取并读取每个视频帧。主要代码:(C++实现)
1.3处理视频
下面是一些常用的视频处理函数。
1.3.1高斯滤波
高斯滤波是一种线性平滑滤波,可以消除高斯噪声,用于减噪过程。通俗地讲,高斯滤波是对整幅图像进行加权平均的过程。从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。在OpenCV中提供了GaussianBlur函数来进行高斯滤波功能。
在这里简单提供一个函数原型:
C++:void GaussianBlur(InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY = 0,int borderType )
1.3.2Canny算子边界检测
Canny算子是基于Sobel算子(是一种梯度算子)工作的,它的核心理念是用两个不同的阈值来判断哪个点属于轮廓:一个低阈值,一个高阈值。
在OpenCV中,提供了cv::Canny函数来实现边界检测功能。函数原型如下:
Cv::Canny(image,contour,LOW_YZ,HIGH_YZ);
前两个参数表示原图像(必须是灰度图像),和目标图像。后两个参数是设置高低阈值。(合适的判断标准是以我们待检测对象的边界信息来确定的)
在这里补充对Canny算法的一些介绍,Canny算法用了一个额外的策略来优化边缘分布图的质量。在进行滞后阈值化之前,如果梯度幅值不是梯度方向上的最大值,那么对应的边缘点都会被删除。梯度的方向总是与边缘垂直,因此在某个方向上梯度的局部最大值,对应着轮廓最大强度的位置。所以Canny处理的轮廓既细薄,又清晰。
1.3.3Hough变换函数
人造世界中充满了几何形状的结构,因此,在图像中出现直线,圆,平面等,是很常见的。它们是很有意义的特征,在目标识别和图像理解领域有着非常重要的作用。Hough变换是一种常用于检测此类具体特征的经典算法。
首先介绍Hough线变换。
在OpenCV中通过cv::HoughLineP函数实现,其函数原型为:
Hough变换的目的是在二值图像中找出全部直线,并且这些直线必须穿过足够多的像素点。它的处理方法是,检查输入的二值分布图中每个独立的像素点,识别出穿过该像素点的所有可能的直线。如果同一条直线穿过很多的像素点,就说明这条直线明显到足以被认定。Hough变换也可以用来检测其他几何物体,实际上,任何可以用一个参数方程来表示的物体,都很适合用Hough来检测。
1.4检测并标识运动的物体
1.4.1检测运动物体
先看看这个功能的效果图。
分析完整的视频序列一直以来都是机器视觉处理的关键,做运动检测需要对视频做时序分析和特征点检测。在启动跟踪过程时,首先要在最初的帧中检测特征点,然后在下一帧中跟踪这些特征。因为我们处理的是一个特征序列,特征点所属的物体很可能会移动。因此要找到特征点在下一帧的新位置,必须在他原来的位置周围进行搜索。这个功能用函数:cv::calcOpticalFlow-PyrLK 实现,在函数中 输入两个连续的帧和第一幅图像的特征点向量,返回值是特征点新的位置向量。处理整个视频,则需要重复上述操作。
1.4.2calcOpticalFlowPyrLK函数的详细解读
calcOpticalFlowPyrLK函数的功能是:计算一个稀疏特征集的光流,使用金字塔中的迭代Lucas-Kanade 方法。
C++接口:
效果图
-prevImg:深度为8位的前一帧图像或金字塔图像。
-nextImg:和prevImg有相同的大小和类型,后一帧图像或金字塔。
-prevPts:计算光流所需要的输入2D点矢量,点坐标必须是单精度浮点数。
-nextPts:输出2D点矢量(也是单精度浮点数坐标),点矢量中包含的是在后一帧图像上计算得到的输入特征新位置。
-status:输出状态矢量,如果相应特征的流发现则矢量元素置为1,否则,为0。
-err: 输出误差矢量。
-winSize:每个金字塔层搜索窗大小。
-maxLevel:金字塔层的最大数目;如果置0,金字塔不使用(单层);如果置1,金字塔2层,等等以此类推。
-criteria:指定搜索算法收敛迭代的类型。
-minEigTheshold:算法计算的光流等式的2x2常规矩阵的最小特征值。
当然必不可少得分析金字塔Lucas-Kannade算法,这里只简要介绍其实现方式:
LK算法有三个假设:第一,假设亮度恒定,即图像场景中目标的像素在帧间运动时外观上保持不变;第二,假设时间连续或者运动是”小运动“,即图像的运动随时间的变化比较缓慢;第三,假设空间一致,即一个场景中同一表面上邻近的点具有相似的运动。然而,对于大多数30HZ的摄像机,大而连贯的运动是普遍存在的情况,所以LK光流正因为这个原因在实际中的跟踪效果并不是很好。我们需要大的窗口来捕获大的运动,而大窗口往往违背运动连贯的假设!而图像金字塔可以解决这个问题,金字塔Lucas-Kanade就提出来了。
金字塔Lucas-Kanade跟踪方法是:在图像金字塔的最高层计算光流,用得到的运动估计结果作为下一层金字塔的起始点,重复这个过程直到到达金字塔的最底层。这样就将不满足运动的假设可能性降到最小从而实现对更快和更长的运动的跟踪。
运动检测部分就介绍到这里。
2 人脸检测部分
2.1核心技术要点
1.人脸检测用武之地。2.如何来做人脸检测。
3.分类器的训练与级联。4.核心算法详解。
2.2人脸检测的用武之地
人脸检测问题最初作为自动人脸识别系统的定位环节被提出,近年来由于其在安全访问控制、视觉监测、基于内容的检索和新一代人机界面等领域的应用价值,开始作为一个独立的课题受到很多研究者的重视。这个部分从人脸检测问题的分类,特征提取与特征综合,性能评价等角度,来详细讲解人脸检测的核心技术和核心算法。
在本项目中,人脸检测功能主要用来对管理员进出做生物认证。
2.3如何来做人脸检测
目前的人脸检测主要有两种手段:基于知识和基于统计。基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。在这两种框架之下,发展了许多方法。目前随着各种方法的不断提出和应用条件的变化,将知识模型与统计模型相结合的综合系统将成为未来的研究趋势。
基于知识的方法可以分以下几个部分:
1.模板匹配
2.人脸特征
3.形状与边缘
4.纹理特性
5.颜色特征
基于统计的方法则可以分为:
1.主成分分析与特征脸
2.神经网络方法
3.支持向量机
4.隐马尔可夫模型
5. Adaboost算法
人脸检测中最重要的部分就是分类器的训练与选用,本文主要介绍Harr分类器。所谓分类器,就是指对人脸和非人脸进行分类的算法,在机器学习领域,很多算法都是对事物进行分类、聚类的过程。OpenCV中的 ml(机器学习)模块提供了很多分类、聚类的算法。那么聚类和分类的区别是什么?一般对已知物体类别总数的识别方式我们称之为分类,并且训练的数据是有标签的,比如已经明确指定了是人脸还是非人脸,这是一种有监督学习。也存在可以处理类别总数不确定的方法或者训练的数据是没有标签的,这就是聚类,不需要学习阶段中关于物体类别的信息,是一种无监督学习。
本文介绍的分类器叫:Harr分类器。Haar分类器,它建立了boost筛选式级联分类器。它与OpenCV的ML库中其他部分相比,有不同的格局。
2.4分类器的训练与级联
Haar分类器算法的要点如下:
① 使用Haar-like特征做检测。
② 使用积分图(Integral Image)对Haar-like特征求值进行加速。
③ 使用AdaBoost算法训练区分人脸和非人脸的强分类器。
④ 使用筛选式级联把强分类器级联到一起,提高准确率。
也可以这样来描述Harr分类器:
Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost + 级联
2.4.1Haar-like特征
先介绍下特征是用来做什么的。假设在人脸检测时我们需要有一个子窗口在待检测的图片窗口中不断地移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。
那么主要问题就是这个特征该如何表示了。
Viola大牛提出了一种Haar-like特征:
图1 其中1、3为边界特征,2为细线特征,4为对角线特征Fig.1 The first and third are boundary feature,secend is thin feature,forth is diagonal features
Lienhart大牛们也提出了其他的Haar-like特征
图2 边界特征Fig.2 Boundary feature
图3 线特征Fig.3 Thin feature
图4 中心特征Fig.4 Center features
那么这些特征到底怎么用呢?可以这样理解:将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。
为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。AdaBoost算法是Harr分类器里的很重要的算法。下面重点介绍AdaBoost算法。
2.5AdaBoost算法
AdaBoost,是英文“Adaptive Boosting”(自适应增强)的缩写,是一种机器学习方法,由Yoav Freund和Robert Schapire提出。AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。AdaBoost方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。
AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能聚焦于那些较难分(更富信息)的样本上。在具体实现上,最初令每个样本的权重都相等,对于第k次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器Ck。然后就根据这个分类器,来提高被它分错的的样本的权重,并降低被正确分类的样本权重。然后,权重更新过的样本集被用于训练下一个分类器Ck。整个训练过程如此迭代地进行下去。
用Xi和Yi表示原始样本集D的样本点和它们的类标。用Wk(i)表示第k次迭代时全体样本的权重分布。这样就有如下所示的AdaBoost算法:
4. 训练使用按照Wk(i)采样的D的弱学习器Ck
5. Ek←对使用Wk(i)的D测量的Ck的训练误差
注意第4点中,当前权重分布必须考虑到分类器Ck的误差率。在第7点中,Zk只是一个归一化系数,使得Wk(i)能够代表一个真正的分布,而hk(xi)是分量分类器Ck给出的对任一样本点xi的标记(+1或-1),hk(xi) = yi时,样本被正确分类。第8行中的迭代停止条件可以被换为判断当前误差率是否小于一个阈值。
最后的总体分类的判决可以使用各个分量分类器加权平均来得到:
这样,最后对分类结果的判定规则是:
AdaBoost算法中出现了弱分类器和强分类器。那么什么是弱分类器和强分类器呢?所谓的弱分类器,就是指一个分类算法对一组概念的识别率只比随机识别好一点,所谓强分类器,就是指一个分类算法对一组概率的识别率比较高。
弱分类器的数学结构:
一个弱分类器由子窗口图像x,一个特征f,指示不等号方向的p和阈值组成。P的作用是控制不等式的方向,使得不等式都是小于号,形式方便。
弱分类器的代码结构:
强分类器的代码结构:
训练最优弱分类器的过程实际上就是在寻找合适的分类器阈值,使该分类器对所有样本的判读误差最低。
具体操作过程如下:
1)对于每个特征 f,计算所有训练样本的特征值,并将其排序。
扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:
全部人脸样本的权重的和t1;
全部非人脸样本的权重的和t0;
在此元素之前的人脸样本的权重的和s1;
在此元素之前的非人脸样本的权重的和s0;
2)最终求得每个元素的分类误差
在表中寻找r值最小的元素,则该元素作为最优阈值。有了该阈值,最优弱分类器就诞生了。
而强分类器的诞生需要T轮的迭代,具体操作如下:
1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;
2. 初始化样本权重为1/N ,即为训练样本的初始概率分布;
3. 第一次迭代训练N个样本,得到第一个最优弱分类器;
4. 提高上一轮中被误判的样本的权重;
5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。
6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。
7.组合T个最优弱分类器得到强分类器
组合方式:
相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。
得到强分类器后,就可以级联起强分类器了。级联强分类器的策略是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,这样如果有20个强分类器级联,那么他们的总识别率为98%,错误接受率也仅为0.0001%。这样的效果就可以满足现实的需要了。至此,一个可以用的人脸检测系统大致完成。
下面给出一些效果图:
3 总结
本文介绍了OpenCV库在计算机视觉领域的作用,通过实现运动检测和人脸识别功能给电网变电站建立起一道安全的生物认证系统。重点介绍了AdaBoost这种机器学习算法和分类器的训练,机器学习是人工智能很重要的一部分,会渐渐渗透各个领域。本系统在变电站人员进出的生物认证方面和事故突发紧急报警方面发挥着实际作用。
[1] LAGANIERE R. OpenCV计算机视觉编程攻略(第2版)[M]. 相银初 北京:中国工信出版集团&人民邮电出版社,2015.
LAGANIERE R. OpenCV Computer Vision Application Programming Cookbook,Second Edition[M]. XIANG Y C BeiJing:China Publishing Group and people’s posts and telecommunications Publishing House,2015.
[2] 毛星云,冷雪飞. OpenCV3编程入门 [M]. 北京:电子工业出版社,2015.
MAO X Y,LENG X F,l. OpenCV Introduction to programming [M]. BeiJing:Publishing House of electronics industry ,2015
[3] 龙伶敏,傅志中.基于Adaboost的人脸检测方法及眼睛定位算法研究[D]. 成都:电子科技大学,2008.
LONG L M ,FU Z Z. Human face detection and eyes location based on Adaboost algorithm[D]. ChengDu:University of Electronic Science and Technology,2008.
[4] 吕锋,李华,李延忠,等. 基于支持向量机的故障诊断方法研究[J].新型工业化,2015,5(4):34-39.
LV F,LI H,LI Y Z,et al. A Study of Fault Diagnosis Method Based on SVM[J]. The Journal of New Industrialization,2015,5(4):34-39.
[5] 牛丽敏.Apriori算法分析与改进综述[J].桂林电子科技大学学报,2007,27(1):27-30.
NIU L M. Review of the optimization and analysis of Apriori algorithm[J]. Journal of Guilin University of Electronic Technology,2007,27(1):27-30.
[6] 孟海东,李丹丹.基于数据场的量化关联规则挖掘方法设计[J].新型工业化,2012,2(9):12-17.
MENG H D,LI D D. Design of quantitative association rules mining method based on data field[J]. The Journal of New Industrialization,2012,2(9):12-17.
[7] 汪三青,徐宁.基于Atmega128 串口摄像的应用[J].新型工业化,2011,1(4):100-105.
WANG Sanqing,XU Ning.The application of serial camera on the Atmega128[J].The Journal of New Industrialization,2011,1(4):100-105.
[8] 张小华,王然.基于图像特征的偏微分方程去噪方法[J].新型工业化,2011,1(6):9-14.
Xiaohua Zhang,Ran Wang.Partial differential equation method based on image feature for Denoising[J].The Journal of New Industrialization,2011,1(6):9-14.
[9] 邱亚钦,刘渭滨,户磊,等.动态背景下的运动目标检测方法[J].新型工业化,2011,1(9):22-29.
Qiu Yaqin,Liu Weibin,Hu Lei,et al.Robust Motion Detection under dynamic background[J].The Journal of New Industrialization,2011,1(9):22-29.
[10] Frequent Data Itemset Mining Using VS_Apriori Algorithms[J]. International Journal on Computer Science and Engineering,2010,2 (4),1111.
Substation Monitoring and Intelligent Video Analysis Based on OpenCV
WANG Hua-jian1, WANG Yi-zhi1, DONG Yun-han1, LIU Yi-huan1, YU Xiao-ting1, Gu Jiu1
(School of Electric Power Engineering, Nanjing Institute of Technology, Nanjing 211167, China)
With the rapid development of computer technology, the machine can replace humans to do something more. And it is constantly updating software and hardware technology, machine computing power increased, only to quickly handle video frames, huge amounts of data such as the image becomes a reality. OpenCV open source is a very powerful image processing library, C++ uses object-a high-level language development, maintained by Intel Corporation. Computer image processing based on OpenCV development program can greatly shorten the development cycle, performance assurance. Users don’t have to read between the lines its principle of the algorithm, so as to focus on the required function. This paper is a study of face recognition biometric technology, simple security system applied to substation environments.
Computer vision; OpenCV; C++; Motion detection; Face recognition
10.19335/j.cnki.2095-6649.2016.08.005
WANG Hua-jian, WANG Yi-zhi, DONG Yun-han, et al. Substation Monitoring and Intelligent Video Analysis based on OpenCV[J]. The Journal of New Industrialization,2016,6(8): 31-40.
江苏省南京工程学院科技创新项目(TB20160406)
王华键(1995-),男,本科在读,主要研究方向为智能电网;王一智,男,本科在读,主要研究方向为智能电网;董芸含(1996-),女,本科在读,主要研究方向为智能电网;刘一寰(1997-),男,本科在读,主要研究方向为智能电网;俞晓婷(1995-),女,本科在读,主要研究方向为智能电网;顾玖(1996-),男,本科在读,主要研究方向为智能电网。
本文引用格式:王华键,王一智,董芸含,等. 基于OpenCV的变电站监控视频智能分析[J]. 新型工业化,2016,6(8):31-40.