使用dlib应用(HOG和CNN)进行人脸检测

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用dlib应用(HOG和CNN)进行人脸检测相关的知识,希望对你有一定的参考价值。

这篇博客将介绍如何使用dlib库应用HOG+线性SVM和CNNs执行人脸检测。

dlib库是人脸识别最常用的软件包之一,其中内置了两种人脸检测方法:

  • HOG+线性SVM人脸检测器:精确高效的人脸检测算法,精确度比MMOD—CNN稍低一些(不能容忍视角旋转的变化),但要高于OpenCV的Haar级联。
  • MMOD-CNN人脸检测器:既高度准确又非常健壮,能够从不同的视角、光照条件和遮挡条件下检测人脸。可以在NVIDIA GPU上运行,使其速度超快!该模型需要更多的计算(速度较慢)。

如果可以访问一个GPU,可选择dlib的MMOD-CNN人脸检测器,从而提高实时人脸检测的速度。MMOD—CNN人脸检测器与GPU的结合简直是天作之合——既能获得深度神经网络的精确度,又能获得计算成本较低的模型的速度。

1. 效果图

1.1 dlib的HOG+线性SVM人脸检测器效果图

效果图1:单个人脸正确检测
在这里插入图片描述
效果图2:多个面部人脸也均正常检测,耗时约0.07秒,这意味着可以在视频流场景中每秒处理15帧
在这里插入图片描述
效果图3:在旋转或视角变化的情况下表现不佳。(有一个未检测到)
在这里插入图片描述效果图4:多个人脸并没有都检测到。可以使用dlib的MMOD-CNN人脸检测器来提高人脸检测精度,并检测该图像中的所有人脸。
在这里插入图片描述

1.2 dlib的MMOD-CNN人脸检测器效果图

CNN单个人脸检测效果图:
在这里插入图片描述
CNN 俩个人脸效果图如下:
在这里插入图片描述CNN 多个人脸检测效果图:
在这里插入图片描述

2. 原理

2.1 HOG+线性SVM VS MMOD CNN

  • HOG + Linear SVM(Histogram of Oriented Gradients): dlib.get_frontal_face_detector() 返回预训练的人脸检测模型,快速且高效;
  • MMOD CNN(Max-Margin): dlib.cnn_face_detection_model_v1(modelPath) 接受单个模型参数,返回更健壮的基于深度学习的预先训练好的模型;

2.2 使用哪种dlib人脸检测仪?

  • 如果使用CPU或者GPU(速度更快),可使用dlib的MMOD CNN人脸检测器。它比HOG+线性SVM人脸检测算法更精确、更健壮。

  • 假设仅有一个CPU,这种时候基于速度的限制,如果愿意容忍精度稍低一点可选择HOG+线性支持向量机——它仍然是一个准确的人脸检测器,并显著比OpenCV的Haar级联人脸检测器更准确。

3. 源码

模型下载地址:http://dlib.net/files/mmod_human_face_detector.dat.bz2

3.1 HOG + Linear SVM人脸检测源码

# USAGE
# python hog_face_detection.py --image images/ym.jpg

# 用dlib实现HOG+线性SVM人脸检测
# 该算法快速高效。从定向梯度(HOG)描述符的直方图的工作原理来看,它对旋转和视角的变化不具有不变性。
# 也可以使用MMOD CNN人脸检测器,得到更健壮的人脸检测功能;
# 导入必要的包
import argparse
import time

import cv2
import dlib
import imutils
from pyimagesearch.helpers import convert_and_trim_bb

# 构建命令行参数及解析
# --image 输入图像路径
# --upsample 对图像向上采样的次数(为了在较大的输入图像检测小的人脸,可能希望提高输入图像的分辨率,从而使小脸显得更大。这样滑动窗口就能检测到面部。)
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True,
                help="path to input image")
ap.add_argument("-u", "--upsample", type=int, default=1,
                help="# of times to upsample")
args = vars(ap.parse_args())

# 加载dlib的 HOG + 线性SVM面部检测器
print("[INFO] loading HOG + Linear SVM face detector...")
detector = dlib.get_frontal_face_detector()

# 从磁盘加载输入图像,等比例缩放,转换BGR通道为RGB通道图像(dlib期望RGB通道图像)
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 执行dlib面部检测,并计算耗时
start = time.time()
print("[INFO[ performing face detection with dlib...")
rects = detector(rgb, args["upsample"])
end = time.time()
print("[INFO] face detection took {:.4f} seconds".format(end - start))

# 转换返回值dlib矩形边界框为opencv矩形边界框,并确保落在图像内
boxes = [convert_and_trim_bb(image, r) for r in rects]

# 遍历边界框
for (x, y, w, h) in boxes:
    # 在图像上绘制边界框
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 展示输出图像
cv2.imshow("HOG + Linear SVM Output", image)
cv2.waitKey(0)

3.2 CNN人脸检测源码

# USAGE
# python cnn_face_detection.py --image images/drl.jpg

# 使用dlib基于深度学习的MMOD-CNN人脸检测器可以获得更高的准确度。
# 导入必要的包
import argparse
import time

import cv2
import dlib
import imutils
from pyimagesearch.helpers import convert_and_trim_bb

# 构建命令行参数及解析
# --image 输入图像路径
# --model 预先训练好的基于深度学习的模型路径:mmod_human_face_detector.dat
# --upsample 对图像向上采样的次数(为了在较大的输入图像检测小的人脸,可能希望提高输入图像的分辨率,从而使小脸显得更大。这样滑动窗口就能检测到面部。)
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True,
                help="path to input image")
ap.add_argument("-m", "--model", type=str,
                default="mmod_human_face_detector.dat",
                help="path to dlib's CNN face detector model")
ap.add_argument("-u", "--upsample", type=int, default=1,
                help="# of times to upsample")
args = vars(ap.parse_args())

# 加载dlib的 CNN面部检测器
print("[INFO] loading CNN face detector...")
detector = dlib.cnn_face_detection_model_v1(args["model"])

# 从磁盘加载输入图像,等比例缩放,转换BGR通道为RGB通道图像(dlib期望RGB通道图像)
image = cv2.imread(args["image"])
image = imutils.resize(image, width=600)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 执行dlib面部检测,并计算耗时
start = time.time()
print("[INFO[ performing face detection with dlib...")
results = detector(rgb, args["upsample"])
end = time.time()
print("[INFO] face detection took {:.4f} seconds".format(end - start))

# 转换返回值dlib矩形边界框为opencv矩形边界框,并确保落在图像内
# - Dlib的HOG+线性SVM检测器返回一个矩形列表对象;
# - MMOD CNN对象检测器返回一个结果对象列表,每个对象都有自己的矩形(因此使用r.rect)
boxes = [convert_and_trim_bb(image, r.rect) for r in results]

# 遍历边界框
for (x, y, w, h) in boxes:
    # 在图像上绘制边界框
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 展示输出图像
cv2.imshow("CNN Output", image)
cv2.waitKey(0)

参考

以上是关于使用dlib应用(HOG和CNN)进行人脸检测的主要内容,如果未能解决你的问题,请参考以下文章

人脸检测——HOG特征

OpenCV vs Dlib 人脸检测比较分析

使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸

dlib 的 CNN 人脸检测器使用哪种架构?

[OpenCV实战]2 人脸识别算法对比

人脸检测和识别(中文标记)完整项目源代码(基于深度学习+python3.6+dlib+PIL+CNN+(tensorflowkeras)10分钟实现 区分欢乐颂中人物详细图文教程和完整项目代码)