文章目录
- 前言
- 1.环境准备
-
- 1.1Python安装
- 1.2选择Python开发环境
- [1.3 安装必要库. 安装必要的库](#1.3 安装必要库. 安装必要的库)
- [2. 下载人脸特征检测器模型](#2. 下载人脸特征检测器模型)
- [3. 原理介绍](#3. 原理介绍)
- [4. 代码实现](#4. 代码实现)
- [5. 代码解释](#5. 代码解释)
- [6. 运行代码](#6. 运行代码)
- [7. 注意事项](#7. 注意事项)
前言
以下是一份 python人脸检测、人脸识别、活体检测入门学习教程,我们将基于眨眼检测实现一个简单的活体认证示例,帮助你初步了解活体认证的基本原理和实现方法。
1.环境准备
1.1Python安装
访问 Python 官方网站,根据你的操作系统(Windows、Mac 或 Linux)下载并安装 Python 3.x 版本。安装时勾选 "Add Python to PATH",方便在命令行中使用 Python。
Python 3.11安装教程:https://blog.csdn.net/u014164303/article/details/145549489
Python 3.13安装教程:https://blog.csdn.net/u014164303/article/details/146024500
Python 3.11下载地址:https://pan.quark.cn/s/9c44793cb24c
Python 3.13下载地址:https://pan.quark.cn/s/bce37ebd7f70
1.2选择Python开发环境
PyCharm 社区版(免费)或专业版(需付费或申请教育版)。安装完成后,打开 PyCharm,创建一个新的项目,在项目设置中选择之前创建的虚拟环境作为项目的 Python 解释器。PyCharm 功能强大,提供代码自动补全、调试等功能,适合开发大型项目。
Pycharm安装教程:https://blog.csdn.net/u014164303/article/details/145674773
PyCharm下载地址:https://pan.quark.cn/s/5756c8cf8b2a
1.3 安装必要库. 安装必要的库
在开始之前,你需要安装一些 Python 库,主要是opencv-python用于图像处理和摄像头操作,dlib用于人脸检测和特征点提取,以及imutils库来简化一些图像处理操作。可以使用以下命令进行安装:
pip install opencv-python
pip install dlib
pip install imutils
注意,安装dlib可能需要一些编译环境,如果遇到问题可以参考相关文档进行解决。
2. 下载人脸特征检测器模型
dlib 库提供了预训练好的人脸特征检测器模型,你可以从这里下载shape_predictor_68_face_landmarks.dat文件,下载后解压得到模型文件。
shape_predictor_68_face_landmarks.dat下载链接:https://pan.quark.cn/s/9865f7c7ab84
3. 原理介绍
活体认证的一种简单方法是检测人是否有眨眼动作。真实的人会自然地眨眼,而照片或视频通常不会有这个动作。我们可以通过计算眼睛的纵横比(EAR)来判断眼睛是否闭合,当眼睛闭合时 EAR 值会变小。
4. 代码实现
以下是实现眨眼检测进行活体认证的 Python 代码:
c
import cv2
import dlib
from imutils import face_utils
import math
def eye_aspect_ratio(eye):
# 计算眼睛的纵横比
A = math.sqrt((eye[1][0] - eye[5][0]) ** 2 + (eye[1][1] - eye[5][1]) ** 2)
B = math.sqrt((eye[2][0] - eye[4][0]) ** 2 + (eye[2][1] - eye[4][1]) ** 2)
C = math.sqrt((eye[0][0] - eye[3][0]) ** 2 + (eye[0][1] - eye[3][1]) ** 2)
ear = (A + B) / (2.0 * C)
return ear
# 定义眼睛纵横比的阈值
EYE_AR_THRESH = 0.2
# 定义眨眼次数的阈值
EYE_AR_CONSEC_FRAMES = 3
# 初始化眨眼计数器和总眨眼次数
COUNTER = 0
TOTAL = 0
# 加载人脸检测器和特征预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 定义左右眼的特征点索引
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
break
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
rects = detector(gray, 0)
for rect in rects:
# 检测人脸特征点
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# 提取左右眼的特征点
leftEye = shape[lStart:lEnd]
rightEye = shape[rStart:rEnd]
# 计算左右眼的纵横比
leftEAR = eye_aspect_ratio(leftEye)
rightEAR = eye_aspect_ratio(rightEye)
# 计算平均纵横比
ear = (leftEAR + rightEAR) / 2.0
# 绘制眼睛轮廓
leftEyeHull = cv2.convexHull(leftEye)
rightEyeHull = cv2.convexHull(rightEye)
cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)
cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)
# 检查眼睛纵横比是否低于阈值
if ear < EYE_AR_THRESH:
COUNTER += 1
else:
# 如果眼睛闭合的帧数达到阈值,则认为发生了一次眨眼
if COUNTER >= EYE_AR_CONSEC_FRAMES:
TOTAL += 1
# 重置计数器
COUNTER = 0
# 在图像上显示眨眼次数和当前眼睛纵横比
cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# 显示图像
cv2.imshow("Frame", frame)
# 按 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
5. 代码解释
eye_aspect_ratio函数:用于计算眼睛的纵横比(EAR),通过计算眼睛特征点之间的距离来得到。
阈值设置:EYE_AR_THRESH是眼睛纵横比的阈值,当 EAR 低于这个值时认为眼睛闭合;EYE_AR_CONSEC_FRAMES是眼睛闭合的连续帧数阈值,当连续帧数达到这个值时认为发生了一次眨眼。
人脸检测和特征点提取:使用dlib的人脸检测器和特征预测器来检测人脸和提取人脸特征点。
眨眼检测:在每一帧图像中,计算眼睛的 EAR 值,如果 EAR 低于阈值则计数器加 1,当计数器达到阈值时认为发生了一次眨眼。
显示结果:在图像上显示眨眼次数和当前眼睛的 EAR 值。
6. 运行代码
将上述代码保存为liveness_detection.py,并将下载的shape_predictor_68_face_landmarks.dat文件放在同一目录下,然后在终端中运行以下命令:
python liveness_detection.py
运行代码后,会打开摄像头窗口,当你眨眼时,窗口上会显示眨眼次数。
7. 注意事项
这只是一个简单的活体认证示例,实际应用中可能需要更复杂的方法和技术来提高认证的准确性和安全性。
光照条件、人脸姿态等因素可能会影响人脸检测和特征点提取的效果,需要进行适当的处理。