当前位置:   article > 正文

【python】dlib人脸识别初步

dlib人脸识别

安装与初步使用

dlib也是从C++转过来的Python模块,正常安装非常痛苦,需要下载cmake还有boost,所以这里推荐用conda来安装,一行代码轻松搞定

conda install -c conda-forge dlib
  • 1

安装之后就可以使用了,dlib最常用的功能就是人脸识别,下面通过调用HOG算法和CNN算法来实现这一功能。

HOG算法人脸识别

import numpy as np
import matplotlib.pyplot as plt
import dlib
img = plt.imread("test.jpg")

detector = dlib.get_frontal_face_detector()
rect = detector(img, 1)[0]
def drawDetector(img, rect):
    p0 = rect.bl_corner()
    cnrs = [rect.bl_corner(), rect.br_corner(), 
        rect.tr_corner(), rect.tl_corner(), 
        rect.bl_corner()]
    xs = [c.x for c in cnrs]
    ys = [c.y for c in cnrs]
    plt.imshow(img)
    plt.plot(xs, ys, c='g')
    plt.axis('off')
    plt.show()

drawDetector(img, rect)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

其中,detector为人脸检测器,其返回值是一个矩形,通过提取矩形的四个点,并连成线之后,就可以把检测到的人脸框选出来,最后得到的效果如下

在这里插入图片描述

get_frontal_face_detectordlib默认的人脸检测器,使用的是HOG算法,其基本思想是计算图像的梯度和方向,然后用直方图对梯度值进行统计得到特征,并将这些特征送入SVM,从而实现分类,并检测出人脸。

CNN人脸识别

提到CNN算法,就基本可以断定想实现某种功能,是需要一个预先训练好的模型才能工作,接下来需要用到的CNN模型,在这里下载mmod_human_face_detector.dat.bz2文件。

下载完成后,解压并调用

p = r"mmod_human_face_detector.dat"     # 模型路径
cnnDetector = dlib.cnn_face_detection_model_v1(p)
  • 1
  • 2

在检测器创建后,其调用方法与内置检测器是完全相同的,但返回值对Rectangle类型进行了二次封装,需要进行调用,代码如下,其识别结果与内置的HOG是相同的。

cnnRect = cnnDetector(img, 1)[0]
drawDetector(img, cnnRect.rect)
  • 1
  • 2

CNN车辆识别

车辆识别

除了人脸识别模型之外,dlib还提供了车辆模型

  • mmod_front_and_rear_end_vehicle_detector.dat
  • mmod_rear_end_vehicle_detector.dat

接下来测试一下这两个模型的识别效果

p1 = r"mmod_front_and_rear_end_vehicle_detector.dat"
p2 = r"mmod_rear_end_vehicle_detector.dat"
fD = dlib.cnn_face_detection_model_v1(p1)
rD = dlib.cnn_face_detection_model_v1(p2)
  • 1
  • 2
  • 3
  • 4

然后打开一张车辆的图像进行识别

img = plt.imread(r"C:\Users\Laser\Downloads\test.jpg")
fRects = fD(img)
rRects = rD(img)
  • 1
  • 2
  • 3

由于图像中有多个车辆,所以重做一个展示函数

def getXY(rect):
    cnrs = [rect.bl_corner(), rect.br_corner(), 
        rect.tr_corner(), rect.tl_corner(), 
        rect.bl_corner()]
    xs = [c.x for c in cnrs]
    ys = [c.y for c in cnrs]
    return xs, ys
    


def drawDetector(img, rects, ax):
    for r in rects:
        xs, ys = getXY(r.rect)
        ax.plot(xs, ys)
    ax.imshow(img)
    plt.axis('off')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然后绘图

fig = plt.figure()
ax = fig.add_subplot(1,2,1)
drawDetector(img, fRects, ax)
ax = fig.add_subplot(1,2,2)
drawDetector(img, rRects, ax)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

效果如下

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/467206
推荐阅读
相关标签
  

闽ICP备14008679号