赞
踩
dlib
也是从C++转过来的Python模块,正常安装非常痛苦,需要下载cmake
还有boost
,所以这里推荐用conda
来安装,一行代码轻松搞定
conda install -c conda-forge dlib
安装之后就可以使用了,dlib
最常用的功能就是人脸识别,下面通过调用HOG算法和CNN算法来实现这一功能。
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模型,在这里下载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)
车辆识别
除了人脸识别模型之外,dlib还提供了车辆模型
接下来测试一下这两个模型的识别效果
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()
效果如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。