人脸识别(4)--Python3.6+dlib19.4识别实例

来源:互联网 发布:jquery ajax json请求 编辑:程序博客网 时间:2024/05/29 12:26

    • 生成方形框识别人脸
    • 关键线识别人脸

前提条件:
确保python+dlib环境已经搭建成功。搭建步骤可以参考上一篇博客:http://blog.csdn.net/u012842255/article/details/70194609

生成方形框识别人脸

官网代码:

#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt##   This example program shows how to find frontal human faces in an image.  In#   particular, it shows how you can take a list of images from the command#   line and display each on the screen with red boxes overlaid on each human#   face.##   The examples/faces folder contains some jpg images of people.  You can run#   this program on them and see the detections by executing the#   following command:#       ./face_detector.py ../examples/faces/*.jpg##   This face detector is made using the now classic Histogram of Oriented#   Gradients (HOG) feature combined with a linear classifier, an image#   pyramid, and sliding window detection scheme.  This type of object detector#   is fairly general and capable of detecting many types of semi-rigid objects#   in addition to human faces.  Therefore, if you are interested in making#   your own object detectors then read the train_object_detector.py example#   program.  ### COMPILING THE DLIB PYTHON INTERFACE#   Dlib comes with a compiled python interface for python 2.7 on MS Windows. If#   you are using another python version or operating system then you need to#   compile the dlib python interface before you can use this file.  To do this,#   run compile_dlib_python_module.bat.  This should work on any operating#   system so long as you have CMake and boost-python installed.#   On Ubuntu, this can be done easily by running the command:#       sudo apt-get install libboost-python-dev cmake##   Also note that this example requires scikit-image which can be installed#   via the command:#       pip install -U scikit-image#   Or downloaded from http://scikit-image.org/download.html. import sysimport dlibfrom skimage import iodetector = dlib.get_frontal_face_detector()win = dlib.image_window()print("a");for f in sys.argv[1:]:    print("a");    print("Processing file: {}".format(f))    img = io.imread(f)    # The 1 in the second argument indicates that we should upsample the image    # 1 time.  This will make everything bigger and allow us to detect more    # faces.    dets = detector(img, 1)    print("Number of faces detected: {}".format(len(dets)))    for i, d in enumerate(dets):        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"            .format(i, d.left(), d.top(), d.right(), d.bottom()))    win.clear_overlay()    win.set_image(img)    win.add_overlay(dets)    dlib.hit_enter_to_continue()# Finally, if you really want to you can ask the detector to tell you the score# for each detection.  The score is bigger for more confident detections.# Also, the idx tells you which of the face sub-detectors matched.  This can be# used to broadly identify faces in different orientations.if (len(sys.argv[1:]) > 0):    img = io.imread(sys.argv[1])    dets, scores, idx = detector.run(img, 1)    for i, d in enumerate(dets):        print("Detection {}, score: {}, face_type:{}"            .format(d, scores[i], idx[i]))

简略总结:

# -*- coding: utf-8 -*-import sysimport dlibfrom skimage import io#使用dlib自带的frontal_face_detector作为我们的特征提取器detector = dlib.get_frontal_face_detector()#使用dlib提供的图片窗口win = dlib.image_window()#sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始向后依次获取图片路径for f in sys.argv[1:]:    #输出目前处理的图片地址    print("Processing file: {}".format(f))    #使用skimage的io读取图片    img = io.imread(f)    #使用detector进行人脸检测 dets为返回的结果    dets = detector(img, 1)    #dets的元素个数即为脸的个数    print("Number of faces detected: {}".format(len(dets)))    #使用enumerate 函数遍历序列中的元素以及它们的下标    #下标i即为人脸序号    #left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离    #top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离    for i, d in enumerate(dets):print("dets{}".format(d))        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"            .format( i, d.left(), d.top(), d.right(), d.bottom()))    #也可以获取比较全面的信息,如获取人脸与detector的匹配程度    dets, scores, idx = detector.run(img, 1)    for i, d in enumerate(dets):        print("Detection {}, dets{},score: {}, face_type:{}".format( i, d, scores[i], idx[i]))    #绘制图片(dlib的ui库可以直接绘制dets)    win.set_image(img)    win.add_overlay(dets)    #等待点击    dlib.hit_enter_to_continue()

实例效果:
这里写图片描述

关键线识别人脸

官方代码:

#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt##   This example program shows how to find frontal human faces in an image and#   estimate their pose.  The pose takes the form of 68 landmarks.  These are#   points on the face such as the corners of the mouth, along the eyebrows, on#   the eyes, and so forth.##   This face detector is made using the classic Histogram of Oriented#   Gradients (HOG) feature combined with a linear classifier, an image pyramid,#   and sliding window detection scheme.  The pose estimator was created by#   using dlib's implementation of the paper:#      One Millisecond Face Alignment with an Ensemble of Regression Trees by#      Vahid Kazemi and Josephine Sullivan, CVPR 2014#   and was trained on the iBUG 300-W face landmark dataset.##   Also, note that you can train your own models using dlib's machine learning#   tools. See train_shape_predictor.py to see an example.##   You can get the shape_predictor_68_face_landmarks.dat file from:#   http://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2 ## COMPILING THE DLIB PYTHON INTERFACE#   Dlib comes with a compiled python interface for python 2.7 on MS Windows. If#   you are using another python version or operating system then you need to#   compile the dlib python interface before you can use this file.  To do this,#   run compile_dlib_python_module.bat.  This should work on any operating#   system so long as you have CMake and boost-python installed.#   On Ubuntu, this can be done easily by running the command:#       sudo apt-get install libboost-python-dev cmake##   Also note that this example requires scikit-image which can be installed#   via the command:#       pip install -U scikit-image#   Or downloaded from http://scikit-image.org/download.html. import sysimport osimport dlibimport globfrom skimage import ioif len(sys.argv) != 3:    print("Give the path to the trained shape predictor model as the first "    "argument and then the directory containing the facial images./n"    "For example, if you are in the python_examples folder then "    "execute this program by running:/n"    "    ./face_landmark_detection.py shape_predictor_68_face_landmarks.dat ../examples/faces/n"    "You can download a trained facial shape predictor from:/n"    "    http://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2")    exit()predictor_path = sys.argv[1]faces_folder_path = sys.argv[2]detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(predictor_path)win = dlib.image_window()for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):    print("Processing file: {}".format(f))    img = io.imread(f)    win.clear_overlay()    win.set_image(img)    # Ask the detector to find the bounding boxes of each face. The 1 in the    # second argument indicates that we should upsample the image 1 time. This    # will make everything bigger and allow us to detect more faces.    dets = detector(img, 1)    print("Number of faces detected: {}".format(len(dets)))    for k, d in enumerate(dets):        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(            k, d.left(), d.top(), d.right(), d.bottom()))# Get the landmarks/parts for the face in box:    d.shape = predictor(img, d)    print("Part 0: {}, Part 1: {} ...".format(shape.part(0),        shape.part(1)))# Draw the face landmarks on the screen.win.add_overlay(shape)win.add_overlay(dets)dlib.hit_enter_to_continue()

简化代码:

# -*- coding: utf-8 -*-import dlibimport numpyfrom skimage import io#源程序是用sys.argv从命令行参数去获取训练模型,精简版我直接把路径写在程序中了predictor_path = "./data/shape_predictor_68_face_landmarks.dat"#源程序是用sys.argv从命令行参数去获取文件夹路径,再处理文件夹里的所有图片#这里我直接把图片路径写在程序里了,每运行一次就只提取一张图片的关键点faces_path = "./data/3.jpg"#与人脸检测相同,使用dlib自带的frontal_face_detector作为人脸检测器detector = dlib.get_frontal_face_detector()#使用官方提供的模型构建特征提取器predictor = dlib.shape_predictor(predictor_path)#使用dlib提供的图片窗口win = dlib.image_window()#使用skimage的io读取图片img = io.imread(faces_path)#绘制图片win.clear_overlay()win.set_image(img) #与人脸检测程序相同,使用detector进行人脸检测 dets为返回的结果dets = detector(img, 1)#dets的元素个数即为脸的个数print("Number of faces detected: {}".format(len(dets)))#使用enumerate 函数遍历序列中的元素以及它们的下标#下标k即为人脸序号#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离 #top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离for k, d in enumerate(dets):    print("dets{}".format(d))    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(        k, d.left(), d.top(), d.right(), d.bottom()))    #使用predictor进行人脸关键点识别 shape为返回的结果    shape = predictor(img, d)    #获取第一个和第二个点的坐标(相对于图片而不是框出来的人脸)    print("Part 0: {}, Part 1: {} ...".format(shape.part(0),  shape.part(1)))    #绘制特征点    win.add_overlay(shape)#绘制人脸框win.add_overlay(dets)#也可以这样来获取(以一张脸的情况为例)#get_landmarks()函数会将一个图像转化成numpy数组,并返回一个68 x2元素矩阵,输入图像的每个特征点对应每行的一个x,y坐标。def get_landmarks(im):    rects = detector(im, 1)    return numpy.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])#多张脸使用的一个例子def get_landmarks_m(im):    dets = detector(im, 1)    #脸的个数    print("Number of faces detected: {}".format(len(dets)))    for i in range(len(dets)):facepoint = np.array([[p.x, p.y]     for p in predictor(im, dets[i]).parts()])for i in range(68):    #标记点    im[facepoint[i][1]][facepoint[i][0]] = [232,28,8]    return im#打印关键点矩阵print("face_landmark:")print(get_landmarks(img))#等待点击dlib.hit_enter_to_continue()

效果实例:
这里写图片描述

参考文档:http://www.th7.cn/Program/Python/201511/706515.shtml

1 0
原创粉丝点击