python dlib学习(八):训练人脸特征点检测器

26 篇文章 21 订阅
24 篇文章 5 订阅

前言

前面的博客(python dlib学习(二):人脸特征点标定)介绍了使用dlib识别68个人脸特征点,但是当时使用的是dlib官方给出的训练好的模型,这次要自己训练一个特征点检测器出来。当然,想要达到state-of-art的效果需要自己调参,这也是一个苦差了。后面会给出训练和测试的程序,完整工程的下载链接我会放在博文的最后。

数据集准备

这里可以选择自己制作也可以使用dlib源码中提供的测试用的数据集。这些图片存在源码目录中的/examples/faces里面。

先看看源码中提供的数据集吧:
这里写图片描述
数据集不大,作为测试使用足够了。如果希望达到state-of-art的效果,还是需要增大数据集,以及调试出合适的参数。
dlib中的人脸特征点检测算法都是基于CVPR 2014的One Millisecond Face Alignment with an Ensemble of Regression Trees这篇论文实现。自己调参的话,还是有必要读读这篇论文。

训练前还需要在数据集中打好label,这些label都保存在那几个xml文件当中。
打开training_with_face_landmarks.xml
这里写图片描述
里面保存了每张图片中的人脸的位置,以及68个特征点的位置信息。

打label时需要使用到dlib提供的imglab工具。
有关imlab的使用,我在这篇博文中有介绍: python dlib学习(六):训练自己的模型进行识别
imglab很容易使用,在这里不做赘述。如果想自己制作数据集训练请自行使用imglab制作。
使用imglab打开xml文件看看:
这里写图片描述
密密麻麻地标注好了人脸的位置和特征点的位置。

训练

上代码。

# coding: utf-8
# 
#   This example program shows how to use dlib's implementation of the paper:
#   One Millisecond Face Alignment with an Ensemble of Regression Trees by
#   Vahid Kazemi and Josephine Sullivan, CVPR 2014

import os
import cv2
import dlib
import glob

current_path = os.getcwd()
faces_path = current_path + '/examples/faces'

# 训练部分
# 参数设置
options = dlib.shape_predictor_training_options()
options.oversampling_amount = 300
options.nu = 0.05
options.tree_depth = 2
options.be_verbose = True

# 导入打好了标签的xml文件
training_xml_path = os.path.join(faces_path, "training_with_face_landmarks.xml")
# 进行训练,训练好的模型将保存为predictor.dat
dlib.train_shape_predictor(training_xml_path, "predictor.dat", options)
# 打印在训练集中的准确率
print "\nTraining accuracy:{0}".format(dlib.test_shape_predictor(training_xml_path, "predictor.dat"))

# 导入测试集的xml文件
testing_xml_path = os.path.join(faces_path, "testing_with_face_landmarks.xml")
# 打印在测试集中的准确率
print "\Testing accuracy:{0}".format(dlib.test_shape_predictor(testing_xml_path, "predictor.dat"))

训练结果

程序运行后,会打印参数信息,随后开始训练:
这里写图片描述
训练完成:
这里写图片描述

测试

我们需要导入之前训练好的模型文件predictor.dat,使用其进行识别。如何检测并进行显示,就不注释了,可以参考我以前的博客:python dlib学习(二):人脸特征点标定

# coding: utf-8
# 
#   This example program shows how to use dlib's implementation of the paper:
#   One Millisecond Face Alignment with an Ensemble of Regression Trees by
#   Vahid Kazemi and Josephine Sullivan, CVPR 2014

import os
import cv2
import dlib
import glob

# 测试部分
# 导入训练好的模型文件
predictor = dlib.shape_predictor("predictor.dat")

detector = dlib.get_frontal_face_detector()
print("Showing detections and predictions on the images in the faces folder...")
for f in glob.glob(os.path.join(faces_path, "*.jpg")):
    print("Processing file: {}".format(f))
    img = cv2.imread(f)
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dets = detector(img2, 1)
    print("Number of faces detected: {}".format(len(dets)))
    for index, face in enumerate(dets):
        print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))

        # left = face.left()
        # top = face.top()
        # right = face.right()
        # bottom = face.bottom()
        # cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
        # cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)
        # cv2.imshow(f, img)

        shape = predictor(img, face)
        # print(shape)
        # print(shape.num_parts)
        for index, pt in enumerate(shape.parts()):
            print('Part {}: {}'.format(index, pt))
            pt_pos = (pt.x, pt.y)
            cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
            #print(type(pt))
        #print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
        cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)
        cv2.imshow(f, img)

cv2.waitKey(0)
cv2.destroyAllWindows()

测试结果

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

完整工程下载链接;
http://download.csdn.net/download/hongbin_xu/10115166

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值