python之人脸检测与识别初探

在这里插入图片描述

人脸检测的种类

人脸识别分为哪几类的?可分为两种。
一是静态人脸识别:指被识别人,处于静态状态或配合状态下,采集其人脸图像,进行图像识别,此类需要当事人的配合,一般会暂用当事人1-2秒的时间,此部分适合应用于对时间不敏感或者对采集人脸不反感的场所,例如:人脸门禁、身份识读,考勤打卡,网吧身份证核查,访客登记等场合;

二是动态人脸识别:指被识别的人,处于移动状态或者步行等非配合情况下,采集其人脸视频,进行人脸识别,此类不需要当事人配合,因此引用当事人无感场所,例如:车站、机场、码头等人流集中地,实现重点人脸管控,防患于未然。

人脸检测在生活中的应用

人脸识别在我们生活中的应用越来越广泛。
在这里插入图片描述
你可以扫脸解锁手机,扫脸支付,可以扫脸开门,人脸变成了一个人非常重要的生物信息。 现在人脸识别技术发展愈加成熟,应用领域也越来越泛,比如云脉人脸识别系统可应用在以下场景:

  1. 企业、住宅安全和管理:如人脸识别门禁考勤系统,人脸识别防盗门等。
  2. 电子护照及身份证:中国的电子护照计划公安部一所正在加紧规划和实施。
  3. 公安、司法和刑侦:如利用人脸识别系统和网络,在全国范围内搜捕逃犯。
  4. 自助服务:如自助实名认证,自助远程开户等。
  5. 信息安全:如计算机登录、电子政务和电子商务。

人脸检测与人脸识别

在这里插入图片描述
在开始讲解人脸检测之前,先帮大家解析经常被搞混的两个概念:人脸检测 vs 人脸识别。注意!! 大家经常会搞混的概念。
分清楚这两个概念的不同,简单来讲,他们的核心区别在于:

  1. 哪有脸?人脸检测 (是在图像中定位人脸区域的过程)

  2. 脸是谁?人脸识别 (分类检测这个脸是谁)

一种是把人脸检测获得的人脸区域,在已知人脸库进行比对

另外一种是针对人脸图像特征,提取特征值。特征值数组 用来标识人脸信息。

后者更实用。

从顺序来讲,先进行人脸检测,然后再进行人脸识别

那我们今天就先来讲讲如何使用OpenCV进行人脸检测。

如何使用OpenCV进行人脸检测

关于HaarCascade

OpenCV中人脸识别是通过Haar特征的级联分类器实现,在这里暂不涉及太多底层算法原理部分的讲解。

实际上OpenCV里面有很多预先训练好的HaarCascade模型(XML文件) , 例如正脸检测, 眼睛检测, 全身检测,下半身检测等。
在这里插入图片描述
在OpenCV的两个代码仓库里面都有。

数据1: opencv/data/cascades
在这里插入图片描述
数据2: opencv_contrib/modules/face/data/cascades
在这里插入图片描述

级联分类器的使用方法

通过FaceCascade模型, 输入图片, 我们可以获取人脸所在区域的矩形位置。
在这里插入图片描述
模型的使用方法比较简单, 首先要载入对应的HaarCascade文件, 文件格式为xml。 这里为了方便大家使用, 我已经将文件下载到了haar文件夹下, 可以通过相对路径进行引用。

├── FaceDetection-v1.py
├── FaceDetection-v2.py
├── face.mp4
├── face.png
├── haar
    ├── haarcascade_eye.xml
    └── haarcascade_frontalface_default.xml

在这里插入图片描述
我们在CascadeClassifier中传入对应HaarCascade文件

# 载入人脸检测的Cascade模型
FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')

输入 Input

接下来就是将图片的灰度图传入到这个FaceCascade模型中, 进行人脸检测。

# 检测画面中的人脸
faces = FaceCascade.detectMultiScale(gray)

输出 Output
返回的faces是人脸所在区域的ROI数组, 例如:

[(x1, y1, w1, h1), (x2, y2, w2, h2)]

当然, 你可以设定不同的参数,例如设定缩放因子, 设置最小邻居阈值。

# 检测画面中的人脸
faces = FaceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5
) 

参数的具体含义与使用方法见OpenCV的官方API文档 :

OpenCV官方文档: cascadeclassifier-detectmultiscale
在这里插入图片描述
ROI 的全称是Region Of Interest , 用于表示在画面的子区域。整个画面的原点(0,0) , 在整个画面中的左上角。 ROI 本质上是Tuple类型的数据,其中(x,y)代表人脸所在矩形区域的左上角坐标, w 代表矩形的宽度, h代表矩形的高度。

人脸检测的效果演示

人脸检测-V1

从图片中读入图片,识别人脸,并在图片中标识人脸所在的矩形区域。
在这里插入图片描述

人脸检测-V2

人脸识别v2版的效果演示, 里面用到了两个HaarCascade模型, 一个是识别人脸的模型, 另外一个是识别眼睛的模型。
在这里插入图片描述

程序流程讲解

人脸识别v1的代码里面核心三个主要模块 :HighGUI 上位机部分Draw 绘图模块CascadeClassifier 级联分类器

程序大致的流程如下:
在这里插入图片描述

  1. HighGUI 读入图片, 并转换为灰度图
  2. CascadeClassifier 载入 人脸检测的级联模型(xml)文件
  3. CascadeClassifier 使用模型检测灰度图中的人脸,返回faces
  4. Draw 遍历faces,在彩图上绘制人脸的矩形区域
  5. HighGUI创建一个窗口叫做Face
  6. HighGUI 在窗口Face中展示图像(绘制人脸矩形区域后的)
  7. HighGUI 等待任意按键按下
  8. HighGUI 退出程序,关闭所有的窗口

FaceDetection-v1.py

# -*- coding:utf-8 -*-
'''
人脸识别FaceDetection
通过HaarCascade模型,进行人脸识别与眼睛识别,在视频流中绘制矩形,标识人脸
'''
import cv2

# 设置图片路径
img_path = 'face.png'
# 载入带有人脸的图片
img = cv2.imread(img_path)
if img is None:
    # 判断图片是否读入正确
    print("ERROR:请检查图片路径")
    exit(1)
# 将彩色图片转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


# 载入人脸检测的Cascade模型
FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')

# 检测画面中的人脸
faces = FaceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5
)

# 遍历返回的face数组
for face in faces:
    # 解析tuple类型的face位置数据
    # (x, y): 左上角坐标值
    # w: 人脸矩形区域的宽度
    # h: 人脸矩形区域的高度
    (x, y, w, h) = face
    # 在原彩图上绘制矩形
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 4)

# 创建一个窗口 名字叫做Face
cv2.namedWindow('Face',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)

# 在窗口Face上面展示图片img
cv2.imshow('Face', img)
# 等待任意按键按下
cv2.waitKey(0)
# 关闭所有的窗口
cv2.destroyAllWindows()

如何提高人脸识别的速度?

**

  1. 缩小检索范围, 在上一帧人脸所在矩形周围寻找。
  2. 缩放,在低分辨率下检索,然后逐步精确位置。

猜你喜欢

转载自blog.csdn.net/ywsydwsbn/article/details/107714830
今日推荐