Усреднённое лицо и OpenCV для Python

В этой статье вы узнаете, как сгенерировать усредненное изображение лица при помощи библиотеки OpenCV. Но прежде, чем читать рекомендую ознакомиться со статьёй 5 вариантов среднего или какая средняя температура в больнице? — могут появиться очень интересные аналогии…

Девушка, изображенная на рисунке 1 ниже, большинству читателей покажется симпатичной. Но вы сможете угадать ее национальность? Почему у нее такая ровная кожа? Правильно – этой девушки нет. Но и нельзя сказать, что это полностью виртуальное изображение. Это усредненный портрет всех сотрудниц компании Sight Commerce Inc. примерно в 2011 году. Благодаря разнообразию в компании, её национальность сложно определить, так как здесь работают девушки с европейскими, латиноамериканскими, восточноазиатскими и индийскими корнями!

Рисунок 1 — искусственный портрет девушки
Рисунок 1 — искусственный портрет девушки

История усреднения лиц забавна

Все началось с исследований Френсиса Гальтона (племянник Чарльза Дарвина), который еще в 1878 году изобрел новый фотографический прием: научился комбинировать лица и составлять первые фотороботы. Он полагал, что, комбинируя лица преступников, можно смоделировать «прототипическое» лицо уголовника и впоследствии распознавать потенциальных преступников по чертам лиц. Оказалось, что эта гипотеза ошибочна: рассмотрев чью-либо фотографию, невозможно определить его склонность к преступлениям.

Однако, Гальтон заметил, что усредненное лицо всегда выглядит привлекательнее всех «составляющих» его лиц. В одном поразительном эксперименте исследователи «сложили» лица всех 22 финалисток конкурса «Мисс Германия — 2002». Опрошенные оценили получившийся портрет выше, чем любую из конкурсанток, даже выше «мисс Берлин», которая тогда оказалась победительницей. Уф! Оказывается, Джессика Альба такая хорошенькая именно потому, что ее лицо близко к среднему.

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

Как сгенерировать усредненное лицо в OpenCV?

Рисунок 2 — усредненный портрет президентов США от Картера до Обамы
Рисунок 2 — усредненный портрет президентов США от Картера до Обамы

Проверенный код и изображения к статье можно скачать здесь.

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

Делай 1: Обнаружение черт лица

Рисунок 3 — Пример обнаружения черт лица
Рисунок 3 — Пример обнаружения черт лица

Для каждого портрета мы рассчитываем 68 «контрольных точек» при помощи библиотеки dlib. О том, как установить и использовать dlib, подробно рассказано в другом месте Facial Landmark Detection. На портрете Обамы расставлено 68 контрольных точек.

Делай 2: Преобразование координат

На входе размер изображений лиц может сильно отличаться. Поэтому нам придется их нормализовать и привести к одной системе отсчета. Для этого мы деформируем все изображения лиц до размера 600×600, чтобы левый угол левого глаза находился в точке с координатами (180, 200), а правый угол правого глаза – в точке (420, 200). Давайте назовем эту систему отсчета «конечной координатной системой», а координаты исходных изображений – «начальной координатной системой».

Как я выбрал вышеуказанные точки? Я хотел гарантировать, что эти точки будут расположены на одной горизонтальной линии, и эта линия будет пролегать примерно в трети пути от верхнего до нижнего края картинки. Итак, я добивался, чтобы кончики глазниц находились в точках с координатами ( 0.3 x ширина, высота / 3 ) и ( 0.7 x ширина, высота / 3 ).

Нам также известно, где расположены уголки глаз на исходных изображениях – соответственно, в контрольных точках 36 и 45. Затем мы можем вычислить преобразование подобия (вращение, перенос, масштабирование) и перевести точки из начальной координатной системы в конечную.

Рисунок 4 — Преобразование подобия используется для превращения исходного изображения размером 3000×2300 в конечное размером 600×600
Рисунок 4 — Преобразование подобия используется для превращения исходного изображения размером 3000×2300 в конечное размером 600×600

Что такое преобразование подобия? Преобразование подобия – это матрица размером 2×3, позволяющая изменять расположение точек (x, y) или целого изображения. Два первых столбца этой матрицы кодируют вращение и масштабирование, а последний — перенос (т.e. смещение). Допустим, вы преобразуете (перемещаете) четыре угла квадрата таким образом, что квадрат масштабируется в направлении x и y в sx и sy раз соответственно. В то же время он поворачивается на угол θ и переносится (перемещается) на tx и ty в направлениях x и y. Преобразование подобия при этом можно записать так:

Исходя из точки (x, y), вышеописанное преобразование подобия переносит эту точку в (xt, yt) в соответствии со следующим уравнением:

Преобразование подобия можно выполнить при помощи estimateRigidTransform

# Python 
 
# inPts and outPts are numpy arrays of tuples
# The last parameter indicates we do not want a similarity 
# transform and not a full affine transform. 
 
cv2.estimateRigidTransform(inPts, outPts, False);

Однако, здесь есть одна небольшая проблема. OpenCV требует, чтобы вы задали как минимум три пары точек. Это глупо, поскольку преобразование подобия вполне можно сделать, располагая всего двумя точками. Поэтому можно просто вообразить третью точку, таким образом, чтобы она и две известные нам точки образовывали равносторонний треугольник. Затем используем estimateRigidTransform так, как будто у нас три пары точек.

Вычислив преобразование подобия, можно с его помощью превратить исходное изображение и его контрольные точки в конечные координаты. Изображение преобразуется при помощи warpAffine, а точки – при помощи transform.

Делай 3: Выравнивание лица

Рисунок 5 — Результат упрощенного усреднения лица
Рисунок 5 — Результат упрощенного усреднения лица

На предыдущем этапе мы смогли преобразовать все изображения и контрольные точки в координаты конечного изображения. Теперь все изображения у нас одного размера, уголки глаз выровнены. Возможно, было бы соблазнительно попытаться получить усредненное изображение, взяв средние пиксельные значения этих выровненных изображений. Однако в таком случае у вас получилась такая картинка, как На рисунке 5. Да, глаза выровнены, а все остальные черты лица расположены как попало.

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

Этот процесс подробнее описан в моем посте Face Morphing, а в общих чертах – ниже.

Вычисляем средние лицевые точки

Чтобы вычислить, как будет выглядеть среднее лицо, все черты которого выровнены, для начала нужно рассчитать среднее от всех преобразованных контрольных точек в конечном изображении. Для этого просто усредняем значения x и y всех контрольных точек в координатах конечного изображения.

Вычисление триангуляции Делоне

Рисунок 6 — Вычисление триангуляции Делоне для усредненных контрольных точек
Рисунок 6 — Вычисление триангуляции Делоне для усредненных контрольных точек

На предыдущем этапе мы получили положения контрольных точек для усредненного лица в конечных координатах. Можно использовать эти 68 точек (показаны синим цветом На рисунке 6) и 8 точек на границе конечного изображения (показаны зеленым) для расчета триангуляции Делоне (показана красным). Подробнее триангуляция Делоне описана здесь.

Триангуляция Делоне позволяет разбить изображение на треугольники. В результате такой триангуляции получаем список треугольников, представленных в виде массива из индексов 76 точек (68 точек на лице + 8 граничных точек). В примере триангуляции, показанном ниже, заметно, что контрольные точки 62, 68 и 60 образуют треугольник, 32, 50 и 49 – другой треугольник и т.д.

Деформация треугольников

Пример триангуляции

[
62 68 60
32 50 49
15 16 72
9 8 58
53 35 36
…  ]

На предыдущем этапе мы вычислили среднее расположение контрольных точек на лице и, опираясь на эти данные, выполнили триангуляцию Делоне, чтобы поделить изображение на треугольники. На рисунке 7 видим треугольники Делоне, наложенные на преобразованное исходное изображение, а на том изображении, что находится в середине, показана триангуляция усредненных контрольных точек. Обратите внимание: треугольник 1 на изображении слева соответствует треугольнику 1 на среднем изображении. Зная три вершины треугольника 1, расположенного на левом изображении и соответствующие им три вершины треугольника со среднего изображения, можно рассчитать аффинное преобразование. Повторив эту процедуру для каждого из треугольников с левого изображения, получаем правое изображение. Итак, правое изображение — результат деформации левого до состояния усредненного лица.

Рисунок 7 — Деформация изображения на базе триангуляции Делоне
Рисунок 7 — Деформация изображения на базе триангуляции Делоне

Делай 4: Усреднение лица

Применив манипуляции из предыдущего этапа ко всем исходным изображениям, получаем конечные изображения, деформированные именно так, чтобы результат совпадал с усредненными конечными точками. Чтобы вычислить усредненное изображение, можно просто сложить значения интенсивности пикселов всех деформированных изображений и разделить эту сумму на количество изображений. На рисунке 2 показан результат такого усреднения. Он выглядит гораздо лучше, чем то «среднее», что было На рисунке 5.
Как по-вашему выглядит «средний» президент США? По-моему — отечески и мило.

Результаты усреднения лица

Рисунок 8 — Усредненное лицо Марка Цукерберга, Ларри Пейджа, Илона Маска и Джеффа Безоса
Рисунок 8 — Усредненное лицо Марка Цукерберга, Ларри Пейджа, Илона Маска и Джеффа Безоса
Рисунок 9 — Усредненное лицо Бри Ларсон, Джулианны Мур, Кейт Бланшетт и Дженнифер Лоуренс
Рисунок 9 — Усредненное лицо Бри Ларсон, Джулианны Мур, Кейт Бланшетт и Дженнифер Лоуренс

Как выглядит усредненный ведущий предприниматель-технарь? На рисунке 8 показано усредненное лицо Марка Цукерберга, Ларри Пейджа, Илона Маска и Джеффа Безоса. Не могу сказать об этом «среднем предпринимателе» ничего особенного кроме того, что у него все-таки просматривается шевелюра (несмотря на отрицательный вклад Джеффа Безоса).

Как выглядит усредненная оскароносная актриса? На рисунке 9 показано усредненное лицо Бри Ларсон, Джулианны Мур, Кейт Бланшетт и Дженнифер Лоуренс. Итак, средняя кинозвезда очень симпатичная. И зубы у нее получше, чем у успешного предпринимателя. Ничего удивительного.

Также можно сделать симметричное лицо, усреднив его с зеркальным изображением. Пример показан ниже.

Рисунок 10— Симметричный президент Обама (в центре) полученный усреднением его фотографии (слева) с его же зеркальным отражением (справа)
Рисунок 10— Симметричный президент Обама (в центре) полученный усреднением его фотографии (слева) с его же зеркальным отражением (справа)

Использованы материалы или по мотивам: Average Face: OpenCV (C++/Python) Tutorial


Респект и уважуха

Добавить комментарий