基于Haar + adaboost人脸识别

一.定义
1.特征是像素经过运算后得到的结果,可能是具体值、向量、矩阵、多维;
2.利用特征区分目标的方法:阈值判决;
3.判决是通过机器学习得到的。

二.Haar特征介绍
在这里插入图片描述
Haar特征一共有14种可用的特征模板
在这里插入图片描述
(其中蓝色背景表示所定义的图片,黑白的矩形框表示所用的特征模板)
(公式介绍:第一个公式:特征 = 白色 - 黑色,假设整个图片是100100像素,我们所用的特征模板是1010即100个像素,黑色区域50个像素,白色区域50个像素,则用白色区域的像素值减去黑色区域的像素值,特征 = 白色 - 黑色特征 = 整个区域×权重+黑色×权重这两个公式相同,可化简得到)

在这里插入图片描述
(上图中假设图像是100*100像素,选取的特征是10×10的,则特征框需要从左到右,从上到下遍历一次,且还需要考虑步长,即该特征模板一次滑动几个像素)

在这里插入图片描述
算法解释:假设将特征模板分为四个部分:1、2、3、4。其中A区域表示1,B区域表示1和2,C区域表示1和3,D区域表示1、2、3和4。若我们需要计算4的值:带入公式A-B-C+D=1-1-2-1-3+1+2+3+4=4
该算法的缺点:在计算之前,需要把每个像素点都遍历一次

三. adaboost分类器
在这里插入图片描述
adaboost分类器的结构(分三级:强分类器、弱分类器、node节点)。一个adaboost由若干个强分类器组成,一个强分类器由若干个弱分类器组成,一个弱分类器由若干个Node节点组成。三层紧紧相扣。
1.分类器中各结构的介绍
强分类器:
①工作原理:假设该强分类器有三层,x1,x2,x3为计算得到的检测概率,阈值为t1,t2,t3,当x1>t1,x2>t2,x3>t3时,才认为该目标是我们需要的特征,即连续通过三个强分类器认为是目标
②作用:判决目标是否是特征,如判断目标是否是苹果
③一般规定每层中有15—20个强分类器
弱分类器:
①作用:计算强分类器的特征,即强分类器中的x1,x2,x3是由弱分类器计算得到的,eg.x2 = sum(y1,y2,y3)(PS:y是弱分类器的特征,x是强分类器的特征)
Node节点:
①定义:每一个node节点对应一个haar特征,一般规定有3个haar特征
②工作原理:每一个node节点计算接个都会得到一个z1,z2,z3,则Z = sum(z1,z2,z3)
2.adaboost分类器的工作原理
工作原理:将分类到的正样本逐步减弱,负样本逐步增强,层层迭代,多级分类。比如:一个训练集:苹果,苹果,苹果,香蕉,假设苹果是正样本,香蕉是负样本,第一轮分类后,检测概率分别为0.2,0.2,0.2,0.5,则下次再分类后变为0.1,0.1,0.1,0.8
3.分类器训练终止的条件
①设置迭代的次数
②设置检测概率的阈值
4.工作流程
第三层是Node节点,一般设3个Node节点,每个haar特征对应一个Node节点,会得到z1,z2,z3,则第三层的输出Z = sum(z1,z2,z3);来到第二层弱分类器,设置一个阈值T,当Z > T时,会得到y1,y2,y3,则第二层的输出X = sum(y1,y2,y3);来到第一层强分类器,设置一个阈值T1,若X > T1,则判定该特征是我们所需要的目标。
5.adaboost训练的步骤
①初始化数据权值分布,假设训练样本为:苹果、苹果、苹果、香蕉,对应的权值为:0.1、0.1、0.1、0.1
②遍历阈值 p 计算所有的误差概率,设其中最小误差概率minP,对应的权值为t
③计算权重的系数
④权重分布的更新,第一步中的训练样本的权重变成了:0.2、0.2、0.2、0.7
(若不满足训练的终止条件(迭代次数未达到或minP小于设定的阈值),则从步骤2开始,继续执行)

四. 小案例
步骤:
1.下载xml文件(从官网下载)

在这里插入图片描述
haarcascade_eye文件指训练好了的眼睛识别的adaboost分类器
haarcascade_frontalface_default指训练好了的人脸识别的adaboost分类器
2.下载图像jpg
3.计算haar特征(这步省略,opencv已经处理了),要做的是把图像进行灰度处理,因为所有的haar特征都是需要基于灰度图像进行计算
4.检测:两个参数:眼睛和人脸
5.对检验出来的结果进行遍历,绘制出检测出来的方框
程序:
API:
CascadeClassifier:下载xml文件
detectMultiScale:参数说明:1.灰度图片 2.缩放的系数 3.目标的大小,即检测的人脸不低于5个像素

import cv2
#1.下载xml文件
face_xml = cv2.CascadeClassifier('E:\\pictures\\haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('E:\\pictures\\haarcascade_eye.xml')
#2.下载人脸图像
img = cv2.imread('E:\\pictures\\8.jpg')
cv2.imshow('src',img)
#3.计算Haar特征
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#4.目标检测
faces = face_xml.detectMultiScale(gray,1.3,5)
#参数说明:1.灰度图片 2.缩放的系数 3.目标的大小,即检测的人脸不低于5个像素
print('face=',len(faces)) #打印当前人脸的个数
#5.画识别到的人脸的方框
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #绘制识别人脸的方框
    roi_face = gray[y:y+h,x:x+w] #感兴趣的人脸范围,灰度的人脸
    roi_color = img[y:y+h,x:x+w] #彩色的人脸
    #下面进行人脸上眼睛的识别
    eyes = eye_xml.detectMultiScale(roi_face) #参数为灰度图像
    print('eyes=',len(eyes)) #打印当前眼睛的个数
    #5.画识别到的眼睛的方框
    for (e_x,e_y,e_w,e_h) in eyes:
        cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
cv2.imshow('dst',img)
cv2.waitKey(0)

输出:
在这里插入图片描述

发布了25 篇原创文章 · 获赞 0 · 访问量 442

猜你喜欢

转载自blog.csdn.net/qq_45445740/article/details/104493790