有没有办法从face_recognition平滑人脸地标?也许通过PIL?

时间:2019-02-09 23:40:11

标签: python python-imaging-library face-recognition dlib

我正在尝试制作一个可以使眼睛充满图像的眼睛替换程序。为了找到眼睛,我使用了Ageitgey的face_recognition。但是,眼睛的检测结果参差不齐。

(顺便说一句,我不是在谈论抗锯齿。稍后我将使用超级采样来解决)

这是我的一小段代码:

from PIL import Image, ImageDraw
import face_recognition

image = face_recognition.load_image_file("media/test_input_image.jpg")

face_landmark_list = face_recognition.face_landmarks(image)

for face_landmarks in face_landmark_list:
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image, 'RGBA')

    d.polygon(face_landmarks["right_eye"], fill=(255, 0, 0, 255))

    pil_image.show()

示例:[丹尼尔惊讶地挑剔的眼睛]

enter image description here

我希望它看起来更平滑。我正在寻求实现左侧绿眼的功能,但目前正在实现右侧红眼的功能。 (用Gimp吸引了绿眼睛。)

所以,基本上,有没有办法从红色结果变为绿色?

1 个答案:

答案 0 :(得分:2)

方法1 :(轻松)

  • 使用二次或三次回归来拟合使用左/右和2个上点的曲线
  • 对左/右和两个较低的点做同样的事情。
  • 采样取决于每个采样点的数量。 enter image description here

示例python代码:

import numpy.polynomial.polynomial as poly
import numpy as np
import matplotlib.pyplot as plt

# Grab x, y coordinates from eyes in face_recognition result
# Here is the example point.
x = np.array([1, 2, 4, 5])
y = np.array([1, 1.5, 1.5, 1])

# x_new: upsampling 40 points from x
x_new = np.linspace(x[0], x[-1], num=len(x)*10)

coefs = poly.polyfit(x, y, 3)
y_new = poly.polyval(x_new, coefs)

plt.plot(x_new, y_new,'r-')
plt.plot(x,y,'o')
plt.show()

方法2 :(困难)

  • 使用dlib训练对象检测器仅检测超过6个点的眼睛,例如一只眼睛可获得64点,您将获得更流畅的效果。