有没有办法从 face_recognition 中平滑面部特征?也许通过 PIL?
Is there a way to smooth out face landmarks from face_recognition? Maybe via PIL?
我正在尝试制作一个可以用图像填充眼睛的眼睛替换程序。为了找到眼睛,我使用了 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()
例子:[丹尼尔选错了眼睛出奇的可怕]
我想让它看起来更平滑。我希望获得类似左侧绿眼的效果,但目前正在获得右侧的红眼。 (绿色的眼睛是用 Gimp 绘制的。)
所以,基本上,有没有办法从红色结果变成绿色?
方法一:(简单)
- 使用二次或三次回归来拟合使用 left/right 和 2 个上点
的曲线
- 对 left/right 和 2 个较低的点执行相同的操作。
- 抽样取决于您希望每个抽样多少分。
示例 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()
方法二:(难)
- 使用 dlib,重新训练对象检测器以仅检测具有 6 个以上点的眼睛,例如单眼64分,效果更流畅
我正在尝试制作一个可以用图像填充眼睛的眼睛替换程序。为了找到眼睛,我使用了 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()
例子:[丹尼尔选错了眼睛出奇的可怕]
我想让它看起来更平滑。我希望获得类似左侧绿眼的效果,但目前正在获得右侧的红眼。 (绿色的眼睛是用 Gimp 绘制的。)
所以,基本上,有没有办法从红色结果变成绿色?
方法一:(简单)
- 使用二次或三次回归来拟合使用 left/right 和 2 个上点 的曲线
- 对 left/right 和 2 个较低的点执行相同的操作。
- 抽样取决于您希望每个抽样多少分。
示例 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()
方法二:(难)
- 使用 dlib,重新训练对象检测器以仅检测具有 6 个以上点的眼睛,例如单眼64分,效果更流畅