人脸识别分为哪几类的?可分为两种。
一是静态人脸识别:指被识别人,处于静态状态或配合状态下,采集其人脸图像,进行图像识别,此类需要当事人的配合,一般会暂用当事人1-2秒的时间,此部分适合应用于对时间不敏感或者对采集人脸不反感的场所,例如:人脸门禁、身份识读,考勤打卡,网吧身份证核查,访客登记等场合;
二是动态人脸识别:指被识别的人,处于移动状态或者步行等非配合情况下,采集其人脸视频,进行人脸识别,此类不需要当事人配合,因此引用当事人无感场所,例如:车站、机场、码头等人流集中地,实现重点人脸管控,防患于未然。
人脸识别在我们生活中的应用越来越广泛。
你可以扫脸解锁手机,扫脸支付,可以扫脸开门,人脸变成了一个人非常重要的生物信息。 现在人脸识别技术发展愈加成熟,应用领域也越来越泛,比如云脉人脸识别系统可应用在以下场景:
在开始讲解人脸检测之前,先帮大家解析经常被搞混的两个概念:人脸检测 vs 人脸识别
。注意!! 大家经常会搞混的概念。
分清楚这两个概念的不同,简单来讲,他们的核心区别在于:
哪有脸?人脸检测 (是在图像中定位人脸区域的过程)
脸是谁?人脸识别 (分类检测这个脸是谁)
一种是把人脸检测获得的人脸区域,在已知人脸库进行比对;
另外一种是针对人脸图像特征,提取特征值。特征值数组 用来标识人脸信息。
后者更实用。
从顺序来讲,先进行人脸检测,然后再进行人脸识别。
那我们今天就先来讲讲如何使用OpenCV进行人脸检测。
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
代表矩形的高度。
从图片中读入图片,识别人脸,并在图片中标识人脸所在的矩形区域。
人脸识别v2版的效果演示, 里面用到了两个HaarCascade模型, 一个是识别人脸的模型, 另外一个是识别眼睛的模型。
人脸识别v1的代码里面核心三个主要模块 :HighGUI 上位机部分, Draw 绘图模块, CascadeClassifier 级联分类器。
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()
**