当前位置: 首页 > article >正文

《OpenCV》——卷积神经网络人脸检测

文章目录

    • 什么是卷积神经网络?
    • 实例——CNN网络实现人脸检测

什么是卷积神经网络?

卷积神经网络(Convolutional Neural Network,简称 CNN)在人脸检测领域取得了巨大的成功,以下是关于卷积神经网络介绍:

  • 基本原理

    • 卷积层:通过卷积核在图像上滑动进行卷积操作,提取图像的局部特征,如边缘、纹理等。不同的卷积核可以捕捉不同类型的特征,随着网络层数的增加,卷积层能够从简单的基础特征逐步学习到更复杂、抽象的人脸特征。
    • 池化层:主要作用是对特征图进行下采样,降低数据维度,减少计算量,同时还能在一定程度上防止过拟合。常见的池化操作有最大池化和平均池化,通过对特征图的局部区域进行聚合统计,保留重要的特征信息。
    • 全连接层:将经过卷积和池化处理后的特征图展开成一维向量,并通过全连接的方式将这些特征与输出层相连,用于对人脸的存在与否以及人脸的位置、姿态等信息进行预测。
      在这里插入图片描述
  • 经典模型

    • VGGNet:由牛津大学计算机视觉组和谷歌 DeepMind 公司的研究员一起研发的深度卷积神经网络。它的特点是使用了多个较小的 3×3 卷积核代替较大的卷积核,通过增加网络深度来提高模型的表达能力,在人脸检测任务中能够提取到丰富的特征。
    • ResNet:引入了残差连接的结构,有效地解决了深度神经网络中梯度消失和梯度爆炸的问题,使得网络可以训练得更深。在人脸检测中,ResNet 能够学习到更高级的语义特征,提高检测的准确性。
    • SSD(Single Shot MultiBox Detector):是一种单阶段的目标检测算法,将不同尺度的特征图用于检测不同大小的目标,在人脸检测中可以快速检测出不同尺度的人脸,具有较高的检测速度和一定的检测精度。
    • YOLO(You Only Look Once):同样是单阶段目标检测算法,它将目标检测问题转化为一个回归问题,直接在输出层回归出目标的位置和类别,大大提高了检测速度,在实时人脸检测场景中具有广泛的应用。
  • 训练过程

    • 数据集准备:收集大量包含人脸的图像数据,并对每张图像中的人脸进行标注,包括人脸的位置(如边界框的坐标)和属性(如性别、年龄等)。常用的人脸检测数据集有 WIDER FACE、FDDB 等。
    • 数据预处理:对图像进行归一化、裁剪、翻转、缩放等操作,以增强数据的多样性,提高模型的泛化能力。
    • 模型训练:将预处理后的图像输入到卷积神经网络中,通过反向传播算法计算预测结果与真实标注之间的误差,并更新网络的参数,使得模型的预测结果逐渐接近真实值。训练过程中通常会使用一些优化算法,如随机梯度下降(SGD)、Adagrad、Adadelta 等,来加速模型的收敛。

实例——CNN网络实现人脸检测

本次实例使用预训练好的模型进行人脸检测的检测。
预训练模型:通过网盘分享的文件:mmod_human_face_detector.dat
链接: https://pan.baidu.com/s/1-IGxGOCxjr08Zt8g8SvCug 提取码: x51r
对以下图片进行人脸检测:
在这里插入图片描述
代码:

# 导入 dlib 库,dlib 是一个强大的机器学习库,提供了很多用于计算机视觉任务的工具,包括人脸检测等功能
import dlib
# 导入 OpenCV 库,OpenCV 是一个广泛用于计算机视觉任务的开源库,可用于图像读取、处理和显示等操作
import cv2

# 使用 dlib 加载预训练的基于卷积神经网络(CNN)的人脸检测模型
# 'mmod_human_face_detector.dat' 是预训练模型的文件,该模型可以用于检测图像中的人脸
cnn_face_detector = dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat')

# 使用 OpenCV 的 imread 函数读取指定路径的图像文件 'hezhao.jpg'
# 读取后的图像数据存储在变量 img 中,图像以 BGR(蓝、绿、红)格式表示
img = cv2.imread('hezhao.jpg')

# 使用加载的 CNN 人脸检测模型对图像进行人脸检测
# 第二个参数 2 表示上采样次数,上采样可以让图像在更高分辨率下进行检测,有助于检测到更小的人脸
faces = cnn_face_detector(img, 2)

# 遍历检测到的人脸,faces 是一个包含检测结果的列表,每个元素代表一个检测到的人脸
for d in faces:
    # 从检测结果中提取人脸的矩形框信息
    # d.rect 是一个 dlib 的矩形对象,包含了人脸的边界框信息
    rect = d.rect
    # 获取矩形框的左边界坐标
    left = rect.left()
    # 获取矩形框的上边界坐标
    top = rect.top()
    # 获取矩形框的右边界坐标
    right = rect.right()
    # 获取矩形框的下边界坐标
    bottom = rect.bottom()

    # 使用 OpenCV 的 rectangle 函数在图像上绘制矩形框
    # 第一个参数是要绘制矩形框的图像,第二个参数是矩形框的左上角坐标 (left, top)
    # 第三个参数是矩形框的右下角坐标 (right, bottom),第四个参数是矩形框的颜色 (0, 255, 0) 表示绿色
    # 第五个参数 3 表示矩形框的线宽
    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)

# 使用 OpenCV 的 imshow 函数显示处理后的图像
# 第一个参数是窗口的名称 'result',第二个参数是要显示的图像
cv2.imshow('result', img)

# 使用 OpenCV 的 waitKey 函数等待用户按键事件
# 该函数会暂停程序的执行,直到用户按下任意键,返回按键的 ASCII 码值,存储在变量 k 中
k = cv2.waitKey()

# 使用 OpenCV 的 destroyAllWindows 函数关闭所有由 OpenCV 创建的窗口
# 释放相关的资源,避免内存泄漏
cv2.destroyAllWindows()

结果:
在这里插入图片描述


http://www.kler.cn/a/570614.html

相关文章:

  • c++ std::stack、std::queue、std::priority_queue使用笔记
  • 系统讨论Qt的并发编程2——介绍一下Qt并发的一些常用的东西
  • Mac上安装Pycharm
  • 《OpenCV》—— dlib库(性别年龄预测)
  • 2024华为OD机试真题-热点网站统计(C++)-E卷-100分
  • 鸿蒙系统分布式文件概述、访问、拷贝
  • K8S学习之基础六:k8s中pod亲和性
  • 单例模式(线程案例)
  • 使用Java操作Excel
  • R语言基础| 基本图形绘制
  • 数据集/API 笔记:新加坡风速 API
  • Linux12-UDP\
  • 打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天)
  • go语言逆向-符号恢复
  • iOS逆向工程概述与学习路线图
  • Mysql面试篇笔记:
  • 【Python】在Windows下配置Python最小环境并在React执行Python脚本
  • SpringCloud系列教程(十一):token验证
  • unidbg 实现 JNI 与 Java 交互
  • ffmpeg源码编译支持cuda