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

1.人脸检测工具概述

1.Dlib

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

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

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

  1. 使用apt安装(简单但可能会失败)
sudo apt-get update
sudo apt-get install libdlib-dev 	//OpenCV的安装配置可参考我的其他文章
  1. 源码编译安装(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主目录

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 ../dlib
tj@ubuntu:/usr/include/dlib-19.24/build$ sudo make -j4
tj@ubuntu:/usr/include/dlib-19.24/build$ make install

  1. 在QT中导入dlib
dpkg -L libdlib-dev	//查看自己的dlib安装位置(使用apt,若源码安装则直接上一步查看)

//.pro
INCLUDEPATH += /usr/local/include	
LIBS += /usr/local/lib/libopencv_* -ldlib	//导入OpenCV和dlib库文件

//.h
#include <iostream>
#include <QPixmap>
#include <opencv2/opencv.hpp>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing.h>   		//导入头文件

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 <dlib/queue.h> 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安装配置

  1. 下载上文提到的dlib官方提供的人脸面部关键点检测文件
    下载链接
    找到shape_predictor_68_face_landmarks.dat.bz2并下载到Ubuntu
  2. 解压文件
  3. 创建测试项目
//.h
#include <QMainWindow>
#include <QPixmap>
#include <QDebug>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing.h>

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() << "open camera faild!";
    }
    Mat frame;
    namedWindow("Face Recognition", cv::WINDOW_NORMAL);

    while (true) {
        // 读取帧
        cap >> frame;

        // 将OpenCV图像转换为dlib图像
        cv_image<dlib::bgr_pixel> dlibImage(frame);

        // 使用人脸检测器检测人脸
        std::vector<dlib::rectangle> 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 < shape.num_parts(); ++i) {
                cv::circle(frame, cv::Point(shape.part(i).x(), shape.part(i).y()), 2, cv::Scalar(255, 0, 0), -1);
            }
        }

        // 显示结果
        cv::imshow("Face Recognition", frame);

        // 按 'q' 键退出循环
        if (cv::waitKey(1) == 'q') {
            break;
        }
    }

在这里插入图片描述

至此安装配置并测试dlib成功!(学习记录,后续更新,谢谢点赞收藏)

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
人脸识别门禁系统是一种基于人脸识别技术的智能门禁系统,其可通过对人脸进行采集、识别和比对,实现对门禁的控制和管理。本文将详细阐述基于python+openCV+dlib+mysql的人脸识别门禁系统的设计与实现。 一、技术选型 本系统主要采用以下技术: 1. Python:作为主要编程语言,用于实现整个系统的逻辑控制和算法设计。 2. OpenCV:作为图像处理库,用于实现人脸检测特征提取和人脸识别等核心功能。 3. Dlib:作为人脸识别库,用于实现人脸特征检测人脸识别等功能。 4. MySQL:作为数据库系统,用于存储人脸特征和相关信息。 二、系统设计 本系统主要包括以下功能模块: 1. 人脸采集模块:用于采集用户的人脸图像,并将其存储到本地或远程数据库中。 2. 人脸检测模块:用于检测人脸区域,提取人脸特征,并将其存储到数据库中。 3. 人脸识别模块:用于识别用户的人脸特征,并与数据库中的人脸特征进行比对,以确定用户身份。 4. 门禁控制模块:根据用户身份结果,控制门禁的开关。 5. 数据库管理模块:用于管理数据库中的人脸特征和相关信息。 三、系统实现 1. 人脸采集模块 人脸采集模块主要是通过摄像头对用户的人脸进行拍摄和保存。代码如下: ```python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() cv2.imshow("capture", frame) if cv2.waitKey(1) & 0xFF == ord('q'): #按q键退出 cv2.imwrite("face.jpg", frame) #保存人脸图像 break cap.release() cv2.destroyAllWindows() ``` 2. 人脸检测模块 人脸检测模块主要是通过OpenCV中的CascadeClassifier类进行人脸检测,再通过Dlib中的shape_predictor类进行人脸特征检测特征提取。代码如下: ```python import cv2 import dlib detector = dlib.get_frontal_face_detector() #人脸检测器 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") #特征检测器 img = cv2.imread("face.jpg") #读取人脸图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换为灰度图像 faces = detector(gray, 0) #检测人脸 for face in faces: landmarks = predictor(gray, face) #检测特征点 for n in range(68): x = landmarks.part(n).x y = landmarks.part(n).y cv2.circle(img, (x, y), 2, (0, 255, 0), -1) #绘制特征点 cv2.imshow("face", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. 人脸识别模块 人脸识别模块主要是通过Dlib中的face_recognition类进行人脸特征提取和比对。代码如下: ```python import face_recognition known_image = face_recognition.load_image_file("known_face.jpg") #读取已知的人脸图像 unknown_image = face_recognition.load_image_file("unknown_face.jpg") #读取待识别的人脸图像 known_encoding = face_recognition.face_encodings(known_image)[0] #提取已知人脸的特征 unknown_encoding = face_recognition.face_encodings(unknown_image)[0] #提取待识别人脸的特征 results = face_recognition.compare_faces([known_encoding], unknown_encoding) #比对人脸特征 if results[0]: print("Match") else: print("No match") ``` 4. 门禁控制模块 门禁控制模块主要是通过GPIO控制门禁的开关。代码如下: ```python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) GPIO.output(11, GPIO.HIGH) #开门 time.sleep(5) #等待5秒 GPIO.output(11, GPIO.LOW) #关门 GPIO.cleanup() #清理GPIO资源 ``` 5. 数据库管理模块 数据库管理模块主要是通过MySQLdb模块实现对MySQL数据库的连接和操作,包括新建数据库、新建表、插入数据、查询数据等。代码如下: ```python import MySQLdb #连接数据库 conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="test", charset="utf8") #新建表 cursor = conn.cursor() sql = "CREATE TABLE `face` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `encoding` text NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" cursor.execute(sql) #插入数据 name = "张三" encoding = "0.1,0.2,0.3,0.4" sql = "INSERT INTO `face` (`name`, `encoding`) VALUES (%s, %s)" cursor.execute(sql, (name, encoding)) conn.commit() #查询数据 sql = "SELECT * FROM `face` WHERE `name`=%s" cursor.execute(sql, (name,)) result = cursor.fetchone() print(result) cursor.close() conn.close() ``` 四、总结 本文主要介绍了基于python+openCV+dlib+mysql的人脸识别门禁系统的设计与实现。该系统主要采用了Python作为主要编程语言,OpenCVDlib作为图像处理和人脸识别库,MySQL作为数据库系统。通过对这些技术的应用,实现了人脸采集、检测、识别和门禁控制等核心功能。该系统可以应用于各类场景的门禁控制和身份验证,具有较高的实用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值