计算机视觉OpenCv学习系列:第十部分、实时人脸检测

news2024/9/21 4:31:06

第十部分、实时人脸检测

    • 第一节、实时人脸检测
      • 1.OpenCV人脸检测支持演化
      • 2.OpenCV DNN检测函数
      • 3.代码练习与测试
    • 学习参考

第一节、实时人脸检测

1.OpenCV人脸检测支持演化


OpenCV4 DNN模块

DNN- 深度神经网络

  • 来自另外一个开源项目tiny dnn
  • OpenCV3.3正式发布
  • 最新版本OpenCV4.5.5
  • 支持后台硬件加速机制 CPU/GPU等
  • 支持多种任务(分类、检测、分割、风格迁移、场景文字检测等)
  • 只支持推理,不支持训练,推理:支持模型的部署,但是不支持训练。
  • 支持主流的深度学习框架生成模型
  • 推荐使用pytorch/tensorflow

人脸检测的发展过程:

  • OpenCV3.3之前基于HAAR/LBP级联检测

  • OpenCV3.3开始支持深度学习人脸检测支持人脸检测

  • 模型caffe/tensorflowOpenCV4.5.4 支持人脸检测+landmark

  • 模型下载地址:

    • https://gitee.com/opencv_ai/opencv_tutorial_data

OpenCV人脸检测支持演化:

  • OpenCV人脸检测传统算法与深度学习模型对比
  • 针对同一段视频文件,速度与检测总数统计比较
    在这里插入图片描述

2.OpenCV DNN检测函数


# 读取模型:
1. readNetFromTensorflow
# 转换为blob对象:(实际上就是一个tensor)
2. blobFromImage
# 设置输入:
3. setInput
# 推理预测:
4. forward
  • 模型输入:1x3x300x300(将图片放入,自动变成1x3x300x300的大小)
  • 模型输出:1xNx7(N代表检测出多少个人脸,下所示就是1x1x7)
    • 7个数字分别是:
    • 最后四个:人脸检测框,左上角和右下角坐标(x1, x2, y1, y2)
    • 第三个:预测置信度
    • 第一个:batch-size的index索引 ,目前是0,每批读入一个图片
    • 第二个:classid,分类的类别,因为当前是人脸识别只有一类,所以classid=0
    • 所以当前只用解析后五个参数即可
  • 推理时间与帧率

3.代码练习与测试


1.readNetfromTensorflow 加载模型

2.blobFromImage转换输入格式数据

3.setInput设置输入数据

4.forward推理

5.对输出的数据 Nx7 完成解析

6.绘制矩形框跟得分

加载模型一次即可,推理可以执行多次!

# 人脸识别需要的文件
model_bin ="../data/opencv_face_detector_uint8.pb"
config_text = "../data/opencv_face_detector.pbtxt"


# 识别一张图片中的人脸
def frame_face_demo():
    # 记录开始时间
    a = time.time()
    print(a)
    # 获取摄像头
    font = cv.FONT_HERSHEY_SIMPLEX
    font_scale = 0.5
    thickness = 1
    # 部署tensorflow模型
    net = cv.dnn.readNetFromTensorflow(model_bin, config=config_text)
    # 记录调用时长
    print(time.time() - a)
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    e1 = cv.getTickCount()
    # 摄像头是和人对立的,将图像垂直翻转
    frame = cv.imread(r"F:\python\opencv-4.x\samples\data\lena.jpg")
    h, w, c = frame.shape
    print("h:", h, "w: ", w, "c: ", c)
    # 模型输入:1x3x300x300
    # 1.0表示不对图像进行缩放,设定图像尺寸为(300, 300),减去一个设定的均值(104.0, 177.0, 123.0),是否交换BGR通道和是否剪切都选False
    blobimage = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
    net.setInput(blobimage)
    # forward之后,模型输出:1xNx7
    cvout = net.forward()
    print(cvout.shape)

    t, _ = net.getPerfProfile()
    label = "Inference time: %.2f ms" % (t * 1000.0 / cv.getTickFrequency())
    # 绘制检测矩形
    # 只考虑后五个参数
    for detection in cvout[0, 0, :]:
        # 获取置信度
        score = float(detection[2])
        objindex = int(detection[1])
        # 置信度>0.5说明是人脸
        if score > 0.5:
            # 获取实际坐标
            left = detection[3] * w
            top = detection[4] * h
            right = detection[5] * w
            bottom = detection[6] * h

            # 绘制矩形框
            cv.rectangle(frame, (int(left), int(top)), (int(right), int(bottom)), (255, 0, 0), thickness=2)

            # 绘制类别跟得分
            label_txt = "score:%.2f" % score
            # 获取文本的位置和基线
            (fw, uph), dh = cv.getTextSize(label_txt, font, font_scale, thickness)
            cv.rectangle(frame, (int(left), int(top) - uph - dh), (int(left) + fw, int(top)), (255, 255, 255), -1, 8)
            cv.putText(frame, label_txt, (int(left), int(top) - dh), font, font_scale, (255, 0, 255), thickness)

    e2 = cv.getTickCount()
    fps = cv.getTickFrequency() / (e2 - e1)
    cv.putText(frame, label + (" FPS: %.2f" % fps), (10, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2)
    cv.imshow("face-dectection-demo", frame)

    # 释放资源
    cv.waitKey(0)
    cv.destroyAllWindows()
    # 视频文件执行之后会有警告但是不影响使用

结果示例:

在这里插入图片描述

# 人脸识别需要的文件
model_bin ="../data/opencv_face_detector_uint8.pb"
config_text = "../data/opencv_face_detector.pbtxt"


# 实时人脸识别摄像头
def video_face_demo():
    # 记录开始时间
    a = time.time()
    print(a)
    # 获取摄像头
    cap = cv.VideoCapture(0)
    font = cv.FONT_HERSHEY_SIMPLEX
    font_scale = 0.5
    thickness = 1
    # 部署tensorflow模型
    net = cv.dnn.readNetFromTensorflow(model_bin, config=config_text)
    # 记录调用时长
    print(time.time() - a)
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    while True:
        e1 = cv.getTickCount()
        # 获取每一帧的帧率
        fps = cap.get(cv.CAP_PROP_FPS)
        print(fps)
        # 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
        ret, frame = cap.read()
        # 摄像头是和人对立的,将图像垂直翻转
        frame = cv.flip(frame, 1)
        if ret is not True:
            break
        h, w, c = frame.shape
        print("h:", h, "w: ", w, "c: ", c)
        # 模型输入:1x3x300x300
        # 1.0表示不对图像进行缩放,设定图像尺寸为(300, 300),减去一个设定的均值(104.0, 177.0, 123.0),是否交换BGR通道和是否剪切都选False
        blobimage = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
        net.setInput(blobimage)
        # forward之后,模型输出:1xNx7
        cvout = net.forward()
        print(cvout.shape)

        t, _ = net.getPerfProfile()
        label = "Inference time: %.2f ms" % (t * 1000.0 / cv.getTickFrequency())
        # 绘制检测矩形
        # 只考虑后五个参数
        for detection in cvout[0, 0, :]:
            # 获取置信度
            score = float(detection[2])
            objindex = int(detection[1])
            # 置信度>0.5说明是人脸
            if score > 0.5:
                # 获取实际坐标
                left = detection[3] * w
                top = detection[4] * h
                right = detection[5] * w
                bottom = detection[6] * h

                # 绘制矩形框
                cv.rectangle(frame, (int(left), int(top)), (int(right), int(bottom)), (255, 0, 0), thickness=2)

                # 绘制类别跟得分
                label_txt = "score:%.2f" % score
                # 获取文本的位置和基线
                (fw, uph), dh = cv.getTextSize(label_txt, font, font_scale, thickness)
                cv.rectangle(frame, (int(left), int(top) - uph - dh), (int(left) + fw, int(top)), (255, 255, 255), -1, 8)
                cv.putText(frame, label_txt, (int(left), int(top) - dh), font, font_scale, (255, 0, 255), thickness)

        e2 = cv.getTickCount()
        fps = cv.getTickFrequency() / (e2 - e1)
        cv.putText(frame, label + (" FPS: %.2f" % fps), (10, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2)
        cv.imshow("face-dectection-demo", frame)
        # 10ms显示一张图片
        c = cv.waitKey(10)
        if c == 27:
            break
        # 释放资源
    cap.release()
    cv.waitKey(0)
    cv.destroyAllWindows()
    # 视频文件执行之后会有警告但是不影响使用

结果示例:

在这里插入图片描述

学习参考

本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course

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

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

相关文章

网络编程 之 epoll

epoll 参数设置 events设置 ev.events EPOLLIN | EPOLLET;epoll实现TCP通讯时,events通用设置如上,EPOLLIN代表可socket套接字可接收数据,EPOLLET代表边沿触发。在服务器端, 接受客户端连接的socket不能设置为EPOLLOUT,只设置E…

【5】【TypeScript】(TypeScript=Type+JavaScript)

Typescript 相比js特有 类型系统;对象的接口DOM操作时候需要进行类型断言上面三个实际是类型系统的三处体现枚举js中,-号可以强制转换为数值,ts不行 所有合法的js都是ts 1、安装 安装进度卡住可以用淘宝镜像 (在后面加 --registr…

Spring Cloud Hystrix有什么作用?

在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用,如图1所示。图1 服务故障的级联传递在图1中,A为服务提供者,B为A的服务调用者&…

反欺诈(羊毛盾)API有什么作用?

肯定很多企业、商家都遭受过羊毛党的侵入,比如恶意注册、刷单、领用的行为。羊毛党具体有哪些危害呢? 羊毛党的危害 虚假用户裂变:识别在游戏解锁、红包裂变、助力砍价、电商拼团等用户拉新活动中作弊行为。虚假登录注册:防止机…

Java基于springboot大学生宿舍寝室考勤人脸识别管理系统

简介 Java基于springboot开发的大学生寝室管理系统宿舍管理系统。学生可以查找寝室和室友信息,可以申请换寝室,申请维修,寝室长提交考勤信息(宿管确认学生考勤信息),补签,查看寝室通报&#xf…

FPGA纯verilog代码实现图像缩放,两种插值算法任意尺寸缩放,提供3套工程源码

目录1、设计思路和架构2、纯verilog代码搭建,不带任何ip3、双线性插值和邻域插值算法4、vivado和matlab联合仿真及结果5、工程代码1:720P原始摄像头采集显示6、工程代码2:720P缩小到800x600P显示7、工程代码3:720P缩放大1920x1080…

结合FPGA和NVIDIA Jetson Orin NX 系统的视觉边缘计算机

边缘计算机采用NVIDIA Jetson Orin NX模块化系统和高带宽图像采集卡,用于实时图像采集计算和人工智能处理。虹科与一家专注于高速图像采集和处理的以色列科技公司Gidel合作,今天宣布新的NVIDIA Jetson Orin NX™ 16GB模块化系统(SoM)将被添加到Gidel的Fa…

Jmeter接口测试流程详解(中科软测认证中心)

Jmeter接口测试流程详解(中科软测认证中心) 目录:导读 1、jmeter简介 2、jmeter安装 3、设置jmeter的中文界面 4、jmeter主要元件 5、Jmeter元件的作用域和执行顺序 6、jmeter接口测试流程步骤 1、jmeter简介 Jmeter是由Apache公司开…

【数据架构系列-02】从《数据中台能力成熟度模型》的发布,聊聊火了的中台

热点之所以会“热起来”,是由于万众瞩目的那份炽烈,也是因为无数双“手”的奋力炒作。所以,要穿过那“缭绕烟雾”看到本质,便需要冷静的头脑。 2023年1月4日,信通院发布了《数据中台能力成熟度模型》框架,不由让我浮想联翩,之后是不是还会出现…

Python采集豆某影片并作词云图分析

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录前言环境使用:模块使用:爬虫基本思路:代码展示绘制词云图尾语 💝环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用: import parsel >>> pip install parsel import…

二叉树26:二叉树的最近公共祖先

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:236. 二叉树的最近公共祖先 题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科…

网络工程师备考9章

第九章:网络操作系统与应用服务器 9.1 考点分析 ​​​​​​​ 注:MCSE、RHCE基础:微软和红帽的系统工程师的内容都纳入到一章里;我们要学的服务器类型非常多,最重要的罗列下来,总结起来就是3D+I; 9.1.1 网络操作系统 9.2 安装过程 略 9.3 Windows Server 2008 R2 本…

创新科技引领清洁新标准,CEYEE希亦洗地机重新定义深度清洁

后疫情时代,随着人们健康意识的增强,家庭清洁卫生意识逐渐深入人心,大家对于清洁家电的选择也不再局限于基础功能,而是更注重智能化、健康化、便捷性、多功能等维度。创新型科技新消费品牌「CEYEE希亦」也由此应运而生&#xff0c…

SpringCloud-Eureka

1.Spring Cloud是什么? SpringCloud是一系列框架的有序集合。【包含了开发所需的其他的框架】 它利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断…

如何安装python运行环境,想学python需要安装什么

这篇文章主要介绍了安装python程序后要进行什么设置,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 1、使用python需要安装哪些软件 《Python 3.9.7软件》百度网盘资源免费下…

浅析DDOS攻击及防御

如今,信息技术的发展为人们带来了诸多便利,无论是个人社交行为,还是商业活动都离不开网络。但是,网络空间在创造机遇的同时,也带来了威胁,其中 DDOS 就是最具破坏力的攻击。经过这些年的不断发展&#xff0…

QT/C++——文件和进程线程编程

目录 一、文件普通读写和流式读写 二、目录遍历和文件属性读写 三、进程 四、线程 五、线程同步 六、线程互斥 一、文件普通读写和流式读写 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextEdit> #include <QLineEdit> #include…

iPhone彻底删除的重要照片怎么找回来?三招找回被删照片!

要说iPhone手机占用储存空间最多的是什么&#xff1f;照片&#xff0c;相信是大部分苹果手机用户的回答。 iPhone强大的拍照技术&#xff0c;拍了很多照片&#xff0c;却十分占用内存。在清理照片时&#xff0c;为了快速释放内存&#xff0c;快速滑动批量删除照片。 我们知道&…

C++ 标准库 常用算法总结(排序、合并、搜索和分区)

本系列文章介绍了所有的STL常用的算法。这些算法通常都有不同的功能&#xff0c;例如&#xff1a;排序元素算法{sort()、stable_sort()、nth_element()}、 查询元素算法{find()、find_if()、find_if_not()、find_end()、find_first_of()、adjacent_find()}、 复制元素算法{co…

Android 分区存储

1.Android存储 Android存储分为内部存储和外部存储&#xff08;外部存储并不是指SD存储卡或外部硬盘&#xff09;。 ①内部存储 用于Android系统本身和应用程序的存储区域&#xff0c;比如手机的/system/、/data/等目录。 如果没有这一块存储区域是无法运行Android系统和应用…