Перейти к содержимому
Compvision.ru
Smorodov

Переставляем лица на фотках.

Recommended Posts

Поиграл сегодня с имеющимися либами, получилась забавная штука.

Вставляет лицо с одной фотографии на другую. Программа сырая, но "для поиграть" вполне годится.

post-1-0-31912000-1344694091_thumb.jpg

FaceExchange.rar

Каскад и ASM модель программа берет из поддиректории data (есть в архиве) в директории с ехе-шником.

Перед компиляцией надо подправить пути к заголовочникам и lib-файлам.

Я не использовал в морфинге внешние точки ASM-модели (пока руки не дошли), так что при сильных различиях пропорций лица программа выдает не такой хороший результат. Выравниваются глаза, рот, нос и брови (совмещается 21 точка).

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так, thin plate spline для морфинга.

http://www.compvision.ru/forum/index.php?showtopic=744

Active Shape Models для нахождения точек лица (в архиве более новая моя редакция, правда все еще недооформленная).

http://www.compvision.ru/forum/index.php?showtopic=15&st=80 (ближе к концу страницы)

Остальное тривиально :)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Код пока сложновато читается.

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

Еще, описания точек в файле landmarks.hpp.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#include "opencv2/core/opengl_interop.hpp"

#include "opencv2/nonfree/nonfree.hpp"

надо обновить библиотеку=)

по коду пробежал, пока много чего не понятно, буду по-тихоньку разбираться, сначала с теорией)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эти два заголовка можно просто убрать, это остатки экспериментов.

Если коротко и крупноблочно, то там порядок действий такой:

1) загружаем 2 изображения - исходное (где лицо берем) и то куда хотим впихнуть лицо.

2) каскадами Хаара находим лица на обоих изображениях (встроено в ASM).

3) при помощи асм находим модель активной формы (сетка на лице, её можно прорисовать если раскомментировать пару строчек).

4) после того как нашли соответствующие сетки для обоих лиц, достаем оттуда точки (у меня сделано два варианта 21 точка и все точки).

5) по 21 точке рассчитываем сплайн (warp) между двумя изображениями.

6) находим для первой модели асм convex hull - это будет маской для наложения. Для convex hull вытаскивались все точки.

7) деформируем первое изображение.

8) деформируем маску.

9) сглаживаем маску гауссианом, чтообы сгладить переход на краях.

10) копируем изображение по маске.

ЗЫ: для каждого модуля в архиве есть пример применения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

еще можно добавить пуассон блендинг.

 

самое сложное это накладывать тени наверно(если это вообще возможно.)

Изменено пользователем mrgloom

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+1 за пуассонов блендинг, склейку должно замаскировать почище

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Полный цикл того же самого

Решение получилось всё-таки немного другое. Тут обычный морфинг (или среднее), а в исходной задаче была замена. Может быть подскажите, что подправить, чтобы при преобразовании шла только геометрическая корректировка (морфинг), но всё время оставалось исходное изображение? То есть сделать уже функциональный аналог первой задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сам же и отвечу на свой вопрос.

В facemorpher/warper.py есть test_local(), который вызывается при запуске python warper.py. Тут как раз и используется poisson_blend. Поправил пути к исходным картинкам и чтение точек, после чего заменил одно из смешиваемых изображений на исходное:

#  blended_img = blender.poisson_blend(dst_img1, dst_img2, mask)
  blended_img = blender.poisson_blend(dst_img1, base_img, mask)

В результате получился эффект исходной программы по замене лиц:

facereplace1.thumb.jpg.571d464008c77f044

facereplace2.thumb.jpg.4dc9eef66a20d4daa

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Реализация blender.poisson_blend() оказалась довольно медленной. Стал искать готовые решения. Тут нашёл, что в OpenCV уже есть метод cv2.seamlessClone. Вот результат применения исходного алгоритма и метода из OpenCV:

combine4.thumb.jpg.c9cee1cf0944719130087

Для себя пока не решил, какой результат больше нравится: правый или левый. Вы бы что выбрали?

У OpenCV два режима: cv2.MIXED_CLONE и cv2.NORMAL_CLONE. Для замены cv2.MIXED_CLONE не подходит, начинают проявляться артефакты подменяемого изображения:

cv_mixed.thumb.jpg.8d1bf57a54ee5be34ce7e

Пока главное преимущество стандартного метода - это на два порядка более высокая производительность (на CPU).

P.S. Надо бы ещё попробовать параллельную версию https://github.com/ealehman/parallel-poisson-blending

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут в конце темы я писал про seamlessClone

а так же про то что он использует solve для dense матриц, что не оптимально. Например библиотека Eigen может работать с sparse матрицами и будет работать быстрее, другое дело что вышеобозначенное решение позиционируется полностью на питоне( кроме stasm_util, но по идее можно было бы использовать PyStasm, но он походу кривой) и вообще говоря странно, что специализированное решение pyamg медленей (видимо потому что там только питоновский код).

 

можете им зарепортить, что Opencv версия быстрее.

https://github.com/alyssaq/face_morpher/issues

 

п.с. левый результат лучше выглядит, т.к. правый глаз залит меньше рыжим краевым условием от волос.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 hours ago, mrgloom said:

п.с. левый результат лучше выглядит, т.к. правый глаз залит меньше рыжим краевым условием от волос.

Слева - OpenCV. Ещё один аргумент против исходного алгоритма.

P.S. Кстати, есть готовая библиотека-утилита https://github.com/fbessho/PyPoi, но качество смешивания не очень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот еще на питоне:

http://www.sprestwood.com/2014_10_01_archive.html

и исходник:

https://github.com/sprestwood/GradientDomainCloning

А вообще я делал на CPP+CUDA и все работало в реальном времени (см. аттач).

Код опубликовать не могу, ибо он коммерческий :).

face_change.mpeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×