Python--Dlib库人脸检测

Dlib

一些关于dlib的介绍
在这里主要实现一下人脸检测,dlib人脸检测主要是基于HOG-SVM,与opencv人脸检测【之前写的博客】的人脸检测有区别,相比之下,dlib识别精度更高,在微小遮挡的情况下也能识别。(不过也要具体情况具体分析,某些人脸反而opencv能检测出来)但是dlib人脸识别的图片大小最好大于80X80,才会有比较好的识别效果。另外,dlib还能进行一个68个关键点的定位。
如果想要更高的识别精度,因为我之前做实验识别的数据都是单人头像,所以我直接简单粗暴的把这两个结合在一起了。写个if else哈哈哈哈哈
不过话说,安装dlib库还真麻烦,需要另外下载好多其他库,还要下载个VS。我记得我安装找了好多教程,废了点功夫才装好。
实现:

import dlib
import cv2

# 使用 Dlib 的正面人脸检测器 frontal_face_detector
detector = dlib.get_frontal_face_detector()

# 图片所在路径
img = cv2.imread(r'C:\Users\lenovo\Desktop\0.jpg')
# img = cv2.resize(img,(64,64))
# img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)


# 生成 Dlib 的图像窗口
# win = dlib.image_window()
# win.set_image(img)

# 使用detector检测器来检测图像中的人脸
# dlib.pyramid_up(img)
faces = detector(img, 1)
if len(faces) >= 1:
    print("人脸数 / faces in all:", len(faces))
    for i, d in enumerate(faces):
        print("第", i + 1, "个人脸的矩形框坐标:",
              "left:", d.left(), '\t', "right:", d.right(), '\t', "top:", d.top(), '\t', "bottom:", d.bottom())
        img=cv2.rectangle(img, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2)

else:
    print("no face")

cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)

# 绘制矩阵轮廓
# win.add_overlay(faces)
# 保持图像
# dlib.hit_enter_to_continue()

测试一张图:
和我上一篇博客测试的图一样,结果我发现dlib并没有全部识别出。所以说还是看具体自己要识别的数据集的。
Python--Dlib库人脸检测_第1张图片
我又换了一张像素比较大的试了一下,可以全部识别了。
Python--Dlib库人脸检测_第2张图片
关键点定位:

# 实例化 detector
	detector = dlib.get_frontal_face_detector()
	predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
    img = cv2.imread(r'C:\Users\lenovo\Desktop\2.JPG')

    # 人脸数rects
    rects = detector(img, 1)
    print(len(rects))
    print(rects)
    for i in range(len(rects)):
        landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])
        print(predictor(img, rects[i]).parts())
        for idx, point in enumerate(landmarks):
            # 68点的坐标
            pos = (point[0, 0], point[0, 1])
            print(idx, pos)

            # 利用cv2.circle给每个特征点画一个圈,共68个
            cv2.circle(img, pos, 5, color=(0, 255, 0))
            # 利用cv2.putText输出1-68
            font = cv2.FONT_HERSHEY_SIMPLEX
            # cv2.putText(img, str(idx + 1), pos, font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)

    cv2.namedWindow("img", 2)
    cv2.imshow("img", img)
    cv2.waitKey(0)

测试一张图
原图
Python--Dlib库人脸检测_第3张图片
结果
Python--Dlib库人脸检测_第4张图片
关键点要加载的参数:
链接:https://pan.baidu.com/s/1KcdIckj9vfs1sMka87EJRg
提取码:ju3e
完整版见my github
其中有实现批量处理的代码。

你可能感兴趣的:(定位,人脸识别,opencv,图像识别)