今天看了一些基础的人脸识别概念知识,下面把内容复制粘贴过来一下,方便自己看一下吧,都是些百度百科上现有的理论知识。
人脸识别技术是指利用分析比较的计算机技术识别人脸。人脸识别是一项热门的计算机技术研究领域,其中包括人脸追踪侦测,自动调整影像放大,夜间红外侦测,自动调整曝光强度等技术。
人脸识别技术属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。
人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流 . 首先判断其是否存在人脸 , 如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。
广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。
生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形、个人习惯(例如敲击键盘的力度和频率、签字)等,相应的识别技术就有人脸识别、指纹识别、掌纹识别、虹膜识别、视网膜识别、语音识别(用语音识别可以进行身份识别,也可以进行语音内容的识别,只有前者属于生物特征识别技术)、体形识别、键盘敲击识别、签字识别等。
1.2.1 技术原理
人脸识别技术包括三个部分:人脸检测、人脸跟踪和人脸对比。
1)人脸检测
面貌检测是指在动态的场景与复杂的背景中判断是否存在面像,并分离出这种面像。一般有下列几种方法:
①参考模板法
首先设计一个或数个标准人脸的模板,然后计算测试采集的样品与标准模板之间的匹配程度,并通过阈值来判断是否存在人脸;
②人脸规则法
由于人脸具有一定的结构分布特征,所谓人脸规则的方法即提取这些特征生成相应的规则以判断测试样品是否包含人脸;
③样品学习法
这种方法即采用模式识别中人工神经网络的方法,即通过对面像样品集和非面像样品集的学习产生分类器;
④肤色模型法
这种方法是依据面貌肤色在色彩空间中分布相对集中的规律来进行检测。
⑤特征子脸法
这种方法是将所有面像集合视为一个面像子空间,并基于检测样品与其在子空间的投影之间的距离判断是否存在面像。
值得提出的是,上述5种方法在实际检测系统中也可综合采用。
2)人脸跟踪
面貌跟踪是指对被检测到的面貌进行动态目标跟踪。具体采用基于模型的方法或基于运动与模型相结合的方法。此外,利用肤色模型跟踪也不失为一种简单而有效的手段。
3)人脸对比
面貌比对是对被检测到的面貌像进行身份确认或在面像库中进行目标搜索。这实际上就是说,将采样到的面像与库存的面像依次进行比对,并找出最佳的匹配对象。所以,面像的描述决定了面像识别的具体方法与性能。主要采用特征向量与面纹模板两种描述方法:
①特征向量法
该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、位置、距离等属性,然后再计算出它们的几何特征量,而这些特征量形成一描述该面像的特征向量。
②面纹模板法
该方法是在库中存贮若干标准面像模板或面像器官模板,在进行比对时,将采样面像所有象素与库中所有模板采用归一化相关量度量进行匹配。此外,还有采用模式识别的自相关网络或特征与模板相结合的方法。
人脸识别技术的核心实际为“局部人体特征分析”和“图形/神经识别算法。”这种算法是利用人体面部各器官及特征部位的方法。如对应几何关系多数据形成识别参数与数据库中所有的原始参数进行比较、判断与确认。一般要求判断时间低于1秒。
一般分三步:
(1)首先建立人脸的面像档案。即用摄像机采集单位人员的人脸的面像文件或取他们的照片形成面像文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。
(2)获取当前的人体面像。即用摄像机捕捉的当前出入人员的面像,或取照片输入,并将当前的面像文件生成面纹编码。
(3)用当前的面纹编码与档案库存的比对。即将当前的面像的面纹编码与档案库存中的面纹编码进行检索比对。上述的“面纹编码”方式是根据人脸脸部的本质特征和开头来工作的。这种面纹编码可以抵抗光线、皮肤色调、面部毛发、发型、眼镜、表情和姿态的变化,具有强大的可靠性,从而使它可以从百万人中精确地辨认出某个人。人脸的识别过程,利用普通的图像处理设备就能自动、连续、实时地完成。
人脸识别系统主要包括四个组成部分,分别为:人脸图像采集及检测、人脸图像预处理、人脸图像特征提取以及匹配与识别。
人脸图像采集:不同的人脸图像都能通过摄像镜头采集下来,比如静态图像、动态图像、不同的位置、不同表情等方面都可以得到很好的采集。当用户在采集设备的拍摄范围内时,采集设备会自动搜索并拍摄用户的人脸图像。
人脸检测:人脸检测在实际中主要用于人脸识别的预处理,即在图像中准确标定出人脸的位置和大小。人脸图像中包含的模式特征十分丰富,如直方图特征、颜色特征、模板特征、结构特征及Haar特征等。人脸检测就是把这其中有用的信息挑出来,并利用这些特征实现人脸检测。
主流的人脸检测方法基于以上特征采用Adaboost学习算法,Adaboost算法是一种用来分类的方法,它把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。
人脸检测过程中使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器,再将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,有效地提高分类器的检测速度。
人脸图像预处理:对于人脸的图像预处理是基于人脸检测结果,对图像进行处理并最终服务于特征提取的过程。系统获取的原始图像由于受到各种条件的限制和随机 干扰,往往不能直接使用,必须在图像处理的早期阶段对它进行灰度校正、噪声过滤等图像预处理。对于人脸图像而言,其预处理过程主要包括人脸图像的光线补偿、灰度变换、直方图均衡化、归一化、几何校正、滤波以及锐化等。
人脸图像特征提取:人脸识别系统可使用的特征通常分为视觉特征、像素统计特征、人脸图像变换系数特征、人脸图像代数特征等。人脸特征提取就是针对人脸的某些特征进行的。人脸特征提取,也称人脸表征,它是对人脸进行特征建模的过程。人脸特征提取的方法归纳起来分为两大 类:一种是基于知识的表征方法;另外一种是基于代数特征或统计学习的表征方法。
基于知识的表征方法主要是根据人脸器官的形状描述以及他们之间的距离特性来获得有助于人脸分类的特征数据,其特征分量通常包括特征点间的欧氏距离、曲率和角度等。人脸由眼睛、鼻子、嘴、下巴等局部构成,对这些局部和它们之间结构关系的几何描述,可作为识别人脸的重要特征,这些特征被称为几何特征。基于知识的人脸表征主要包括基于几何特征的方法和模板匹配法。
人脸图像匹配与识别:提取的人脸图像的特征数据与数据库中存储的特征模板进行搜索匹配,通过设定一个阈值,当相似度超过这一阈值,则把匹配得到的结果输出。人脸识别就是将待识别的人脸特征与已得到的人脸特征模板进行比较,根据相似程度对人脸的身份信息进行判断。这一过程又分为两类:一类是确认,是一对一进行图像比较的过程,另一类是辨认,是一对多进行图像匹配对比的过程。
人脸捕获是指在一幅图像或视频流的一帧中检测出人像并将人像从背景中分离出来,并自动地将其保存。人像跟踪是指利用人像捕获技术,当指定的人像在摄像头拍摄的范围内移动时自动地对其进行跟踪。
人脸识别分核实式和搜索式二种比对模式。核实式是对指将捕获得到的人像或是指定的人像与数据库中已登记的某一对像作比对核实确定其是否为同一人。搜索式的比对是指,从数据库中已登记的所有人像中搜索查找是否有指定的人像存在。
可以将登记入库的人像数据进行建模提取人脸的特征,并将其生成人脸模板(人脸特征文件)保存到数据库中。在进行人脸搜索时(搜索式),将指定的人像进行建模,再将其与数据库中的所有人的模板相比对识别,最终将根据所比对的相似值列出最相似的人员列表。
系统可以识别得出摄像头前的人是一个真正的人还是一幅照片。以此杜绝使用者用照片作假。此项技术需要使用者作脸部表情的配合动作。
图像质量的好坏直接影响到识别的效果,图像质量的检测功能能对即将进行比对的照片进行图像质量评估,并给出相应的建议值来辅助识别
人脸识别技术中被广泛采用的区域特征分析算法,它融合了计算机图像处理技术与生物统计学原理于一体,利用计算机图像处理技术从视频中提取人像特征点,利用生物统计学的原理进行分析建立数学模型,即人脸特征模板。利用已建成的人脸特征模板与被测者的人的面像进行特征分析,根据分析的结果来给出一个相似值。通过这个值即可确定是否为同一人。
(1)几何特征的人脸识别方法:
几何特征可以是眼、鼻、嘴等的形状和它们之间的几何关系(如相互之间的距离)。这些算法识别速度快,需要的内存小,但识别率较低。
(2)基于特征脸(PCA)的人脸识别方法:
特征脸方法是基于KL变换的人脸识别方法,KL变换是图像压缩的一种最优正交变换。高维的图像空间经过KL变换后得到一组新的正交基,保留其中重要的正交基,由这些基可以张成低维线性空间。如果假设人脸在这些低维线性空间的投影具有可分性,就可以将这些投影用作识别的特征矢量,这就是特征脸方法的基本思想。这些方法需要较多的训练样本,而且完全是基于图像灰度的统计特性的。目前有一些改进型的特征脸方法。
(3)神经网络的人脸识别方法:
神经网络的输入可以是降低分辨率的人脸图像、局部区域的自相关函数、局部纹理的二阶矩等。这类方法同样需要较多的样本进行训练,而在许多应用中,样本数量是很有限的。
(4)弹性图匹配的人脸识别方法:
弹性图匹配法在二维的空间中定义了一种对于通常的人脸变形具有一定的不变性的距离,并采用属性拓扑图来代表人脸,拓扑图的任一顶点均包含一特征向量,用来记录人脸在该顶点位置附近的信息。该方法结合了灰度特性和几何因素,在比对时可以允许图像存在弹性形变,在克服表情变化对识别的影响方面收到了较好的效果,同时对于单个人也不再需要多个样本进行训练。
(5)线段Hausdorff 距离(LHD) 的人脸识别方法:
心理学的研究表明,人类在识别轮廓图(比如漫画)的速度和准确度上丝毫不比识别灰度图差。LHD是基于从人脸灰度图像中提取出来的线段图的,它定义的是两个线段集之间的距离,与众不同的是,LHD并不建立不同线段集之间线段的一一对应关系,因此它更能适应线段图之间的微小变化。实验结果表明,LHD在不同光照条件下和不同姿态情况下都有非常出色的表现,但是它在大表情的情况下识别效果不好。
(6)支持向量机(SVM) 的人脸识别方法:
支持向量机是统计模式识别领域的一个新的热点,它试图使得学习机在经验风险和泛化能力上达到一种妥协,从而提高学习机的性能。支持向量机主要解决的是一个2分类问题,它的基本思想是试图把一个低维的线性不可分的问题转化成一个高维的线性可分的问题。通常的实验结果表明SVM有较好的识别率,但是它需要大量的训练样本(每类300个),这在实际应用中往往是不现实的。而且支持向量机训练时间长,方法实现复杂,该函数的取法没有统一的理论。
一般来说,人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
人脸识别的算法可以分类为:
基于人脸特征点的识别算法(Feature-based recognition algorithms)。
基于整幅人脸图像的识别算法(Appearance-based recognition algorithms)。
基于模板的识别算法(Template-based recognition algorithms)。
利用神经网络进行识别的算法(Recognition algorithms using neural network)
import cv2
# 打开显示图片
# #读取图片
# image=cv2.imread('img/obama.jpg')
# #显示图片窗口
# cv2.imshow('faces',image)
# #窗口暂停
# cv2.waitKey(0)
# #销毁窗口资源
# cv2.destoryAllWindows()
#
# 识别图片上的人脸
#读取图片
image=cv2.imread('img/obama.jpg')
#加载人脸模型库
#自己找到自己安装的文件未知 face_model=cv2.CascadeClassifier('plugins/opencv/haarcascade_frontalcatface.xml')
face_model=cv2.CascadeClassifier('E:/anaconda/Lib/site-packages/cv2/data/haarcascade_frontalcatface.xml')
#图片进行灰度处理
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
#人脸检测
faces = face_model.detectMultiScale(gray)
#标记人脸
for (x,y,w,h) in faces:
#1.原始图片;2坐标点;3.矩形宽高 4.颜色值(RGB);5.线框
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
#显示图片窗口
cv2.imshow('faces',image)
#窗口暂停
cv2.waitKey(0)
#销毁窗口
cv2.destroyAllWindows()
结果展示:
人脸识别优点
相比较其他生物识别技术而言:
非接触的,用户不需要和设备直接接触;
非强制性,被识别的人脸图像信息可以主动获取;
并发性,即实际应用场景下可以进行多个人脸的分拣、判断及识别。
人脸识别的弱点
对周围的光线环境敏感,可能影响识别的准确性;
人体面部的头发、饰物等遮挡物,人脸变老等因素,需要进行人工智能补偿;(如可通过识别人脸的部分关键特性做修正)。
视频信号有模拟信号和数字信号之分,视频处理泛指对视频信息的所有操作,视频数据处理技术包括视频的编辑、视频的压缩等方面,目的是增强视频的观赏性。视频数据处理软件主要包括5种:Adobe Premiere、Ulead Media Studio Pro、Ulead Video Studio、Windows Movie Maker、Pinnacle Studio。数字化的视频编辑技术不仅让人们体验到了前所未有的视觉冲击效果,也为人们的日常生活带来了无穷的乐趣。
1)视频信号
视频信号有模拟信号和数字信号之分,模拟视频信号就是常见的电视信号,采用的模拟方式对图像进行还原处理,这种图像被称为视频模拟图像。
2)视频文件
视频文件主要包括两类,即动画文件和影像文件,动画文件是指由相互关联的若干个静止的图像组成的图像序列,这些静止的图像序列连续播放时形成了动画;影像文件是指包含实时的音频和视频信息的多媒体文件,其多媒体信息通常通过视频输入设备输入到计算机中,该类型的文件包含的信息丰富,文件较大。
3)视频素材的采集
视频素材的采集分为从模拟视频设备中采集和从数字视频中采集两种方式。
4)视频文件格式
常见的视频文件格式有7种:
(1)AVI,英文全称为Audio Video Interleaved,即音频视频交错格式;
(2)MOV,MOV是Quick Time for Windows视频处理软件使用的视频文件格式;
(3)MPG,MPG采用MPEG标准,该类型的文件采用高密度压缩比;
(4)ASF,英文全称为Advanced Streaming Format,它是微软为了和Real Player竞争而推出的一种视频格式;
(5)WMV,英文全称为Windows Media Video,也是微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式;
(6)RM,英文全称为Real Media;
(7)RMVB格式,它是由RM视频格式升级延伸出的新视频格式;
视频处理泛指对视频信息的所有操作,视频处理技术包括视频的编辑、视频的压缩等方面,目的是增强视频的观赏性。
采集到的数字视频文件一般要经过编辑加工后,才能在多媒体系统中使用。数字视频的编辑工作主要靠软件来完成,常见的视频编辑操作有如下几种:
(1)基本编辑。
视频的基本编辑主要是针对选取的视频片段进行编排、剪切、复制等操作。在时间轴上将视频片段从头到尾排列,形成从头到尾连续播放的视频节目。
(2)过渡特技。
视频是一组连续播放的画面,两个场景之间如果直接连接起来,在许多情况下会感到突兀,剪辑时如果画面间的连接不当,会造成跳动、画面拖沓等感觉。使用过渡特技可以使画面连接自然流畅。
(3)视频特技。
视频特技是指对片段本身做的处理,如透明处理、运动处理、速度处理、色彩处理等。透明效果可以将两个片段的画面内容叠加在一起,常用在表示回忆的场景中。运动处理可以使静止的画面移动。
(4)字幕。
视频上叠加的文字称为字幕。在电视节目、广告、卡拉0K等视频中常常使用字幕显示相关的文字信息。视频中出现的文字在画面变化的情况下要保持一段时间,不同的画面内容要配合显示不同的文字说明,不仅是文字,图形、照片、标记等都可以作为字幕放在视频作品中。字幕可以向台标一样静止在屏幕一角,也可以做成节目结束后滚动的工作人员名单。字幕可以选用不同的出现方式,如:移入、溶解、放大、缩小、旋转、変色等,以产生不同的视觉效果。
(5)配音。
视频节目制作中除了音乐之外,往往还需要添加适当的配音进行旁白。在录制节目的同时录下当时的环境声音称为同期声,编辑时可以单独处理,进行剪辑或添加效果,也可以为语音解说配上背景音乐。
数字化的视频信号以视频文件形式存储在磁盘上,所占硬盘空间非常大,而视频经过压缩后,存储时会更方便。数字视频压缩以后并不影响其最终的视觉效果,原因是它利用人的心理视觉冗余进行压缩处理。所谓心理视觉冗余是指眼睛并不是对所有信息有相同的敏感度,有些信息通常在视觉过程中与另外一些信息相比来说并不是那么重要。
视频压缩的目标是在尽可能保证视觉效果的前提下减少视频数据率。视频压缩比一般是指压缩后的数据量与压缩前的数据量之比。标准的数字摄像机的压缩率为5:1,有的格式可使视频的压缩率达到100:1,但过分压缩也不是件好事。因为压缩得越多,丢失的数据就越多。由于视频是连续的静态图像,因此其压缩编码算法与静态图像的压缩编码算法有某些共同之处,但是运动的视频还有其自身的特性,因此在压缩时还应考虑其运动特性才能达到高压缩的目标。视频压缩的相关概念如下:
(1)有损和无损压缩。
在视频压缩中有损和无损的概念与静态图像中基本装似。无损压缩即压缩前和解压缩后的数据完全一致。多数的无损压缩都来用RLE行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式。这样还会引起额外的数据丢失。
(2)帧内和帧间压缩。
帧内压缩也称为空间压缩。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩时各个帧之间没有相互关系,所以压缩后的视频资料仍可以以帧为单位进行编辑。帧内压缩一般达不到很高的压缩。
帧间压缩是基于许多视频或动画的连续前后两帧具有很大的相关性,或者说前后两帧信息变化很小的特点,即连续的视频其相邻两帧之同具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩,它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值算法是一种典型的时间压缩法,它通过比较本帧与相帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
(3)对称和不对称编码。
对称性是压缩编码的一个关键特征。对称意味着压缩和解压缩占用相同的计算处理能力和时间,对称算法适合于实时压缩和传送视频,如视频会议应用就以采用对称的压缩编码算法为好。而在电子出版和其他多媒体应用中,一般是把视频预先压缩处理好,然后再播放,因此可以采用不对称编码。不对称或非对称意味着压缩时需要花费大量的处理能力和时间,而解压缩时则能较好地实时回放,即以不同的速度进行压缩和解压缩。一般来说,压缩一段视频的时间比回放(解压缩)该视频的时间要多得多。例如,压缩一段3分钟的视频片断可能需要10多分钟的时间,而该片断实时回放时间只有3分钟。
有多种视频压缩编码方法,但其中最有代表性的是MPEG数字视频格式和AVI数字视频格式。
数据流应用的产生的发展是以下两个因素的结果:
细节数据
已经能够持续自动产生大量的细节数据。这类数据最早出现于传统的银行和股票交易领域,后来则也出现为地质测量、气象、天文观测等方面。尤其是互联网(网络流量监控,点击流)和无线通信网(通话记录)的出现,产生了大量的数据流类型的数据。我们注意到这类数据大都与地理信息有一定关联,这主要是因为地理信息的维度较大,容易产生这类大量的细节数据。
复杂分析
需要以近实时的方式对更新流进行复杂分析。对以上领域的数据进行复杂分析(如趋势分析,预测)以前往往是(在数据仓库中)脱机进行的,然而一些新的应用(尤其是在网络安全和国家安全领域)对时间都非常敏感,如检测互联网上的极端事件、欺诈、入侵、异常,复杂人群监控,趋势监控(track trend),探查性分析(exploratory analyses),和谐度分析(harmonic analysis)等,都需要进行联机的分析。
在此之后,学术界基本认可了这个定义,有的文章也在此基础上对定义稍微进行了修改。例如,S. Guha等[88]认为,数据流是“只能被读取一次或少数几次的点的有序序列”,这里放宽了前述定义中的“一遍”限制。
为什么在数据流的处理中,强调对数据读取次数的限制呢?S. Muthukrishnan[89]指出数据流是指“以非常高的速度到来的输入数据”,因此对数据流数据的传输、计算和存储都将变得很困难。在这种情况下,只有在数据最初到达时有机会对其进行一次处理,其他时候很难再存取到这些数据(因为没有也无法保存这些数据)。
与传统的关系数据模式区别
B.Babcock等[90]认为数据流模式在以下几个方面不同于传统的关系数据模式:
三个特征
当前所研究的数据流计算之所以不同于传统的计算模式,关键在于这些数据流数据本身具有如下三个特点:
数据的到达—快速
这意味着短时间内可能会有大量的输入数据需要处理。这对处理器和输入输出设备来说都是一个较大的负担,因此对数据流的处理应尽可能简单
数据的范围—广域
这是指数据属性(维)的取值范围非常大,可能取的值非常多,如地域、手机号码、人、网络节点等。这才是导致数据流无法在内存或硬盘中存储的主要原因。如果维度小,即使到来的数据量很大,也可以在较小的存储器中保存这些数据。例如,对于无线通信网来说,同样的100万条通话记录,如果只有1000个用户,那么使用1000个存储单位就可以保存足够多和足够精确的数据来回答“某一用户的累计通话时间有多长”的问题;而如果共有100000个用户,要保存这些信息,就需要100000个存储单位。数据流数据的属性大多与地理信息、IP地址、手机号码等有关,而且往往与时间联系在一起。这时,数据的维度远远超过了内存和硬盘容量,这意味着系统无法完整保存这些信息,通常只能在数据到达的时候存取数据一次。
数据到达的时间—持续
数据的持续到达意味着数据量可能是无限的。而且,对数据进行处理的结果不会是最终的结果,因为数据还会不断地到达。因此,对数据流的查询的结果往往不是一次性而是持续的,即随着底层数据的到达而不断返回最新的结果。
以上数据流的特点决定了数据流处理的特点一次存取,持续处理,有限存储, 近似结果,快速响应。
近似结果是在前三个条件限制下产生的必然结果。由于只能存取数据一次,而且只有相对较小的有限空间存储数据,因此产生精确的计算结果通常是不可能的。而将对结果的要求从过去的“精确”改为“近似”后,实现数据流查询的快速响应也就成为了可能。
数据的性质、格式不同,则对流的处理方法也不同,因此,在Java的输入/输出类库中,有不同的流类来对应不同性质的输入/输出流。在java.io包中,基本输入/输出流类可按其读写数据的类型之不同分为两种:字节流和字符流。
输入流与输出流
数据流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只能读不能写,而输出流只能写不能读。通常程序中使用输入流读出数据,输出流写入数据,就好像数据流入到程序并从程序中流出。采用数据流使程序的输入输出操作独立与相关设备。
输入流可从键盘或文件中获得数据,输出流可向显示器、打印机或文件中传输数据。缓冲流
为了提高数据的传输效率,通常使用缓冲流(Buffered Stream),即为一个流配有一个缓冲区(buffer),一个缓冲区就是专门用于传输数据的内存块。当向一个缓冲流写入数据时,系统不直接发送到外部设备,而是将数据发送到缓冲区。缓冲区自动记录数据,当缓冲区满时,系统将数据全部发送到相应的设备。
当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据。当缓冲区空时,系统就会从相关设备自动读取数据,并读取尽可能多的数据充满缓冲区。
们试图从数据集合、数据属性和计算类型三个不同方面对数据流的模型进行归纳和描述。实际上,很多文章提出了各种各样的数据流模型,我们并没有包括所有这些模型,只是将其中比较重要的和常见的进行了归纳和分类。
形式化
数据集合
我们首先考虑在进行数据流计算时,有哪些数据被包含在计算范围之内。关于这个问题,主要有三种不同的模型:分别是数据流模型(data stream model)、滑动窗口模型(sliding window model)和n-of-N模型。
数据流模型(data stream model)在数据流模型中,从某个特定时间开始的所有数据都要被纳入计算范围。此时,s=0,即在时刻0,α是0向量。即这是数据流最初和最普遍的模型。
滑动窗口模型(sliding window model ,计算最近的N个数据)滑动窗口模型是指,从计算时算起,向前追溯的N个数据要被纳入计算范围。此时,s = t . N,即在时刻t . N,α是0向量。换句话说,要计算最近的N个数据。由于数据流的数据是不断涌现的,所以直观的看,这种模式就像用一个不变的窗口,数据随时间的推移经过窗口,出现窗口内的数据就是被计算的数据集合。M. Datar等[91]首先提出这一模式,随后得到了广泛响应。
n-of-N模型(计算最近的n个数据,其中0
数据本身的特征:
时间序列(time series model) 数据按照其属性(实际上就是时间)的顺序前来。在这种情况下,i = t,即一个t时刻的更新为(t, ct)。此时对α的更新操作为αt(t)= ct, 且对于i. =.t,αi. (t)= αi. (t . 1)。这种模型适用于时序数据,如某特定IP的传出的数据,或股票的定期更新数据等。
收款机模型(cash register model) 同一属性的数据相加,数据为正。在这种模型中,ct >=0。这意味着对于所有的i和t来说,αi(t)总是不小于零,而且是递增的。实际上,这种模型被认为是最常用的,例如可以用于对收款机(收款机模型由此得名),各个IP的网络传输量,手机用户的通话时长的监控等等。
十字转门模型(turnstile model) 同一属性的数据相加,数据为正或负。在这种模型中,ct可以大于0也可以小于0。这是最通用的模型。S. Muthukrishnan[89]称其为十字转门模型起因于这种模型的功能就象地铁站的十字转门,可以用来计算有多少人到达和离开,从而得出地铁中的人数。
计算类型
对数据流数据的计算可以分为两类:基本计算和复杂计算。基本计算主要包括对点查询、范围查询和内积查询这三种查询的计算。复杂计算包括对分位数的计算、频繁项的计算以及数据挖掘等。
简介
数据流处理过程中的主要难点在于如何将存储数据所花费的空间控制在一定范围之内。查询响应时间问题虽然也很重要,但相对容易解决。作为研究领域的一个热点,数据流处理问题得到了广泛的研究,出现了很多算法。
解决数据流庞大的数据量与有限的存储空间之间的矛盾的一个思路是使用采样,另一个思路是,构造一个小的、能提供近似结果的数据结构存放压缩的数据流数据,这个结构能存放在存储器中。略图(Sketch)、直方图(histogram)和小波(wavelet)实际上就都是这样的数据结构中最重要的三种。
以上方法实际上大都已用于传统数据库领域,问题在于如何将它们应用于数据流的特殊环境。
随机采样
随机采样(Random sampling)可以通过抽取少量样本来捕捉数据集合的基本特性。一个很常见的简单方法就是一致性采样(uniform sample)。作为一个备选的采样方法分层采样(strati.ed sampling)可以减少数据的不均匀分布所带来的误差。不过,对于复杂的分析,普通的采样算法还是需要太大的空间。
对于数据流的一些特殊计算,已经出现了一些有趣的采样算法。粘采样(Sticky sampling)[95]用于频繁项(frequent items)的计算。粘采样使用的方法是,在内存中存放二元组(i,f)所构成的集合S,对于每到来的一个数据,如果其键i已经存在于S,则对应的f加1;否则,以1 r 的概率进行采样,如果该项被选中,在S中增加一组(i,1);每过一段时间,对S中的组进行一遍扫描,对其中的值进行更新。然后增加r的值;结束(或用户要求结果)时,输出所有f.(s-e)N的组。
. Gibbons提出的distinct sampling[104]用于distinct counting ,即找出数据流中不同值的个数。它使用哈希(hash )函数对每一个到来的不同值以2.(i+1)的概率映射到级别i上;如果i ≥内存级别L(L的初始值为0),将其加入内存,否则抛弃;内存满时,将内存中级别为L的值删除,并将L加1;最终对distinct count的估计为内存中不同的值乘以2L。distinct counting是数据库处理中的一个老问题,这种算法的优点是,通过设置合适的参数,可应用于带谓词的查询(即对数据流的一个子集进行distinct counting)。
采样算法的缺点是:它们对异常数据不够敏感。而且,即使它们可以很好的应用于普通的数据流模型,但如果要用于滑动窗口模型(sliding window model)[91] 或n-of-N模型[93],还需要进行较大的修改。
构造略图
构造略图(sketching)是指使用随机映射(Random projections)将数据流投射在一个小的存储空间内作为整个数据流的概要,这个小空间存储的概要数据称为略图,可用于近似回答特定的查询。不同的略图可用于对数据流的不同Lp范数的估算,进而这些Lp范数可用于回答其它类型的查询。如L0范数可用于估算数据流的不同值(distinct count);L1范数可用于计算分位数(quantile)和频繁项(frequent items);L2范数可用于估算自连接的长度等等。
直方图
直方图(histogram)有两个含义:一个是普通意义上的直方图,是一种用于显示近似统计的视觉手段;另外,它还是一种捕捉数据的近似分布的数据结构/方法。作为后者出现时时,直方图是这样构造的:将数据按其属性分到多个不相交的子集(称为桶)并用某种统一的方式近似表示桶中的值[107]。
直方图方法主要用于信号处理、统计、图像处理、计算机视觉和数据库。在数据库领域,直方图原先主要用于选择性估计(selectivity estimation),用于选择查询优化和近似查询处理。直方图是一种最简单、最灵活的近似处理方法,同时也是最有效的一种。只要解决好数据更新问题,就可以将原有的直方图运用到数据流处理中。这类根据新的数据自动调节的直方图被称为动态(或自适应/自调节)直方图。
L. Fu等[108]提出的直方图主要用于中值函数(Median )和其他分位数函数的计算,可用于近似计算,也可用于精确查询。它通过确定性分桶(Deterministic Bucketing )和随机分桶(Randomized Bucketing )技术,构造多个不同精度的桶(buckets),然后将输入数据逐级分到这些桶中,从而完成了动态直方图的构造。
由于将静态直方图直接应用到数据流处理比较困难。S. Guha等[88]虽然可以动态地构造近最优的V-optimal 直方图,但只能应用于时间序列模型(time series model) 下的数据流。
一个常采用的方法是将整个算法分为两步:首先构造一个数据流数据的略图;然后从这个略图中构造合适的直方图。这种方法可以利用略图数据易于更新的特点,又能实现直方图的动态化。N. Thaper等[109]首先是构造一个近似反映数据流数据的略图,利用略图的优良的更新性能来实现数据的更新,然后从这个略图中导出一个直方图来实现对数据流数据的近似。由于从略图中导出最佳的直方图是一个NP-hard问题,作者提供了一个启发式算法(贪婪算法)来搜索一个较佳的直方图。
A. Gilbert等[110]构造了一个概要的数据结构,该结构使用一组与文献[106]中类似的随机和结构来保存不同粒度级别的dyadic interval的值。随后,将不同粒度级别的dyadic interval([111])从大到小地加入所要构造的直方图中,这样就将近似误差降到最低(求精)。
A. Gilbert等在文献[112]中主要考虑的是如何降低对数据流中每个输入数据的处理复杂度。他们先将输入数据转化为小波系数(利用小波系数是信号与基向量的内积),然后采用了与文献[110]类似的dyadic interval处理方法。略图与直方图有很密切的联系,从某种方面来说,可以认为直方图是略图的一种特殊情况。
小波变换
小波变换(wavelet transformation)常用于生成数据的概要信息。这是因为通常小波系数只有很少一部分是重要的,大部分系数或者值很小,或者本身不重要。所以,如果忽略数据经过小波变换后生成的不重要系数,就可以使用很少的空间完成对原数据的近似。
Y. Matias等首先针对数据流数据构造一个直方图,使用小波对其进行模拟。随后保留若干最重要的小波系数实现对直方图的模拟。当新的数据出现时,通过对这些小波系数进行更新以实现直方图的更新。
文献提出的实际上是一种直方图方法,只不过使用了小波变换。A. Gilbert等指出小波变换可以认为是信号与一组正交的长度为N的向量集合所作的内积,因此构造一组数据流数据的略图,由于略图可以相当容易和准确地计算信号与一组向量的内积,则可以从略图计算出小波系数,从而用于点查询和范围查询的估计。