欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

基于深度学习的人脸检测与静默活体检测——C++实现

发布时间:2025/3/21 c/c++ 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基于深度学习的人脸检测与静默活体检测——C++实现 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言

1.系统环境是win10,显卡RTX3080;cuda10.2,cudnn7.1;OpenCV4.5,ncnn版本是20210525;C++ IDE vs2019。
2.使用NCNN作模型推理加速库,能更容易的使用GPU进行加速,代码不需要改动很大就可以移植到边缘设备或者移动端上。

一、人脸检测

1.人脸检测用的yolov5-face,yolov5-face是一种实时、高精度的人脸检测,搭配NCNN在安卓上(Mate 30 pro)cpu 能跑出18 FPS左右,GPU能跑出25 FPS。算法源码地址:https://github.com/deepcam-cn/yolov5-face 。论文地址:https://arxiv.org/abs/2105.12931 。
2.人脸检测效果:

二、活体检测

1、人脸活体检测是用来检测当前摄像头所检测到的人脸是否是伪造的,是人脸验证和人脸识别的前提条件,如果不能检测出来是否是活体,那么就会出现比如常见用照片,人脸面具,3D人像等其他媒介来骗过人脸识别系统。
2、目前主流的活体解决方案分为配合式活体检测和非配合式活体检测(静默活体检测)。配合式活体检测需要用户根据提示完成指定的动作(比如眨眼,头往哪边转一下),然后再进行活体校验,静默活体则在用户无感的情况下直接进行活体校验。
3、这里演示的是静默活体检测,算法地址:https://github.com/minivision-ai/Silent-Face-Anti-Spoofing 。

三、代码

1.代码流程,输入摄像头或者视频,先检测当前画面是否存在人脸,如果在用到项目上,也可以做当前存在是否是唯一人脸的检测,存在人脸则对人脸做活体检测,检测当前输入的人脸是否是活体人脸。
2.代码:

#include <opencv2/opencv.hpp> #include "TLive.h" #include "yoloface.h" #include <opencv2/video/video.hpp>cv::Rect targetResize(const cv::Mat& cv_src, cv::Mat& cv_dst, int target_w, int target__h);int main(void) {int target_w = 640, target_h = 480;YoloFace yolo_face;TLive live;//加载活体检测模型live.LoadModel("models/live/");//加载人脸检测模型yolo_face.loadModel("models/face/face_lite");cv::VideoCapture cap;//打开摄像头或者是输入视频//cap.open(0);cap.open("face.mp4");if (!cap.isOpened()){return 0;}cv::Mat cv_src;while (1){cap >> cv_src;if (cv_src.empty()){break;}std::vector<Object> objects;//图像边界扩展,这步是为了提高精度cv::Mat cv_target;cv::Rect rect = targetResize(cv_src, cv_target, target_w, target_h);//人脸检测yolo_face.detection(cv_target, objects);for (int i = 0; i < objects.size(); ++i){float x1 = objects[i].rect.x;float y1 = objects[i].rect.y;float x2 = objects[i].rect.width + x1;float y2 = objects[i].rect.height + y1;struct LiveFaceBox LiveBox = { x1,y1,x2,y2 };//活体检测float prod = live.Detect(cv_target, LiveBox);objects[i].live = prod;}//输出结果yolo_face.drawFace(cv_target, objects);cv::Mat cv_dst(cv_target(rect));cv::namedWindow("face", 0);cv::imshow("face", cv_dst);cv::waitKey(20);}cap.release();return 0; } cv::Rect targetResize(const cv::Mat& cv_src, cv::Mat& cv_dst, int target_w, int target_h) {float s;if (cv_src.cols > cv_src.rows){s = float(target_w) / cv_src.cols;}else{s = float(target_h) / cv_src.rows;}float w = cv_src.cols * s;float h = cv_src.rows * s;int w_p = (target_w - w) / 2;int h_p = (target_h - h) / 2;cv::Mat cv_size;cv::resize(cv_src, cv_size, cv::Size(w, h));cv::copyMakeBorder(cv_size, cv_dst, h_p, h_p, w_p, w_p, cv::BORDER_CONSTANT, 114.f);return cv::Rect(w_p, h_p, cv_size.cols, cv_size.rows); }

3.测试结果
先输入一个全是照片的视频:

再测试一个正常的活动的人脸:

4.源码地址:https://download.csdn.net/download/matt45m/84996790

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的基于深度学习的人脸检测与静默活体检测——C++实现的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。