文章目录
- 安装与初步使用
- HOG算法人脸识别
- CNN人脸识别
- CNN车辆识别
安装与初步使用
dlib
也是从C++转过来的Python模块,正常安装非常痛苦,需要下载cmake
还有boost
,所以这里推荐用conda
来安装,一行代码轻松搞定
conda install -c conda-forge dlib
安装之后就可以使用了,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)
其中,detector为人脸检测器,其返回值是一个矩形,通过提取矩形的四个点,并连成线之后,就可以把检测到的人脸框选出来,最后得到的效果如下
get_frontal_face_detector是dlib
默认的人脸检测器,使用的是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)
在检测器创建后,其调用方法与内置检测器是完全相同的,但返回值对Rectangle
类型进行了二次封装,需要进行调用,代码如下,其识别结果与内置的HOG
是相同的。
cnnRect = cnnDetector(img, 1)[0]
drawDetector(img, cnnRect.rect)
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)
然后打开一张车辆的图像进行识别
img = plt.imread(r"C:\Users\Laser\Downloads\test.jpg")
fRects = fD(img)
rRects = rD(img)
由于图像中有多个车辆,所以重做一个展示函数
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')
然后绘图
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()
效果如下