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

Liuyc-Codeboy Liuyc-Codeboy     2023-03-04     281

关键词:

第十部分、实时人脸检测

第一节、实时人脸检测

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

机器视觉中的图像积分图及事实上现

计算机视觉中,人脸检測(FaceDetection)是一项常见的任务。PaulViola和MichaelJones在《RapidobjectdetectionusingaBoostedcascadeofsimplefeatures》一文中提出的高速对象识别算法将人脸检測推向了一个新的高度,这样的将Adaboost和Cascade算法综合运... 查看详情

opencv进阶-ssd模型实时人脸检测

...干扰性。opencv自带的人脸检测模型一、先安装python参考:计算机基础-深度学习下的python下载与安装二、下载模型文件打开windows下的终端,点击左下角的徽标键,输 查看详情

“opencv”是啥?

...成像、机器视觉等领域的超过500个接口函数。同时,由于计算机视觉与机器学习密不可分,该库也包含了比较常用的一些机器学习算法。或许,很多人知道,图像识别、机器视觉在安防领域有所应用。但,很少有人知道,在航拍... 查看详情

树莓派---基于opencv实现人脸识别

目录你可以去调百度人脸识别的API,我这里是基于OpenCV进行人脸识别OpenCV(OpensourceComputerVisionLibrary)是一个开源的计算机视觉库,支持与计算机视觉和机器学习相关的众多算法,用C++编写1.安装OpenCV  查看详情

opencv人脸识别

 背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景的图片拼接,到... 查看详情

基于opencv的人脸识别

基于OpenCV的人脸识别 一点背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从... 查看详情

基于opencv的人脸识别

基于OpenCV的人脸识别 一点背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从... 查看详情

计算机视觉项目-人脸识别与检测(代码片段)

...OpenCV的相关知识🎉作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo系列),pytho 查看详情

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

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

python笔记-opencv图像处理和人脸识别(代码片段)

...称是OpenSourceComputerVisionLibrary,是一个开源的跨平台的计算机视觉库。可以运行在Linux、Windows、Android和macOS操作系统上,帮助人们快速构建复杂的视觉应用程序。2.计算机视觉:计算机视觉(ComputerVision)就是利... 查看详情

计算机视觉40例案例32:定位人脸(代码片段)

【导读】本文是专栏《计算机视觉40例简介》的第32个案例《定位人脸》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。目前,该书已经在电子工业出版社出版&#x... 查看详情

opencv2马拉松第17圈——边缘检測(canny边缘检測)

计算机视觉讨论群162501053转载请注明:http://blog.csdn.net/abcd1992719g收入囊中利用OpenCVCanny函数进行边缘检測掌握Canny算法基本理论分享Java的实现葵花宝典在此之前,我们先阐述一下canny检測的算法.总共分为4部分.(1)处理噪声一般用... 查看详情

百度开放ai应用学习!

 Datawhale学习 组织方:百度,方向:计算机视觉生产制造在经济发展中的角色越来越重要,却面临一系列问题:流水线质检需要确保准确率和效率,可人工质检的漏检错检率一直无法突破。工作人员在生... 查看详情

opencv人脸检測(完整源代码+思路)

本博文IDE为vs2013OpenCV2.49话不多说,先看视频演示(20S演示):例如以下:https://v.youku.com/v_show/id_XMjYzMzkxMTYyMA==.html?spm=a2h0w.8278793.2736843.4#paction程序截图例如以下:怎样来用OpenCV来实现能。以下给出OpenCV实现人脸检測的一般步骤:1.... 查看详情

opencv-python实战(17)——人脸识别详解(代码片段)

...理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息, 查看详情

《学习opencv3》pdf中英文+代码分析

 计算机视觉2477203708是在图像处理的基础上发展起来的新兴学科。OpenCV是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器之一。它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了... 查看详情

python计算机视觉:人脸识别

讲明一下:并没有实现人脸识别的算法,只是利用人脸特征文件(文件从官网上下载),从而进行人脸识别,总感觉识别出来的效果还是有问题的,如:图片最好是人脸的正脸。1.人脸特征文件下载直接去github或者gitee(建议gitee)上... 查看详情

热视觉3:使用python和opencv的发烧探测器

热视觉3:使用Python和OpenCV的发烧探测器这篇博客将结合前俩篇博客,介绍如何使用Python和OpenCV构建一个发烧探测器。包括:热图像中简单的人脸检测发烧检测(近似解决方案)通过3个步骤实时检测树莓派视频流人脸发烧检测;... 查看详情