人脸识别实战一一正脸识别

2018年10月15日 科技前沿 69 views

      上篇文章讲解了人脸识别实战系列的图像数据收集,相信很多感兴趣的小伙伴已经迫不及待的想对图片进行“一通操作“了,为了帮助小伙伴顺利开展后续的探索研究(主要是有读者反馈小编新文章产出严重脱更,小编进行了实事求是的自我反省),文章正式进入第二个模块“人脸识别”,带领大家实现识别图像中人物正脸,并在图像中进行脸部区域标注。

       为了帮助大家比较清晰的理解人脸识别过程,小编制作了如下的“通熟易懂“的技术流程图:

具体Python开发过程如下

第一步:数据图像准备

第二步:对之前收集的图像数据进行提取,灰度变换和直方图均衡化处理;

背景知识

灰度变换:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。

直方图均衡化:图像直方图即是通过统计图像各像素值出现的频率,来测算图像的像素值分布情况,描述图像整体的像素对比度。直方图均衡化又称直方图平坦化,实质上是对图像进行非线性拉伸,把原始图的直方图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果

CODE

效果图像

第三步:通过openCV构建CascadeClassifier级联分类模型,分类器类型为正脸检测 haarcascade_frontalface_alt(也可以选择其他不同的对象检测分类器,如眼部的检测、全身检测、上半身检测等)。

背景知识

人脸Haar特征提取、分类:Haar特征分为四类:边缘特征、线性特征、中心特征和对角线特征,将这些特征组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和‘减’去黑色矩形像素和。Haar特征的提取简单说就是通过不断改变模版的大小、位置和类型,白色矩形区域像素和‘减去’黑色矩形区域像素和,以得到每种类型模版的大量子特征。基于大量子特征利用Adaboost算法构建一个决策树强分类器(区分人脸和非人脸)

特征图

分类图

CODE

Haarcascade_frontalface_alt.xml文件内容如下

第四步:确定人脸分类器后,对目标图像进行多尺度、多目标检测,确定最大尺度和最小尺度,输出检测出的、图像中所有的人脸区域。

背景知识(detectMultiScale检测函数、参数介绍:)

多尺度:通常搜索目标的模板尺寸大小是固定的,但是不同图片大小不同,所以目标对象的大小也是不定的,所以多尺度即不断缩放图片大小(缩放到与模板匹配),通过模板滑动窗函数搜索匹配;同一副图片可能在不同尺度下都得到匹配值,所以多尺度检测函数detectMultiscale是多尺度合并的结果。

多目标:通过检测符合模板匹配对象,可得到多个目标,均输出到objects向量里面。

参数1:image--待检测图片,一般为灰度图像加快检测速度;

参数2:objects--被检测物体的矩形框向量组;

参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上;

参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;

参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

CODE

效果图像

第五步:同理选择“haarcascade_eye_tree_eyeglasses.xml”可对佩戴有眼睛的人眼区域进行识别。

CODE

效果图像

下期看点:(同人识别,找出未知图片中人物的姓名)

发表评论

发表评论:

PHONE