3d人脸识别算法opencv_活体检测很复杂?仅使用opencv就能实现!(附源码)

摘要: 活体检测在各行各业应用比较广泛,如何实现一个活体检测系统呢?早期实现很困难,现在仅使用opencv即可实现,快来尝试一下吧。

81cc006bad7d46c2a25460b9cc344f7e

什么是活体检测,为什么需要它?

随着时代的发展,人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等,人脸识别系统正在各行各业得到应用。然而,人脸识别系统很容易被“非真实”的面孔所欺骗。比如将人的照片放在人脸识别相机,就可以骗过人脸识别系统,让其识别为人脸。

为了使人脸识别系统更安全,我们不仅要识别出人脸,还需要能够检测其是否为真实面部,这就要用到活体检测了。

da84dee42579969f1313551d4dff38ab.png

图1:左边的是真实脸,右边是假脸

目前有许多活体检测方法,包括:

  • 纹理分析(Texture analysis),包括计算面部区域上的局部二进制模式(LBP)并使用SVM将面部分类为真脸或假脸;
  • 频率分析(Frequency analysis),例如检查面部的傅里叶域;
  • 可变聚焦分析(ariable focusing analysis),例如检查两个连续帧之间的像素值的变化。
  • 基于启发式的算法(Heuristic-based algorithms),包括眼球运动、嘴唇运动和眨眼检测;
  • 光流算法(Optical Flow algorithms),即检查从3D对象和2D平面生成的光流的差异和属性;
  • 3D脸部形状,类似于Apple的iPhone脸部识别系统所使用的脸部形状,使脸部识别系统能够区分真人脸部和其他人的打印输出的照片图像;

面部识别系统工程师可以组合上述方法挑选和选择适合于其特定应用的活体检测模型。但本教程将采用图像处理中常用方法——卷积神经网络(CNN)来构建一个能够区分真实面部和假面部的深度神经网络(称之为“LivenessNet”网络),将活体检测视为二元分类问题。

首先检查一下数据集。

活动检测视频

7a31e03a5b845e766c3aecb355f45cfa.gif

图2:收集真实与虚假/欺骗面孔的示例

为了让例子更加简单明了,本文构建的活体检测器将侧重于区分真实面孔与屏幕上的欺骗面孔。且该算法可以很容易地扩展到其他类型的欺骗面孔,包括打印输出、高分辨率打印等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
活体检测技术是一种基于人脸识别技术的生物特征识别技术,可以判断被识别者是否为真实的活体。虽然活体检测技术较为复杂,但是在使用OpenCV的情况下,也可以实现基础的活体检测。以下是一个使用OpenCV实现活体检测的Python示例代码: ``` import cv2 import numpy as np def get_landmarks(image, rects): landmarks = [] for rect in rects: shape = predictor(image, rect) shape = face_utils.shape_to_np(shape) landmarks.append(shape) return landmarks def get_face_area(rects): areas = [] for rect in rects: areas.append(rect.width() * rect.height()) return areas def is_real_face(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) rects = detector(gray, 0) if len(rects) == 0: return False landmarks = get_landmarks(gray, rects) areas = get_face_area(rects) max_face_idx = np.argmax(areas) max_face = rects[max_face_idx] max_landmarks = landmarks[max_face_idx] is_real = False if len(max_landmarks) == 68: left_eye = max_landmarks[36:42] right_eye = max_landmarks[42:48] mouth = max_landmarks[48:68] left_eye_hull = cv2.convexHull(left_eye) right_eye_hull = cv2.convexHull(right_eye) mouth_hull = cv2.convexHull(mouth) cv2.drawContours(image, [left_eye_hull], -1, (0, 255, 0), 1) cv2.drawContours(image, [right_eye_hull], -1, (0, 255, 0), 1) cv2.drawContours(image, [mouth_hull], -1, (0, 255, 0), 1) ear_left = get_eye_aspect_ratio(left_eye) ear_right = get_eye_aspect_ratio(right_eye) mar = get_mouth_aspect_ratio(mouth) if ear_left > EAR_THRESH or ear_right > EAR_THRESH or mar < MAR_THRESH: is_real = True return is_real ``` 该代码利用了OpenCV库提供的人脸检测、特征点定位、轮廓绘制等功能,实现了一个简单的活体检测功能。其中,主要的算法包括: 1. 使用人脸检测器检测人脸,并获取人脸特征点; 2. 利用特征点计算眼睛和嘴巴的长宽比,判断是否为真实人脸。 需要注意的是,该算法只是一个基础的活体检测算法,可能存在一定的误判率。在实际应用中,需要根据具体情况进行优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值