opencv活体检测android_仅使用OpenCV实现活体检测!(附源码)

点击上方“小白学视觉”,选择“星标”公众号

重磅干货,第一时间送达

圆栗子 编译整理
量子位 出品 | 公众号 QbitAI

我们先来看一个网络留言

3f5741c97f170a669c9cf4e18de2a2f5.png

 来自虾米妈咪

小朋友用妈妈的一寸照片通过了人脸识别,打击了小度音箱的家长监督机制。

活体检测没做好。

公交车身广告上的董明珠头像,被宁波交警系统拍了照,判定成“违法闯红灯”。

活体检测没做好。

所以,活体检测要怎么做?

名叫Adrian Rosebrock的程序猿,写了份事无巨细的教程,从构建数据集开始,一步步教大家用AI分辨真人和照片,精细到每行代码的用途。

8309c6f2e16f4fc2a3c33fcda5d8b5fc.gif

 川川是假的,光头是真的

这个识别方法,用到了OpenCVKeras,打开摄像头就可以实时检测

重要的是,有源码提供,受到了推特用户的踊跃比心。

活体检测,可以检测些什么?

AI可以用哪些技巧,来区分真人和照片?

一是纹理分析 (Texture Analysis) 。皮肤的纹理特征是重要的依据,给2D照片拍照,比起给3D真人拍照,会损失一些纹理。

二是频率分析 (Frequency Analysis) 。照片脸部的频率组成,也不像真人那样丰富。

三是可变聚焦分析 (Variable focusing Analysis) 。连拍两张照片,聚焦在不同位置,查看像素值 (Pixel Value) 的变化。

四是启发式算法 (Heuristic-Based Algorithms) 。眼动、唇动、眨眼这些动作,照片是不会有的。

五是光流算法 (Optical Flow Algorithms) 。在相邻两帧之间,检测物体运动的方向和幅度,查出2D和3D物体之间的差别。

……

fd41f2933ac8abf4f3390e058087b098.png

不过这里,就把活体检测看成一个粗暴的二分类问题,这些复杂的分析先抛到一边。

自制数据集

程序猿把问题又简化了一下:这里说的“假脸”,只是“屏幕里的人脸”而已。

现在,可以开始造数据集了。

他用手机的前摄像头拍了一段25秒的视频;又举着手机、对着电脑摄像头,把视频播了一遍。

918d55edf215739b5ecc6073762bc80a.gif

这样,一段真人视频,和一段“假脸”视频,就准备好了。

程序猿拍下的这两条视频,都提供下载。不过,他还是建议大家多收集一些数据,不同的人脸,甚至不同的人种,帮助算法茁壮成长。

下一步,要用OpenCV的人脸检测算法处理两段视频,把有用的区域 (ROI) ,就是人脸部分框出来。

这步用了80多行代码,每一行在做些什么,教程里都写清了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值