【OpenCV人脸识别】基于深度学习(Dlib+HOG特征)的人脸识别

您所在的位置:网站首页 人脸识别中五官特征受年龄变化影响最小的是 【OpenCV人脸识别】基于深度学习(Dlib+HOG特征)的人脸识别

【OpenCV人脸识别】基于深度学习(Dlib+HOG特征)的人脸识别

2024-07-13 04:45| 来源: 网络整理| 查看: 265

1.人脸检测工具概述 1.Dlib

Dlib 是一个开源的C++机器学习和计算机视觉库,用于解决多种任务,包括图像处理、计算机视觉、机器学习、数据分析等。Dlib 提供了一系列工具和算法,可用于开发各种应用,从人脸检测和识别,到对象检测、形状预测、图像分类等。

以下是 Dlib 主要的特点和功能:

人脸检测和识别: Dlib 提供了高性能的人脸检测器,基于 HOG 特征和深度学习模型。它还包括面部关键点检测和人脸识别的功能。图像处理和计算机视觉: Dlib 包含了各种图像处理和计算机视觉算法,如边缘检测、图像滤波、形态学操作等。对象检测: Dlib 提供了对象检测的工具,适用于检测不同类型的对象,包括人、车辆等。它使用了级联分类器和深度学习模型。形状预测: Dlib 具有面部关键点预测功能,可用于预测图像中对象的形状。机器学习: Dlib 包含了一些机器学习工具,包括支持向量机(SVM)、线性回归等。这使得 Dlib 在模式识别和分类任务中很有用。深度学习: Dlib 集成了深度学习模块,支持使用预训练的神经网络模型进行图像分类和特征提取。跨平台性: Dlib 被设计为一个跨平台的库,可以在多个操作系统上运行,包括 Windows、Linux、macOS 等。高性能: Dlib 注重性能,其代码经过优化,适用于实时应用场景。

Dlib 被广泛用于学术研究、工业应用和个人项目中,是一个强大而灵活的库,适用于多种计算机视觉和机器学习任务。人脸识别只是它其中的一个子集。

官方网站:http://dlib.net/

2.HOG与Haar特征的区别

Haar特征: Haar特征是一种基于小波的图像特征,通常用于对象检测,尤其是人脸检测。在Haar特征中,图像被划分成不同大小和形状的矩形区域,然后计算这些矩形区域内像素强度之和或差异。通过对这些特征的组合,可以训练一个强分类器,用于检测目标。

HOG特征: HOG是一种基于梯度方向的图像特征,通常用于目标检测,如行人检测。HOG特征的计算涉及将图像划分成小的局部区域,计算每个区域内梯度方向的直方图。通过对这些局部直方图的组合,可以得到整个图像的特征向量。支持向量机(SVM)等分类器可以使用这些特征进行目标检测。

这两种特征提取方法都是为了捕捉图像中有用的结构信息,以便于训练分类器进行目标检测。选择使用哪种方法通常取决于应用的需求、计算资源和性能要求。在实际应用中,HOG特征在人脸检测、行人检测等任务上表现得相当出色。 Dlib是一个C++库,提供了许多计算机视觉和机器学习的工具和算法。Dlib包括了用于人脸检测、面部关键点检测、图像处理等功能的实现。在人脸检测中,Dlib使用了基于HOG(Histogram of Oriented Gradients)特征的方法,而不是Haar特征。HOG是一种更复杂和灵活的特征提取方法,相较于Haar特征,HOG更适用于不同场景的人脸检测。

2.Dlib模型训练

训练深度学习模型通常对机器的要求较高,因为训练深度神经网络需要大量的计算资源和内存。以下是一些对机器要求的方面: 计算资源:训练深度学习模型通常需要大量的计算资源,尤其是在大规模数据集上进行训练时。使用图形处理单元(GPU)可以显著加速深度学习训练过程。更高端的GPU 和专门设计的深度学习加速卡(如NVIDIA的Tesla卡)能够提供更好的性能。

内存: 深度学习模型的训练可能需要大量的内存,特别是在处理大规模数据集时。具有足够内存的机器能够更好地支持大型模型和数据。

存储空间: 训练深度学习模型可能会生成大量的中间模型和日志文件,需要足够的存储空间。此外,大规模数据集的存储也需要考虑。

多核处理器: 训练深度学习模型时,能够使用多核处理器进行并行计算会提高效率。多核 CPU 或多 GPU 系统能够更快地完成训练过程。

网络带宽: 当模型和数据集存储在远程服务器上时,快速的网络连接可以加速数据传输,减少训练时间。

由于个人电脑性能等各方面资源有限,以下是Dlib库为使用者提供的已经训练好的模型可供使用

1. 人脸检测:

Dlib 采用含有方向的梯度直方图(histogram of oriented gridients,HOG)和支持向量机(support vector machine,SVM)算法预训练人脸检测器。该检测器是通过训练得到的,已经在大规模数据集上进行了训练。可以使用 get_frontal_face_detector() 函数获取该预训练的人脸检测器。

2. 面部关键点检测:

Dlib 使用级联回归(ensemble of regression trees,ERT)算法实现脸部68个关键点标定及眼睛和嘴巴的定位,也称为形状预测器(shape_predictor)。可以使用shape_predictor_68_face_landmarks.dat 文件加载这个预训练的模型,该模型包含了 68 个面部关键点的位置信息。

3. 人脸识别:

Dlib 的人脸识别器使用深度学习模型,通常是基于 ResNet 架构的深度卷积神经网络。这个模型是通过在大规模数据集上进行训练得到的,用于提取人脸的特征向量。可以使用 dlib_face_recognition_resnet_model_v1.dat 文件加载这个预训练的人脸识别模型。

2.安装配置开发环境 1.在Ubuntu下安装dlib库 使用apt安装(简单但可能会失败) sudo apt-get update sudo apt-get install libdlib-dev //OpenCV的安装配置可参考我的其他文章 源码编译安装(apt安装运行失败可采取此方式) //在编译dlib之前,安装以下依赖项: sudo apt-get install build-essential cmake //可以从dlib的GitHub仓库上下载源码(安装了git工具): git clone https://github.com/davisking/dlib.git //也可官网下载安装包(推荐) http://dlib.net/files/

这里我们解压到/usr/include后进入dlib主目录 dlib官方提到:最后,请注意,当启用了至少SSE2指令时,面部检测器速度最快。因此,如果使用的是带有Intel或AMD芯片的PC,应该至少启用SSE2指令。如果使用cmake编译此程序,可以在创建构建项目时使用以下命令之一来启用它们: cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON 这将设置适当的编译器选项(可以查看自己的cpu是否支持这些指令)

tj@ubuntu:~/Downloads$ sudo cp -r dlib-19.24/usr/include/ tj@ubuntu:~/Downloads$ cd /usr/include/dlib-19.24/ tj@ubuntu:/usr/include/dlib-19.24$ ls CMakeLists.txt documentation.html LICENSE.txt README.md dlib examples MANIFEST.in setup.py docs ISSUE_TEMPLATE.md python_examples tools tj@ubuntu:/usr/include/dlib-19.24$ sudo mkdir build tj@ubuntu:/usr/include/dlib-19.24$ cd build/ tj@ubuntu:/usr/include/dlib-19.24/build$ sudo cmake -DCMAKE_BUILD_TYPE=Release -DDLIB_GENERATE_PKGCONFIG=ON -DUSE_AVX_INSTRUCTIONS=ON ../dlib tj@ubuntu:/usr/include/dlib-19.24/build$ sudo make -j6 tj@ubuntu:/usr/include/dlib-19.24/build$ sudo make install 在QT中导入dlib dpkg -L libdlib-dev //查看自己的dlib安装位置(使用apt,若源码安装则直接上一步查看) //.pro INCLUDEPATH += /usr/local/include LIBS += /usr/local/lib/libopencv_* -ldlib //导入OpenCV和dlib库文件 //.h #include #include #include #include #include #include //导入头文件 using namespace std; using namespace dlib;

对于上一步,如果使用apt安装出错(提示大量函数未定义),我们就使用源码编译的方式,按照上述步骤编译并且安装后,我们可以在 /usr/local/include/目录下查看到安装好的dlib库(下图),这时我们在QT中链接上dlib的库文件,如果我们使用 INCLUDEPATH += /usr/local/include /usr/local/include/dlib 会报几万个错误(吓人),经过其编译器提示我们只需将其改为INCLUDEPATH += /usr/local/include即与使用OpenCV时一样,也就是只需要将链接目录设置为dlib所在的上层目录即可,原文如下,可参考: /* You are getting this error because you have added the dlib folder to your compiler’s include search path.

You should NOT add the dlib folder itself to your compiler’s include path. Doing so will cause the build to fail because of name collisions (such as dlib/string.h and string.h from the standard library). Instead you should add the folder that contains the dlib folder to your include search path and then use include statements of the form #include or #include “dlib/queue.h”. This will ensure that everything builds correctly.

XCode: The XCode IDE often puts all folders that it knows about into the compiler search path. So if you are using XCode then either don’t drag the whole dlib folder into the project or alternatively modify your XCode project settings to not auto-add all folders to the include path. Instead just make sure that the dlib folder is itself inside a folder in your include path. */

在这里插入图片描述最后,如果按照源码编译,我们的pro文件中应该为如图所示: 在这里插入图片描述

2.测试dlib安装配置 下载上文提到的dlib官方提供的人脸面部关键点检测文件 下载链接 找到shape_predictor_68_face_landmarks.dat.bz2并下载到Ubuntu解压文件创建测试项目 //.h #include #include #include #include #include #include #include #include using namespace std; using namespace dlib; using namespace cv; //.cpp // 创建dlib的人脸检测器 frontal_face_detector detector = get_frontal_face_detector(); // 创建dlib的人脸识别器 shape_predictor sp; deserialize("/home/tj/shape_predictor_68_face_landmarks.dat") >> sp; VideoCapture cap; // 打开摄像头 cap.open(0); if (!cap.isOpened()) { qDebug() frame; // 将OpenCV图像转换为dlib图像 cv_image dlibImage(frame); // 使用人脸检测器检测人脸 std::vector faces = detector(dlibImage); // 对每个检测到的人脸进行处理 for (const auto& face : faces) { // 获取面部关键点 dlib::full_object_detection shape = sp(dlibImage, face); // 在图像上绘制人脸框 cv::rectangle(frame, cv::Point(face.left(), face.top()), cv::Point(face.right(), face.bottom()), cv::Scalar(0, 255, 0), 2); // 在图像上绘制面部关键点 for (unsigned int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3