Девушка, изображенная на рисунке 1 ниже, большинству читателей покажется симпатичной. Но вы сможете угадать ее национальность? Почему у нее такая ровная кожа? Правильно – этой девушки нет. Но и нельзя сказать, что это полностью виртуальное изображение. Это усредненный портрет всех сотрудниц компании Sight Commerce Inc. примерно в 2011 году. Благодаря разнообразию в компании, её национальность сложно определить, так как здесь работают девушки с европейскими, латиноамериканскими, восточноазиатскими и индийскими корнями!
История усреднения лиц забавна
Все началось с исследований Френсиса Гальтона (племянник Чарльза Дарвина), который еще в 1878 году изобрел новый фотографический прием: научился комбинировать лица и составлять первые фотороботы. Он полагал, что, комбинируя лица преступников, можно смоделировать «прототипическое» лицо уголовника и впоследствии распознавать потенциальных преступников по чертам лиц. Оказалось, что эта гипотеза ошибочна: рассмотрев чью-либо фотографию, невозможно определить его склонность к преступлениям.
Однако, Гальтон заметил, что усредненное лицо всегда выглядит привлекательнее всех «составляющих» его лиц. В одном
Можно ли приравнять «среднее» к «посредственному»? Почему усредненное лицо кажется нам привлекательным? Согласно эволюционной гипотезе под названием «койнофилия», особи в активном репродуктивном возрасте ищут партнеров с усредненными чертами, поскольку отклонения от среднего могут свидетельствовать о вредных мутациях. Кроме того, среднее лицо симметрично, поскольку вариации в левой и правой части лица взаимно сглаживаются.
Как сгенерировать усредненное лицо в OpenCV?
Проверенный код и изображения к статье можно скачать
Далее дано пошаговое описание, как сгенерировать усредненное лицо, имея вышеприведенный набор изображений. При этом мы не учитываем размер самих изображений или размер лица на каждом портрете.
Делай 1: Обнаружение черт лица
Для каждого портрета мы рассчитываем 68 «контрольных точек» при помощи библиотеки dlib. О том, как установить и использовать dlib, подробно рассказано в другом месте
Делай 2: Преобразование координат
На входе размер изображений лиц может сильно отличаться. Поэтому нам придется их нормализовать и привести к одной системе отсчета. Для этого мы деформируем все изображения лиц до размера 600×600, чтобы левый угол левого глаза находился в точке с координатами (180, 200), а правый угол правого глаза – в точке (420, 200). Давайте назовем эту систему отсчета «конечной координатной системой», а координаты исходных изображений – «начальной координатной системой».
Как я выбрал вышеуказанные точки? Я хотел гарантировать, что эти точки будут расположены на одной горизонтальной линии, и эта линия будет пролегать примерно в трети пути от верхнего до нижнего края картинки. Итак, я добивался, чтобы кончики глазниц находились в точках с координатами ( 0.3 x ширина, высота / 3 ) и ( 0.7 x ширина, высота / 3 ).
Нам также известно, где расположены уголки глаз на исходных изображениях – соответственно, в контрольных точках 36 и 45. Затем мы можем вычислить преобразование подобия (вращение, перенос, масштабирование) и перевести точки из начальной координатной системы в конечную.
Что такое преобразование подобия? Преобразование подобия – это матрица размером 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. Да, глаза выровнены, а все остальные черты лица расположены как попало.
Если бы мы знали, какая точка из одного исходного изображения соответствовала какой точке из другого исходного изображения, то могли бы идеально наложить два изображения друг на друга. Но такой информации у нас нет. Мы знаем лишь положение 68 соответствующих точек на каждом из исходных изображений. Ориентируясь на эти точки, мы разделим каждое изображение на треугольные области, и сначала выровняем эти области, а затем будем усреднять пиксельные значения.
Этот процесс подробнее описан в моем посте
Вычисляем средние лицевые точки
Чтобы вычислить, как будет выглядеть среднее лицо, все черты которого выровнены, для начала нужно рассчитать среднее от всех преобразованных контрольных точек в конечном изображении. Для этого просто усредняем значения x и y всех контрольных точек в координатах конечного изображения.
Вычисление триангуляции Делоне
На предыдущем этапе мы получили положения контрольных точек для усредненного лица в конечных координатах. Можно использовать эти 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, расположенного на левом изображении и соответствующие им три вершины треугольника со среднего изображения, можно рассчитать аффинное преобразование. Повторив эту процедуру для каждого из треугольников с левого изображения, получаем правое изображение. Итак, правое изображение — результат деформации левого до состояния усредненного лица.
Делай 4: Усреднение лица
Применив манипуляции из предыдущего этапа ко всем исходным изображениям, получаем конечные изображения, деформированные именно так, чтобы результат совпадал с усредненными конечными точками. Чтобы вычислить усредненное изображение, можно просто сложить значения интенсивности пикселов всех деформированных изображений и разделить эту сумму на количество изображений. На рисунке 2 показан результат такого усреднения. Он выглядит гораздо лучше, чем то «среднее», что было На рисунке 5.
Как по-вашему выглядит «средний» президент США? По-моему — отечески и мило.
Результаты усреднения лица
Как выглядит усредненный ведущий предприниматель-технарь? На рисунке 8 показано усредненное лицо Марка Цукерберга, Ларри Пейджа, Илона Маска и Джеффа Безоса. Не могу сказать об этом «среднем предпринимателе» ничего особенного кроме того, что у него все-таки просматривается шевелюра (несмотря на отрицательный вклад Джеффа Безоса).
Как выглядит усредненная оскароносная актриса? На рисунке 9 показано усредненное лицо Бри Ларсон, Джулианны Мур, Кейт Бланшетт и Дженнифер Лоуренс. Итак, средняя кинозвезда очень симпатичная. И зубы у нее получше, чем у успешного предпринимателя. Ничего удивительного.
Также можно сделать симметричное лицо, усреднив его с зеркальным изображением. Пример показан ниже.
Использованы материалы или по мотивам:
Респект и уважуха