opencv基于残差网络实现人脸检测(代码片段)

author author     2022-10-30     281

关键词:

OpenCV基于残差网络实现人脸检测
OpenCV3.3版本第一次把深度神经网络(DNN)模块引入到正式发布版本中,最新的OpenCV3.4中DNN模块发布了两个必杀技,一个支持Faster R-CNN的对象检测,比SSD与YOLO这些模型有更好的检测精度与小对象检测能力,另外一个是支持基于SSD+Resnet模型的人脸检测,虽然速度还达不到HAAR级联检测器的实时性,但是准确性与模型泛化能力可以说完爆HAAR级联检测器方式的人脸检测算法。作为OpenCV开发者需要人脸检测功能时候又多了一种更加可靠的选择,这里我们首先简单介绍一下什么是残差网络,然后给出其人脸检测模型在OpenCV基于摄像头实时人脸检测演示。
一:残差网络(Resnet)
最初的CNN网络LeNet与AlexNet卷积层都比较少,VGG通过小的卷积核实现了网络深度的增加取得了显著效果,但是当层数过度增加的时候就发现训练错误与测试错误都在增加,图示如下:
技术分享图片

最开始人们以为是因为梯度消失或者梯度爆炸导致的,不过随着大家的努力,认为这个不是一个过拟合问题,而是网络褪化现象,所以针对这种情况,MSRA何凯明团队提出了一种新的网络模型-Residual Networks,其主要思想是使用残差结构来训练网络,一个残差结构如下:
技术分享图片

作者认为F(x) = H(x)-x所以得到H(x) = F(x) + x这样的恒等映射,然后作者就建立34层plain网络与34层的残差网络作为对比,而最左边的VGG-19网络作为参考,整个的网络结构显示如下:
--- 图太大啦!!!
模型建立好的之后,作者在不同的数据集上进行了训练与测试,均观察到残差网络的效果要明显优于34层plain网络,而且发现基于残差结构的网络层数越深效果越好,而34层plain网络跟18层的plain网络相比有明显的褪化现象出现。对比训练的结果如下:
技术分享图片

在残差网络没有出来之前,很少有网络的层数会超过100层,但是残差网络可以达到上千层,毫无疑问何凯明团队也凭借残差网络模型在2015年的ImageNet图像分类比赛中获得了冠军,当时使用152层的残差网络。OpenCV中人脸检测的残差网络模型是基于SSD实现的,所以速度还是挺快的,而且效果是特别的好。废话不多说了,下面我就看看OpenCV中如何使用它实现人脸检测。
二:人脸检测代码实现
模型是基于Caffe网络训练生成的,所以在开始写程序之前的第一件事情就是要下载模型文件与描述文件,这个我已经下载好了,大家就不用×××了,直接去我的github地址上下载模型文件即可
https://github.com/gloomyfish1998/opencv_tutorial
下载好模型之后放在本地的一个文件夹下即可,然后就可以开始编程工作啦。
首先需要加载模型成网络:

    String modelDesc = "D:/vcprojects/images/dnn/face/deploy.prototxt";
    String modelBinary = "D:/vcprojects/images/dnn/face/res10_300x300_ssd_iter_140000.caffemodel";
    // 初始化网络
    dnn::Net net = readNetFromCaffe(modelDesc, modelBinary);
    if (net.empty())
    
        printf("could not load net...\n");
        return -1;
    

然后要打开本地相机或者一段视频文件,使用VideoCapture对象即可,代码如下:

// 打开摄像头
    VideoCapture capture(0);
    if (!capture.isOpened()) 
        printf("could not load camera...\n");
        return -1;
    

打开相机成功之后就可以读写每帧图像,然后转换成网络可以接受的数据类型,代码如下:

        // 输入数据调整
        Mat inputBlob = blobFromImage(frame, inScaleFactor,
            Size(inWidth, inHeight), meanVal, false, false); 
        net.setInput(inputBlob, "data");

然后在OpenCV中通过调用net.forward实现检测,对结果提取置信分数(0~1)之间,对大于阈值(假设0.5)的提取BOX位置,就可以绘制矩形框显示了,这部分的代码如下:

// 人脸检测
        Mat detection = net.forward("detection_out"); 
        vector<double> layersTimings;
        double freq = getTickFrequency() / 1000;
        double time = net.getPerfProfile(layersTimings) / freq;
        Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());

        ostringstream ss;
        ss << "FPS: " << 1000 / time << " ; time: " << time << " ms";
        putText(frame, ss.str(), Point(20, 20), 0, 0.5, Scalar(0, 0, 255));
        for (int i = 0; i < detectionMat.rows; i++)
        
            float confidence = detectionMat.at<float>(i, 2);
            if (confidence > confidenceThreshold)
            
                int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);
                int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);
                int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols);
                int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows);

                Rect object((int)xLeftBottom, (int)yLeftBottom,
                    (int)(xRightTop - xLeftBottom),
                    (int)(yRightTop - yLeftBottom));

                rectangle(frame, object, Scalar(0, 255, 0));

                ss.str("");
                ss << confidence;
                String conf(ss.str());
                String label = "Face: " + conf;
                int baseLine = 0;
                Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
                rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),
                    Size(labelSize.width, labelSize.height + baseLine)),
                    Scalar(255, 255, 255), CV_FILLED);
                putText(frame, label, Point(xLeftBottom, yLeftBottom),
                    FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
            
        

最终运行显示结果如下, 脸部无遮挡,正常情况下:
技术分享图片
脸部无遮挡,头部倾斜的情况下:
技术分享图片
脸部有遮挡的情况下:
技术分享图片
更多倾斜、侧脸、模糊等各种情况下:
技术分享图片
可见残差网络模型是何等的强大,到这里是不是该点一首《凉凉》送给HAAR级联检测器了。上述demo完整源代码,可以在GITHUB上下载。
https://github.com/gloomyfish1998/opencv_tutorial

OpenCV DNN 教程学习

人脸检测实战:使用opencv加载深度学习模型实现人脸检测(代码片段)

使用OpenCV和深度学习进行人脸检测今天的博文分为三个部分。在第一部分中,我们将讨论更准确的OpenCV人脸检测器的起源以及它们在OpenCV库中的位置。然后我将演示如何使用OpenCV和深度学习在图像中执行人脸检测。最后我将... 查看详情

mtcnn实时人脸检测网络详解与opencv+tensorflow代码演示(代码片段)

MTCNN模型概述多任务卷积神经网络(MTCNN)实现人脸检测与对齐是在一个网络里实现了人脸检测与五点标定的模型,主要是通过CNN模型级联实现了多任务学习网络。整个模型分为三个阶段,第一阶段通过一个浅层的CNN网络快速产生一... 查看详情

基于opencv的视频处理-人脸检测(代码片段)

...completion:2023.2.7Lastedited:2023.2.7导读本文将使用Python、OpenCV对人脸进行检测,防止痴呆后忘了Quiet。目录基于OpenCV的视频处理-人脸检测拍摄影片检测人脸保存面孔和摘要视频输出运行中的管道作者有言基于OpenCV的视频处理-... 查看详情

android基于opencv4.6.0实现人脸识别功能(代码片段)

前言步骤:1.整合opencv2.获取相机的SurfaceView传到native层去检测(亦或是不断的获取SurfaceView的Bitmap,传到native层)3.检测人脸,在本地保存人脸特征信息4.上传至后台(不实现)人脸识别实现的思路(例:人脸登录)1.人脸... 查看详情

opencv&qt学习之四——opencv实现人脸检测与相关知识整理(代码片段)

开发配置OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux下编译安装OpenCV。网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是... 查看详情

opencv调用手机摄像头与人脸检测(代码片段)

文章目录一、OpenCV机器视觉环境搭建1.OpenCV下载2.OpenCV安装3.安装测试二、OpenCV调用摄像头及人脸检测1.调用电脑摄像头2.调用手机摄像头及人脸检测2.1准备工作2.2代码实现三、总结四、参考文献一、OpenCV机器视觉环境搭建1.OpenCV下... 查看详情

基于opencv实现人脸识别案例(代码片段)

一、基础我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。下图中的Haar特征会被使用,就像我... 查看详情

opencv实现人脸,人眼,微笑检测(代码片段)

1.首先实现人脸检测1importcv223img=cv2.imread("people.jpg",1)#读入图像4#导入人脸级联分类器引擎,“.xml”文件里包含了训练出来的人脸特征5face_engine=cv2.CascadeClassifier(cv2.data.haarcascades+‘haarcascade_frontalface_default.xml‘)6 查看详情

opencv-python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)(代码片段)

OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)0.前言1.人脸处理简介2.安装人脸处理相关库2.1安装dlib2.2安装face_recognition2.3安装cvlib3.人脸检测3.1使用OpenCV进行人脸检测3.1.1基于Haar级联... 查看详情

基于opencv读取摄像头进行人脸检测和人脸识别

前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述。检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的:http://docs.op... 查看详情

opencv-python也能实现人脸检测了(代码片段)

opencv中也可以实现深度学习中的人脸识别算法了。是怎么一回事呢?就是opencv中的DNN库,更新了好多深度学习的模块或者说是库函数,这样就让我们摆脱了安装庞大繁琐的深度学习框架。我们只需下载相应的权重文件... 查看详情

pyhton,opencv对象检测之——haar级联人脸及眼睛检测(代码片段)

Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测1.效果图2.原理2.1Haar人脸检测原理2.2Haar级联预训练的模型3.源码3.1图像面部及眼睛检测3.2视频帧面部及眼睛检测参考这篇博客将介绍如何使用预训练的模型——基于Haar特征的... 查看详情

dlib+opencv库实现疲劳检测(代码片段)

文章目录1.关键点检测2.算法实现的核心点3.算法实现(1)人脸的关键点集合(2)加载人脸检测库和人脸关键点检测库(3)绘制人脸检测的框(4)对检测之后的人脸关键点坐标进行转换(5)... 查看详情

基于opencv实现车牌图片识别系统(代码片段)

这是一个基于springboot+maven+opencv实现的图像识别及训练的Demo项目包含车牌识别、人脸识别等功能,贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点java语言的深度学习项目,在整个开源社区来说... 查看详情

计算机视觉opencv学习系列:第十部分实时人脸检测(代码片段)

第十部分、实时人脸检测第一节、实时人脸检测1.OpenCV人脸检测支持演化2.OpenCVDNN检测函数3.代码练习与测试学习参考第一节、实时人脸检测1.OpenCV人脸检测支持演化OpenCV4DNN模块DNN-深度神经网络来自另外一个开源项目tinydnnOpenCV3.3... 查看详情

opencvforjava实现人脸检测(代码片段)

  opencv是一个很优秀的图像处理框架,可以通过源码编译,让他支持java开发,这里如果在windows下开发,可以直接使用opencv-453.jar和opencv_java452.dll动态库就够了。  下面给出一个简单的代码,实现人脸检测ÿ... 查看详情

人脸检测实战进阶:使用opencv进行活体检测(代码片段)

使用OpenCV进行活体检测在本篇博文中,您将学习如何使用OpenCV执行活体检测。您将创建一个活体检测器,该检测器能够在人脸识别系统中发现假人脸并执行反人脸欺骗。在教程的第一部分,我们将讨论活体检测,... 查看详情

基于opencv的人脸检测(代码片段)

...一些思考引言这篇文章,让你用短短的16行代码基于opencv检测一张图片上的人脸,很有意思,快快学起来吧!一、代码先将代码直接粘在下面:importcv2ascvdefface_detect_demo(img):img=cv.resize(img,dsize=(800,800))gary... 查看详情