RGB简单人脸活体检测(Liveness Detection)

news2025/5/22 10:18:11

参考:
https://github.com/minivision-ai/Silent-Face-Anti-Spoofing(主要这个库)
https://github.com/computervisioneng/face-attendance-system(使用案例)

##概念: 活体检测是指针对人脸识别过程中的人脸做进一步的检测,确定要识别的对象是否是是真人。目前攻击人脸识别系统的方式可以总结为三大类,一是照片类,二是视频类、三是面具类,这三类中面具类是最难解决的攻击方式,主要由于其真实度与真人比较接近。目前主流的活体检测方案可以划分为三类,一是基于二维平面RGB相机的活体检测方案、二是基于红外IR相机的活体检测方案,三是基于三维深度相机的活体检测方案。

二维平面的RGB相机活体检测方案主要是基于深度学习实现的方案较为有效,红外IR相机的活体检测方案不仅可结合二维图形的特点,还能结合红外热成像的特点进行活体检测,比如视频类人脸在红外IR相机上是不呈像的,基于三维深度相机的活体检测方案对照片和视频类都有很好的活体检测效果,但对于三维的面具就比较吃力,需要在算法方面进行改进。

代码

https://github.com/minivision-ai/Silent-Face-Anti-Spoofing 下载下来稍微改下可以摄像头测试,模型放在./resources/anti_spoof_models 活体检测的融合模型;直接测试

python test.py --image_name your_image_name

增加camrea.py 摄像头代码,另外test.py稍微修改下

在这里插入图片描述

camrea.py(直接运行这个文件,就可以摄像头检测)

import cv2
from test import test


# Start video capture
cap = cv2.VideoCapture(0) # By default webcam is index 0

# Load gesture recognition class
# gest = GestureRecognition(mode='eval')

counter = 0
while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break

    label,value,image_bbox = test(
                image_name=img,
                model_dir=r'E:\Silent-Face-Anti-Spoofing-master\Silent-Face-Anti-Spoofing-master\resources\anti_spoof_models',
                device_id=0
                )

    if label == 1:
        print("Image is Real Face. Score: {:.2f}.".format( value))
        result_text = "RealFace Score: {:.2f}".format(value)
        color = (255, 0, 0)
    else:
        print("Image is Fake Face. Score: {:.2f}.".format( value))
        result_text = "FakeFace Score: {:.2f}".format(value)
        color = (0, 0, 255)

    # print("Prediction cost {:.2f} s".format(test_speed))
    cv2.rectangle(
        img,
        (image_bbox[0], image_bbox[1]),
        (image_bbox[0] + image_bbox[2], image_bbox[1] + image_bbox[3]),
        color, 2)
    cv2.putText(
        img,
        result_text,
        (image_bbox[0], image_bbox[1] - 5),
       ## cv2.FONT_HERSHEY_COMPLEX, 0.5*img.shape[0]/1024, color)
        cv2.FONT_HERSHEY_COMPLEX, 1, color)
    
    cv2.imshow('frame', img)

    key = cv2.waitKey(1)
    if key==27:
        break


cap.release()

test.py 这个函数修改下简单


def test(image_name, model_dir, device_id):
    model_test = AntiSpoofPredict(device_id)
    image_cropper = CropImage()
    print(image_name.shape)
    #image = cv2.imread(SAMPLE_IMAGE_PATH + image_name)
    #image = cv2.imread(image_name)
    #result = check_image(image)
    #if result is False:
    #    return
    image = image_name
    image_bbox = model_test.get_bbox(image)
    prediction = np.zeros((1, 3))
    test_speed = 0
    # sum the prediction from single model's result
    for model_name in os.listdir(model_dir):
        h_input, w_input, model_type, scale = parse_model_name(model_name)
        param = {
            "org_img": image,
            "bbox": image_bbox,
            "scale": scale,
            "out_w": w_input,
            "out_h": h_input,
            "crop": True,
        }
        if scale is None:
            param["crop"] = False
        img = image_cropper.crop(**param)
        start = time.time()
        prediction += model_test.predict(img, os.path.join(model_dir, model_name))
        test_speed += time.time()-start

    # draw result of prediction
    label = np.argmax(prediction)
    value = prediction[0][label]/2
    return label,value,image_bbox
    # if label == 1:
    #     print("Image '{}' is Real Face. Score: {:.2f}.".format(image_name, value))
    #     result_text = "RealFace Score: {:.2f}".format(value)
    #     color = (255, 0, 0)
    # else:
    #     print("Image '{}' is Fake Face. Score: {:.2f}.".format(image_name, value))
    #     result_text = "FakeFace Score: {:.2f}".format(value)
    #     color = (0, 0, 255)
    # print("Prediction cost {:.2f} s".format(test_speed))
    # cv2.rectangle(
    #     image,
    #     (image_bbox[0], image_bbox[1]),
    #     (image_bbox[0] + image_bbox[2], image_bbox[1] + image_bbox[3]),
    #     color, 2)
    # cv2.putText(
    #     image,
    #     result_text,
    #     (image_bbox[0], image_bbox[1] - 5),
    #     cv2.FONT_HERSHEY_COMPLEX, 0.5*image.shape[0]/1024, color)

    # format_ = os.path.splitext(image_name)[-1]
    # result_image_name = image_name.replace(format_, "_result" + format_)
    # cv2.imwrite(SAMPLE_IMAGE_PATH + result_image_name, image)


红外IR 活体检测

参考:https://modelscope.cn/models/damo/cv_manual_face-liveness_flir/summary

安装:

pip install modelscope

pip install mmcv-full==1.6.0  mmdet==2.25.0  numpy==1.23.0  ##测试下来这几个对应版本运行不会报错

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks




face_liveness_ir = pipeline(Tasks.face_liveness, 'damo/cv_manual_face-liveness_flir')
# img_path = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/face_liveness_ir.jpg'
img_path = r"C:\Users\loong\Downloads\candidate-face\0029_IR_frontface.jpg"
result = face_liveness_ir(img_path)
print(f'face liveness output: {result}.')
##或者简单直接运行
p = pipeline('face-liveness', 'damo/cv_manual_face-liveness_flir')
# p('https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/retina_face_detection.jpg',)
p(r"C:\Users\loong\Downloads\candidate-face\0025_IR_frontface.jpg")

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域,通常需要指标存储组件TSDB,目前开源的TSDB组件比较多,各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题,重点讲解VictoriaMetrics(后面简称为vm)。 有兴趣的朋友建议…

Linux中常用的一些shell命令

很多的时候我们知道有一个命令,但不知道它的详细用法,可以来搜索下。但有些时候压根不知道有这个命令,比如vimdiff和diff这两个命令,知道人就比较少。 本节内容主要汇总一下Linux中常用的一些shell命令。 1. 文件和目录操作 ls …

win11安装MySQL5.7.43的问题清单

文章目录 1、win11查看自己电脑有没有安装mysql法1法2 2、完全清除之前安装的mysql3、 mysql的安装法1法2 4、遇到的一些问题1) ‘mysql‘不是内部或外部命令,也不是可运行的程序或批处理文件2) 忘记mysql的密码3)mysql启动不了:本地计算机上的MySQL服务启动后停止4…

机器学习深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层,方便使用者调用构建网络。 卷积层 卷积就是输入和卷积核之间的内积运算,如下图: 容易发现,卷积神经网…

汽车养护店服务难题,看帕凝怎样解决?

中国汽车市场庞大,入户已然成为标配,加之新能源汽车近些年高增量,更促进了行业增长。而汽车后市场也迎来了一系列变化,客户服务前后路径需完善,商家们应该如何数字化经营呢? 接下来让我们看看【帕凝汽车养…

提升内功之模拟实现库函数atoi

本文包含知识点: 库函数atoi的使用和模拟实现枚举常量的运用fgets代替gets函数读取字符串isspace isdigit库函数的使用 一、库函数atoi的介绍与使用atoi的介绍atoi的使用细节 二、库函数atoi的模拟实现 一、库函数atoi的介绍与使用 atoi的介绍 函数介绍 头文件——…

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出,它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。 EdDSA的一个特殊之处在于,该方案不要求每次签名都是用全新的…

Spring项目如何创建?Bean对象是如何存储的?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 目录 文章目录 一、创建Spring项目 1.1 创建Maven项目 2.2 配置国内源 二、Bean对象的存储和读取 2.1 添加spring配置文件 2.2 创建Bean对象 2.3 读取Bean对象 2.3.1 得到spring上下文对象…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

生命的样子

bbc纪录片《王朝》第一季就让我颇为震撼,第二季拖到现在才看,不过好在看了《晚酌de流派》之后,现在对待上好的游戏和视频都要颇有仪式感的情况下食用,夜深人静,配着暖灯,一杯茶,伴随大卫爱登堡的…

Lesson2——时间复杂度与空间复杂度

前言: 一个物品的好坏,我们可以通过体验、口碑、销量等因素判断。那一个算法的好坏我们怎么判断呢? 目录: 1. 算法的效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度oj练习 一、算法的效率 1、如何衡量一个算…

react-draft-wysiwyg富文本编辑器

在React项目中使用 yarn add react-draft-wysiwyg draft-js or npm i react-draft-wysiwyg draft-js推荐在项目中单独创建一个富文本编辑器组件 import { Editor } from "react-draft-wysiwyg"; import { EditorState, convertToRaw, ContentState } from draft-js…

12、动手学深度学习——循环神经网络从零实现+Pytorch内置函数实现:代码详解

1、基础知识 参考文章:8.4. 循环神经网络 2、从零开始实现 本节将上述描述, 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 首先, 我们先读取数据集。 %matplotlib inline import math…

陆拾柒- 如何通过数据影响决策(二)

是否曾感觉自己已经很努力了,但却一直被人说表现的比以前差了。 虽然古语有云“眼见为实”,但着眼之处很有可能是错的。 一、某咖啡店近期销量 7月17日准备要开大会时,负责小程序渠道的同事看到7月17日趋势下跌之后,就开始想办法…

fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errno=Unknown error

git:fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errnoUnknown error 在 bash 执行命令 git clone 时 报 : fatal: unable to connect to github.com:github.com[0: 20.205.243.166]: errnoUnknown error 发生此错误是因为 g…

【C++】string类的模拟实现(增删查改,比大小,运算符重载)

文章目录 1.1大框架1.2基本函数:2.成员函数2.0构造函数2.05析构函数2.09拷贝构造函数补充:预留存储空间(reserve) 2.1增加字符(push_back,append,s)push_backappends 2. 删除字符&am…

SpringCloud-Alibaba之Seata处理分布式事务

一ID三组件模型 Transaction ID XID 全局唯一的事务ID Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚 Transaction Manager™ 控制全局事务的边界,负责开启一个全局事务,…

Java当中的深拷贝和浅拷贝

文章目录 一、前提二、浅拷贝1. BeanUtils实现浅拷贝 三、深拷贝1. 实现Cloneable接口并重写clone()方法:2. 使用序列化与反序列化: 一、前提 在计算机的内存中,每个对象都被赋予一个地址,该地址指向对象在内存中存储的位置。当我…

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此,由两部分组成的教程的第一部分中,我将向您展示如何: 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…

uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

放点击事件里面即可 uni.navigateToMiniProgram({appId: , //跳转的小程序的aooIdpath: pages/index/index?id123, //如果这里不填,默认是跳转到对方小程序的主页面extraData: { //需要传给对方小程序的数据data1: test},success(res) {// 打开成功} })