如何在dlib的人脸界标检测程序中获取点坐标位置?
How to get points coordinate position in the face landmark detection program of dlib?
dlib 中有一个示例 python 程序可以检测面部标志位置。
face_landmark_detection.py
此程序检测人脸特征并在原始照片中用点和线表示地标。
不知是否可以得到每个点的坐标位置。比如 a(10, 25)。 'a'表示嘴角。
将程序稍微修改为一次处理一张图片后,我尝试打印出 dets 和 shape 的值,但没有成功。
>>>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 年 10 月 3 日------------ --------------
今天想起了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)
如果是真的。剩下的问题是哪个部分响应哪个面部标志点。
我稍微修改了代码。
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,在face中描述了每个点的相关部分。
dlib 中有一个示例 python 程序可以检测面部标志位置。 face_landmark_detection.py
此程序检测人脸特征并在原始照片中用点和线表示地标。
不知是否可以得到每个点的坐标位置。比如 a(10, 25)。 'a'表示嘴角。
将程序稍微修改为一次处理一张图片后,我尝试打印出 dets 和 shape 的值,但没有成功。
>>>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 年 10 月 3 日------------ --------------
今天想起了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)
如果是真的。剩下的问题是哪个部分响应哪个面部标志点。
我稍微修改了代码。
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,在face中描述了每个点的相关部分。