Библиотека Python для извлечения позы лица из 68 ориентиров

#python #pose-estimation

Вопрос:

Может ли кто-нибудь указать мне направление библиотеки, которая может оценить позу лица по 68 ориентирам в Python?

Если быть более точным, существует множество таких библиотек. Однако они обычно начинаются с изображения. Я хочу пропустить обнаружение ориентира, потому что он у меня уже есть. Я просто хочу передать 68-точечные ориентиры в функцию и получить поворот и перевод лица.

Если бы я не был полным новичком в Python, я мог бы извлечь соответствующие фрагменты из существующих библиотек, но мне трудно это сделать.

Спасибо.

Ответ №1:

Эта библиотека, похоже, справится с вашей работой https://github.com/yinguobing/head-pose-estimation

Кажется, это работает в 3 этапа,

  1. Распознавание Лиц
  2. Обнаружение Ориентира
  3. Оценка Позы. После получения 68 ориентиров на лице поза может быть рассчитана с помощью взаимного алгоритма PnP.

Итак, вам следует просмотреть кодовую базу для этого mutual PnP algorithm , которая использует 68 ориентиров в качестве входных данных.

Похоже, что весь код, касающийся оценки позы, который вам понадобится, находится внутри этого файла!

Чтобы кратко обобщить весь файл кода оценки позы для вас

  • PoseEstimator класс содержит все соответствующие функции
  • __init__ функция определяется self.model_points как координаты кончика носа, подбородка, рта. Он также обрабатывает внутренние части камеры, векторы вращения и перемещения. Все это является важными входными данными для алгоритма PnP, который выполняет оценку позы
  • self._get_full_model_points() считывает ориентиры из файла и сохраняет их в self.model_points_68
  • у этого класса есть важная функция solve_pose_by_68_points , которая называется «делать то, что вам нужно». Он ожидает ввода ваших ориентиров.
  • эта solve_pose_by_68_points() функция используется внутри этого файла
  • входными данными для этой функции является переменная, называемая marks

Вам нужно придумать способ ввода ваших собственных ориентиров в эту solve_pose_by_68_points функцию, используя marks переменную в качестве ориентира.

Или просто воссоздайте код из pose_estimator.py файла и solve_pose_by_68_points функции в нем.

Боковое примечание — эта функция просто вызывает cv2.solvePnP , я предполагаю, реализацию OpenCV алгоритма PnP.

Комментарии:

1. Большое вам спасибо за ваши советы! Похоже, что решение находится в этом файле. Я попробую и доложу об этом.

2. Я добился некоторого прогресса, но есть некоторые трудности. Когда я вызываю функцию solve_pose_by_68_points(), мне нужно предоставить объект OpenCV Mat. То, что у меня есть,-это 2-мерный массив. В настоящее время я использую этот код для преобразования моего массива точек в массив Numpy, который, судя по тому, что я читал в другом месте, должен быть таким же, как объект Mat в Python: numpy.array(точки, np.float32) Я понятия не имею, правильно ли это. Я попытался использовать данные о вращении, но цифры настолько малы, что я не могу заметить фактического изменения позы…

3. поделитесь где-нибудь своим кодом, помогите мне запустить его. дайте мне свой массив очков и дайте мне функцию solve_pose_by_68_points()

4. Спасибо, что перезвонил мне. Я изложил суть того, куда я поместил то, что у меня есть до сих пор. Я действительно получаю цифры в конце, но я не думаю, что они верны… Я не уверен, как создать cv.Mat из массива. Вот в чем суть: gist.github.com/djipco/30d0108cc19b04fd8acd35881ff7defc