吴建平 詹桢 邓鑫
摘 要:文章基于YCbCr色彩空间理论,建立二维高斯模型将样本图片转换成肤色似然图,并对其进行腐蚀、膨胀处理,得到人脸区域;将训练好的弱分类器组成强分类器,进一步组成级联分类器,结合Adaboost算法,最终确认样本图片的人脸区域。
关键词:人脸识别;YCbCr色彩模型;Adaboost算法;人脸肤色区域
中图分类号:TP391.41 文献标志码:A 文章编号:2095-2945(2020)25-0040-03
Abstract: Based on the YCbCr color space theory, this paper establishes a two-dimensional Gaussian Model to transform the sample image into a skin color likelihood image, and then corrodes and expands it to get the face region; the trained weak classifier is composed of a strong classifier to form a cascade classifier, and combined with the Adaboost algorithm, the face region of the sample image is finally confirmed.
Keywords: face recognition; YCbCr color model; Adaboost algorithm; facial skin color region
1 需要解决的问题
本文研究的问题来源于2018年第十一届华中地区数学建模邀请赛A题:通过运用所学知识建立人脸位置判断的数学模型,判断出人脸在照片中的大致位置,并在图片中用拟设计的模型“框出”人脸的大致位置。
2 YCbCr色彩空间理论介绍
2.1 YCbCr色彩空间理论[1]
YCbCr色彩空间是ITU-RBT.601的一部分,YCbCr或Y'CbCr颜色空间通常用于胶片或数码摄影系统的连续图像处理。实际上YCbCr是YUV的一个缩放版本。YCbCr和YUV中的Y有着相同的含义。其中Y表示亮度(luma)分量(灰度值),Cb表示蓝色色度分量,Cr表示红色色度分量。
2.2 肤色检测[2]
肤色是人脸先天存在的特征,将肤色作为人脸检测的出发点是最直接的方式。在人脸图像中,肤色一般是相对集中且稳定的具有一定程度聚类性质的连通区域,同时根据研究表明,虽然人存在年龄、种族以及性别的差别,但将人脸经过灰度化处理后其差异主要表现在亮度上,因此,肤色检测是人脸检测极好的手段,但要想获得在图像空间中的肤色,就需要通过肤色检测和肤色分割来实现,进而才能进一步检测出人脸在图像中存在的区域。人脸检测实现的基本流程图如图1。
3 建立模型求解
3.1 颜色空间和肤色模型
3.2 Adaboost算法具体步骤
Adaboost是一种迭代算法[5-6],同样也是级连算法,它的基本思想是将整个训练集分成许多不同训练的弱分类器,当分类器分类正确的时候,减小分类器的权值,当分类器分类错误时,需要对分类器增加权值。当多个弱分类器能够正确分类时,将其组成强分类器,最后将强分类器串联成一个级联分类器,该训练好的级联分类器便可用于人脸检测。Adaboost算法中弱分类器的训练过程具体如下:
3.2.1 设训练样本(x1,y1),(x2,y2),…,(xn,yn),其中yi=1表示训练样本图像是人脸,也就是正样本,而yi=0表示训练样本图片为非人脸,也就是负样本。设训练样本图片中人脸正样本的个数为n1,非人脸的负样本的个数为n2。
3.2.2 在训练过程中,需要对弱分类器进行权重初始化,当第i个弱分类器對第j个样本分类出现错误时,则增大第j个样本在后续分类器中的权重。其权重初始化为:
3.2.3 设共需从原有的N个分类器中选择T个弱分类器,用t来进行当前弱分类器的技术,则t=1,2,…,T;第t轮的最佳弱分类器为:
(1)权重归一化。(2)弱分类器训练。(3)最佳弱分类器选取。(4)权重更新。
3.2.4 训练器在经过T轮训练后,很大程度上可以获得T个最佳分类器,其中,因每5个弱分类器在训练中或正确的情况不同,因而有不同的权重,所有每个弱分类器都有其对应的特征、阈值和方向指示符。最后,通过线性加权出错将弱分类器合成强分类器:
3.3 模型求解结果
借助Matlab计算工具,编写人脸检测的代码,识别结果如图2、3、4、5所示。
Matlab人脸检测部分程序:
close;
clear all;
clc;
M = [124.2125 132.9449]' ; %肤色均值
Sigma =[75.3881 40.2587 40.2587 250.2942];%肤色方差
Img = imread('xjpic.jpg');
figure,imshow(Img),title('原始图像');
Img2 = rgb2ycbcr(Img);%颜色空间转换
% figure,imshow(Img2(:,:,1));title('Y');