如何在dlib的面部标记检测程序中获取点的坐标位置?

6

在dlib中有一个示例python程序,可以检测面部标记的位置。 face_landmark_detection.py

该程序可以检测面部特征,并用原始照片中的点和线表示标记。

我想知道是否可以获得每个点的坐标位置。比如a(10, 25)。'a'代表嘴角。

稍微修改了程序以一次处理一张图片后,我尝试输出dets和形状的值,但没有成功。

>>>print(dets)
<dlib.dlib.rectangles object at 0x7f3eb74bf950>
>>>print(dets[0])
[(1005, 563) (1129, 687)]

表示面部标记点的参数以及参数的数据类型仍然未知。 这是简化后的代码:

import dlib
from skimage import io

#shape_predictor_68_face_landmarks.dat is the train dataset in the same directory
predictor_path = "shape_predictor_68_face_landmarks.dat"

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
win = dlib.image_window()

#FDT.jpg is the picture file to be processed in the same directory
img = io.imread("FDT.jpg")

win.set_image(img)

dets = detector(img)

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(shape)
    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()

---------------------------2016年3月10日更新---------------------------

今天,我想起了Python中的help()方法,并进行了一次尝试。

>>>help(predictor)

Help on shape_predictor in module dlib.dlib object:

class shape_predictor(Boost.Python.instance)
 |  This object is a tool that takes in an image region containing 
some object and outputs a set of point locations that define the pose 
of the object. The classic example of this is human face pose 
prediction, where you take an image of a human face as input and are
expected to identify the locations of important facial landmarks such
as the corners of the mouth and eyes, tip of the nose, and so forth.

在原始代码中,变量shape是预测方法的输出。
>>>help(shape)

形状描述

形状的描述

class full_object_detection(Boost.Python.instance)
 |  This object represents the location of an object in an image along 
with the positions of each of its constituent parts.
----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  num_parts
 |      The number of parts of the object.
 |  
 |  rect
 |      The bounding box of the parts.
 |  
 |  ----------------------------------------------------------------------

似乎变量shape与点的坐标位置有关。
>>>print(shape.num_parts)
68
>>>print(shape.rect)
[(1005, 563) (1129, 687)]

我假设有68个标记的面部关键点。
>>> print(shape.part(68))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: Index out of range
>>> print(shape.part(65))
(1072, 645)
>>> print(shape.part(66))
(1065, 647)
>>> print(shape.part(67))
(1059, 646)

如果这是真的,那么剩下的问题就是哪个部分对应哪个面部标记点。

你可以在图像上检测点并标出它们的编号。或者你可以在这里查看 https://matthewearl.github.io/2015/07/28/switching-eds-with-python/ - Evgeniy
哇,那是个好主意。 - randy Pen
1
请查看此链接:http://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ - saurabheights
1个回答

9

我稍微修改了代码。

import dlib
import numpy as np
from skimage import io

predictor_path = "shape_predictor_68_face_landmarks.dat"

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)

img = io.imread("FDT.jpg")

dets = detector(img)

#output face landmark points inside retangle
#shape is points datatype
#http://dlib.net/python/#dlib.point
for k, d in enumerate(dets):
    shape = predictor(img, d)

vec = np.empty([68, 2], dtype = int)
for b in range(68):
    vec[b][0] = shape.part(b).x
    vec[b][1] = shape.part(b).y

print(vec)

这是输出结果。
[[1003  575]
 [1005  593]
 [1009  611]
 [1014  627]
 [1021  642]
 [1030  655]
 [1041  667]
 [1054  675]
 [1069  677]
 [1083  673]
 [1095  664]
 [1105  651]
 [1113  636]
 [1120  621]
 [1123  604]
 [1124  585]
 [1124  567]
 [1010  574]
 [1020  570]
 [1031  571]
 [1042  574]
 [1053  578]
 [1070  577]
 [1081  572]
 [1092  568]
 [1104  566]
 [1114  569]
 [1063  589]
 [1063  601]
 [1063  613]
 [1063  624]
 [1050  628]
 [1056  630]
 [1064  632]
 [1071  630]
 [1077  627]
 [1024  587]
 [1032  587]
 [1040  586]
 [1048  588]
 [1040  590]
 [1031  590]
 [1078  587]
 [1085  585]
 [1093  584]
 [1101  584]
 [1094  588]
 [1086  588]
 [1045  644]
 [1052  641]
 [1058  640]
 [1064  641]
 [1070  639]
 [1078  640]
 [1086  641]
 [1080  651]
 [1073  655]
 [1066  656]
 [1059  656]
 [1052  652]
 [1048  645]
 [1059  645]
 [1065  646]
 [1071  644]
 [1083  642]
 [1072  645]
 [1065  647]
 [1059  646]]

还有另一个开源项目OpenFace,它基于dlib,并描述了脸上每个点的相关部分。

描述图像的URL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接