Есть ли способ сгладить ориентиры лица из face_recognition?Может быть через PIL? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь создать программу замены глаз, которая может заполнить глаза изображением.Для нахождения глаз я использую face_recognition от Ageitgey.Тем не менее, обнаружение глаз получается очень зазубренным.

(кстати, я не говорю о сглаживании. Для решения этой проблемы я буду использовать суперсэмплинг)

Вот мой крошечныйбит кода:

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 голосов
/ 10 февраля 2019

Метод 1: (Простой)

  • Используйте квадратичную или кубическую регрессию для подгонки кривой, используя левую / правую и 2 верхние точки
  • Сделайте то же самоевещь для левой / правой и 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 очка за один глаз, вы получите более плавный результат.
...