【计算机视觉40例】案例31:FisherFaces人脸识别

导读】本文是专栏《计算机视觉40例简介》的第31个案例《FisherFaces人脸识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例31】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第26章《人脸识别》以获取更详细信息。

Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。线性判别识别最早由Fisher在1936年提出,是一种经典的线性学习方法,也被称为“Fisher判别分析法”。

线性判别分析在对特征降维的同时考虑类别信息。其思路是:在低维表示下,相同的类应该紧密地聚集在一起;不同的类别应该尽可能地分散开,并且它们之间的距离尽可能地远。简单地说,线性判别分析就是要尽力满足以下两个要求:

  1. 类别间的差别尽可能地大。
  2. 类别内的差别尽可能地小。

做线性判别分析时,首先将训练样本集投影到一条直线A上,让投影后的点满足:

  1. 同类间的点尽可能地靠近。
  2. 异类间的点尽可能地远离。

做完投影后,将待测样本投影到直线A上,根据投影点的位置判定样本的类别,就完成了识别。

例如,图1所示的是一组训练样本集。现在需要找到一条直线,让所有的训练样本满足:同类间的距离最近,异类间的距离最远。

 

1  训练样本集

图2的左图和右图中分别有两条不同的投影线L1和L2,将图1中的样本分别投影到这两条线上,可以看到样本集在L2上的投影效果要好于在L1上的投影效果。

 

图2 投影示例

线性判别分析就是要找到一条最优的投影线。以图2中右图投影为例,要满足:

  1. B组内的点之间尽可能地靠近
  2. C 的两个端点之间的距离(类间距离)尽可能地远

找到一条这样的直线后,如果要判断某个待测样本的分组,可以直接将该样本点向投影线投影,然后根据投影点的位置来判断其所属类别。

例如,在图3中,三角形样本点U向投影线投影后,其投影点落在圆点的投影范围内,则认为待测样本点U属于圆点所在的分类。

 

3  判断样本点的分类

在OpenCV中,通过函数cv2.face.FisherFaceRecognizer_create()生成Fisherfaces识别器实例模型,然后应用函数cv2.face_FaceRecognizer.train()完成训练,用函数cv2.face_FaceRecognizer.predict()完成人脸识别。

在使用FisherFaces模块完成人脸识别时,其流程如图4所示。

 

4  人脸识别流程

【例】使用FisherFaces完成一个简单的人脸识别程序。

本例中用于学习的4幅人脸图像如图5所示,它们的名称从左至右分别为f01.png、f02.png、f11.png、f12.png。

   

 

5  用于训练的人脸图像

这4幅图像中,前两幅图像是同一个人,将其标签设定为“0”;后两幅图像是同一个人,将其标签设定为“1”。

待识别的人脸图像如图6所示,该图像的名称为fTest.png。

 

6  待识别人脸图像

核心代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 29 21:33:03 2018

@author: 李立宗  lilizong@gmail.com
微信公众号:计算机视觉之光(微信号cvlight)
计算机视觉40例——从入门到深度学习(OpenCV-Python)
李立宗 著     电子工业出版社
"""


# 读取训练图像
images=[]
images.append(cv2.imread("f01.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f02.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f11.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f12.png",cv2.IMREAD_GRAYSCALE))
# 给训练图像贴标签
labels=[0,0,1,1]
# 读取待识别图像
predict_image=cv2.imread("fTest.png",cv2.IMREAD_GRAYSCALE)
# 识别
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels)) 
label,confidence= recognizer.predict(predict_image) 


运行程序,识别结果为:

识别标签label= 0

置信度confidence= 92.5647623298737

从输出结果可以看到,fTest.png被识别为标签“0”所对应的人脸图像,即认为人脸图像fTest.png与图像f01.png、f02.png所表示的是同一个人。

在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书中,从算法原理、实现流程等角度系统深入地介绍了该案例的理论基础和实现过程,并对具体的代码实现进行了细致的介绍与解释。欢迎大家阅读第26章《人脸识别》获取详细内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值