人脸识别防逃课系统的系统原理及构成
图一 人脸识别防逃课系统的系统原理及构成
本系统采用的是基于肤色似然概率的方法对视频图像序列进行检测,首先对图像进行色彩空间变化,减小光照等因素的影响,然后对图像进行二值化,通过滤波、类肤色区域面积等限制条件检测出人脸位置,用红色矩形标记出人脸,然后就可以对其进行跟踪,利用人脸特征提取算法,将每个训练样本映射到对应的特征空间,得到其特征矩阵。识别时,首先对割取的人脸头像进行归一化,然后用同样的特征提取算法得到其特征矩阵,最后将得到的特征矩阵与数据库中的人脸特征矩阵进行比较,得出识别结果。
一
人脸检测
(1)基于知识的方法
这种方法要求掌握人脸的先验知识,根据这些知识找出相应的规律来对人脸进行检测。
(2)基于统计的方法
利用人脸的整体特征,运用统计学的原理找到人脸的一些整体分布规律。
(3)基于模板的方法
该方法的思想就是建立一个人脸模板,然后在图像中搜索与模板匹配的区域,就视为人脸区域。
(4)基于肤色的方法
由于本系统是基于固定场所下的视频监控,虽然光照会有变化,但总的来说变化不是很大,因此本系统采取基于肤色的人脸检测。
本文主要采用了基于肤色的人脸检测。其具体步骤如下所示
1预处理
基于肤色的人脸检测首先要对输入图像进行预处理,常见的方法有直方图均衡化和灰度世界假设算法。其程序代码如下
直方图均衡化程序
a=imread('C:\Users\zhangyang\Desktop\zhangyang.jpg');%读取图像
b=rgb2gray(a);
%转化为灰度图像
imshow(b);
%显示原图
c=histeq(b);
%直方图均衡
subplot(121),imshow(a);
title('原图像')
subplot(122),imshow(c);
title('直方图均衡化后的图像')
效果如图二
图二直方图均衡化前后的图像
灰度世界假设算法
img=imread('C:\Users\zhangyang\Desktop\zhangyang.jpg');
figure
imshow(img)
img_r=img(:,:,1);
img_g=img(:,:,2);
img_b=img(:,:,3);
[m,n]=size(img_r);
%Rave=sum(sum(img_r));
%Rave=Rave/(m*n);
%Gave=sum(sum(img_g));
%Gave=Gave/(m*n);
�ve=sum(sum(img_b));
�ve=Bave/(m*n);
Rave=mean(mean(img_r));
Gave=mean(mean(img_g));
Bave=mean(mean(img_b));
Kave=(Rave+Gave+Bave)/3;
img_R=(Kave/Rave)*img_r;img_G=(Kave/Gave)*img_g;img_B=(Kave/Bave)*img_b;
figure
img_gw=cat(3,img_R,img_G,img_B);
imshow(img_gw);
imwrite(img_gw,'awb_gw','bmp');
title('经过灰度世界假设算法处理后')
图三
'经过灰度世界假设算法处理
(2)肤色似然概率
不同肤色的人脸图像在色度空间中呈现着聚类特性,其模型可以用高斯模型来表示,根据这个模型可以构造一个肤色似然概率函数。从而设计算法,编写程序
肤色似然概率程序
x=imread('C:\Users\zhangyang\Desktop\huidu.jpg');
y=rgb2ycbcr(x);
[a b c]=size(y);
cb=double(y(:,:,2));
cr=double(y(:,:,3));
for i=1:a;
for j=1:b
w=[cb(i,j) cr(i,j)];
m=[117.4316 148.5599];
n=[260.1301 12.1430;12.1430 150.4574];
p(i,j)=exp((-0.5)*(w-m)*inv(n)*(w-m)');
end
end
z=p./max(max(p));%------------肤色肤色似然概率complextion
probability
imshow(z);
title('皮肤似然图像')
%figure; imshow(x);
图三
经过皮肤似然处理后的图像
(3)二值化与滤波
一幅图是从0-255的,为了选取目标,有所有的颜色,而我感兴趣的只是其中的一种颜
色,那就把其他颜色变为0,我感兴趣的颜色范围定为1,这样就去掉了我不关心的,后续只需对感兴趣的再进行处理,这就算二值化。
对图像进行二值化后,由于噪声和背景因素的存在,会出现很多孤立的噪声点或孤立的小块区域,为了减小这些噪声点对后续人脸提取造成的影响,需要对图像进行一些去噪处理。这就是滤波。
%二值化处理;
th=0.5; for i=1:a
for j=1:b
if(z(i,j)>th)
z(i,j)=1;
else
z(i,j)=0;
end
end
end
figure;imshow(z);title('二值化后的图片')%-----------------------二值化处理的阀值threshold
%滤波处理
se=strel('square',3);
f=imopen(z,se);
f=imclose(f,se); %figure,imshow(f);%open and close
processing;
f=imfill(f,'holes'); %figure,imshow(f);%fill holes in the
Img
se1=strel('square',8);
f=imerode(f,se1);
f=imdilate(f,se1);
figure
imshow(f);
title('滤波后的图片')%---------------------------------------------------erosion
and expansion;
图四
二值化后的图片
图五
滤波后的图片
(4)存在人脸?
1)根据皮肤面积占有率来大致划分人脸区域。
2)由于人脸有眼睛、嘴巴和眉毛等器官的存在,人脸区域内部会有很多孔洞存在,因此可以根据这个特征来判断人脸区域,如果肤色区域内一个孔洞都没有,则可以直接排除掉,反之则可以保留。
3)根据人脸的长宽比,这个比值接近于
1,在填充肤色区域内部的孔洞之后,可以通过寻找区域的边界来确定肤色区域的长和宽,高和宽的比率低于 0.8 的为非人脸,较好的上限值约为
1.6,但某些情况下,人的脖子和下面的皮肤没有遮盖的情况下,其比例可能会超过1.6,这种情况不能直接去除该区域,可以根据该肤色区域孔洞的数量来判断是否为人脸。我们选这种方法编程。
%检测是否存在人脸
[L,num]=bwlabel(f,4);
for i=1:num;%region loop;
[r,c]=find(L==i);
len=max(r)-min(r)+1;
wid=max(c)-min(c)+1;
area_sq=len*wid;
area=size(r,1);
for j=1:size(r,1)%pixel loop;
if(len/wid<.8>
(len/wid>2.4)
size(r,1)<200
area/area_sq<0.55
L(r(j),c(j))=0;%not zero pixel =0;
else
continue;
end
end
end
figure;imshow(L);
title('人脸区域')%---------------------------------eliminate NOT
face rengion;
w=L&z;
figure;
imshow(w);
title('恢复人脸区域')%---------------------------recover the features
of face
图六
人脸区域
图七
恢复人脸区域
二 人脸跟踪
(1)帧差法
帧差法是用相邻帧的像素值或梯度值相减来实现目标位置的跟踪定位。
(2 )光流法
光流法是将具有一致运动状态的像素点和特征组织在一起,目的是找到运动目标的速度量场,包括两个分量:u 和
v,分别表示运动目标的速度矢量在x 和 y 两个方向的分量。(3 )卡尔曼滤波法
卡尔曼滤波器是由卡尔曼提出的用于线性时变系统的递归滤波器,它在目标跟踪领域有着广泛的应用,它能从一系列的对目标位置的观测序列中预测出目标的位置坐标和速度。
对于检测出的肤色区域,可以分别通过计算其质心和倾斜角来定位人脸位置,通过这两个算法编程得到如图八结果
%定位跟踪人脸
[r c]=find(L~=0);
r_min=min(r);
r_max=max(r);
c_min=min(c);
c_max=max(c);
figure;
imshow(x);
hold on
%plot(round(.5*(c_max+c_min)),round(.5*(r_max+r_min)),'+')
flg=0;
for
i=round(.5*(r_min+r_max)):-1:round(1/3*(r_max-r_min)+r_min)
for
j=round(.5*(c_max+c_min)):-1:round(1/3*(c_max-c_min)+c_min)
if(w(i,round(j))==0)
flg=1;
break;
end
end
if(flg==1),
break,
end
end
w(i,j)
if(w(i,j)==0)
e1_x=j;
e1_y=i;
%plot(j,i,'*')%--------------------------------------------------------Note
left eye
flg=0;
for
i=round(.5*(r_min+r_max)):-1:round(1/3*(r_max-r_min)+r_min)
for
j=round(.5*(c_max+c_min)):round(2.2/3*(c_max-c_min)+c_min)
if(w(i,j)==0)
flg=1;
break;
end
end
if(flg==1)
break,
end;
end
w(i,j)
e2_x=j;
e2_y=i;
%plot(j,i,'*')%--------------------------------------------------------Note
right eye
for
i=round(1/2*(r_max+r_min)):round(r_min+2/3*(r_max-r_min))
if(w(round(i),round(.5*(c_max+c_min)))==0),
break,
end
end
w(i,round(.5*(c_max+c_min)))
m_x=.5*(c_max+c_min);m_y=i;
%plot(round(.5*(c_max+c_min)),i,'*')%-----------------------------------------Note
mouth
ox=(e1_x+e2_x+m_x)/3;
oy=(e1_y+e2_y-e1_x+e2_x)/2;
a=2*(e2_x-e1_x);c=(e1_y+e2_y)/2-m_y;b=(a*a-c*c)^0.5;
t=0:.01:2*pi;
x=ox+.65*b*cos(t);y=oy+.8*a*sin(t);
plot(x,y,'.')
else
rectangle('Position',[c_min r_min c_max-c_min
r_max-r_min],'EdgeColor','r');
title('定位并跟踪人脸')%---------------------------------------------test
the face region
end
图八
定位并跟踪人脸
三 人脸的特征提取
(1) 几何特征
通过记录人脸中一系列的具体特征点的位置以及它们之间的角度、距离等位置关系来实现特征提取。
(2)特征子空间表示法
利用人脸的统计特性,将人脸图像看成是一维的高维向量,然后求其协方差矩阵的特征值,取前
m个较大特征值对应的特征向量作为投影向量矩阵,对每个人脸通过投影就得到该子空间中的人脸图像。
优点:通过将人脸高维向量映射到低维空间中的特征脸具有很好的个体特征,对人脸面部肌肉变化以及姿态的变化具有较好的鲁棒性,而且提取过程简单,不需要人工干预
四 人脸识别
基于主成分析(PCA)的人脸识别
(1)PCA方法的原理
其基本思想是找出一个特征子空间,通过一个投影矩阵使目标在该子空间中的投影具有大的区分度。它的提出来源于 KL
变换,通过线性变换寻找一组最大的单位正交向量基,并用它们来对目标进行重建,使重建后的样本和原来的样本的误差达到足够小。
(2)PCA 人脸识别算法
前面我们求得了拍摄的人脸的投影矩阵,然后用同样的方法对数据库里存储的照片求投影矩阵,最后相互对比,判断属于哪一个人。如此就完成了人脸识别!
基于人脸识别的防逃课系统产品发布会