Привет, Хабр! Сегодня я хочу рассказать вам, как можно изменить свое лицо на фото, используя довольно сложный пайплайн из нескольких генеративных нейросетей и не только. Модные недавно приложения по превращению себя в даму или дедушку работают проще, потому что нейросети медленные, да и качество, которое можно получить классическими методами компьютерного зрения, и так хорошее. Тем не менее, предложенный способ мне кажется очень перспективным. Под катом будет мало кода, зато много картинок, ссылок и личного опыта работы с GAN'ами.


Задачу можно разбить на следующие шаги:


  • найти и вырезать лицо на фото
  • преобразовать лицо нужным образом (превратить в женщину/чернокожего и т.п.)
  • улучшить/увеличить полученное изображение
  • вставить трансформированное лицо обратно в оригинальное фото

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


Детекция лица


Здесь проще всего. Можно ничего не выдумывать и просто взять dlib.get_frontal_face_detector()(пример). Dlib'овский детектор по умолчанию использует линейный классификатор, обученный на HOG-фичах.




Как мы видим, выдаваемый прямоугольник содержит не все лицо, поэтому лучше его увеличить. Оптимальные коэффициенты увеличения можно подобрать руками. В итоге у вас может получиться подобный метод и подобный результат:


код
def detect_single_face_dlib(img_rgb, rescale=(1.1, 1.5, 1.1, 1.3)):
    fd_front_dlib = dlib.get_frontal_face_detector()
    face = fd_front_dlib(img_rgb, 1)
    if len(face) > 0:
        face = sorted([(t.width() * t.height(), (t.left(), t.top(), t.width(), t.height()))
                       for t in face],
                      key=lambda t: t[0], reverse=True)[0][1]
    else:
        return None

    if rescale is not None and face is not None:
        if type(rescale) != tuple:
            rescale = (rescale, rescale, rescale, rescale)
        (x, y, w, h) = face

        w = min(img_rgb.shape[1] - x, int(w / 2 + rescale[2] * w / 2))
        h = min(img_rgb.shape[0] - y, int(h / 2 + rescale[3] * h / 2))

        fx = max(0, int(x + w / 2 * (1 - rescale[0])))
        fy = max(0, int(y + h / 2 * (1 - rescale[1])))
        fw = min(img_rgb.shape[1] - fx, int(w - w / 2 * (1 - rescale[0])))
        fh = min(img_rgb.shape[0] - fy, int(h - h / 2 * (1 - rescale[1])))

        face = (fx, fy, fw, fh)
    return face



Если же работа "старых" методов по каким-то причинам вас не устраивает, можно попробовать deep learning. Для решения задачи обнаружения лица подойдут любые Region Proposal Networks, например YOLOv2 или Faster-RCNN. Как попробуете — обязательно поделитесь тем, что у вас получилось.


Трансформация лица


Вот тут самое интересное. Как вы уже наверняка знаете, преобразовать лицо или сделать маску можно и без нейросетей, и это будет хорошо работать. Но генеративные сети — гораздо более перспективный инструмент для обработки изображений. Уже есть огромное количество моделей, типа <your prefix>GAN, которые умеют вытворять самые разные трансформации. Задача преобразования изображений из одного набора (домена) в другой называется Domain Transfer. С некоторыми архитектурами Domain Transfer сетей вы могли познакомиться в нашем недавнем обзоре GAN'ов.




Cycle-GAN


Почему именно Cycle-GAN? Да потому что она работает. Посетите сайт проекта и посмотрите, что можно делать с помощью этой модели. В качестве датасета достаточно двух наборов изображений: DomainA и DomainB. Допустим, у вас есть папки с фотографиями мужчин и женщин, белых и азиатов, яблок и персиков. Этого достаточно! Клонируете репозиторий авторов с реализацией Cycle-GAN на pytorch и приступаете к обучению.


Как это работает


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




По сути, мы обучаем две функции-генератора. Одна — $G$ — учится по входному изображению из домена $X$ генерировать изображение из домена $Y$. Другая — $F$ — наоборот, из $Y$ в $X$. Соответствующие дискриминаторы $D_Y$ и $D_X$ им в этом помогают, как это свойственно GAN'ам. Обычный Advesarial Loss (или GAN Loss) выглядит следующим образом:


$L_{GAN}(G, D_Y, X, Y)=\mathbb{E}_{y\sim p_{data}(y)}[\log D_Y(y)]+\mathbb{E}_{x\sim p_{data}(x)}[\log (1-D_Y(G(x)))]$


Дополнительно авторы вводят так называемый Cycle Consistensy Loss:


$L_{cyc}(G,F) = \mathbb{E}_{x \sim p_{data}(x)}[\left \| F(G(x))-x \right \|_1] + \mathbb{E}_{y \sim p_{data}(y)}[\left \| G(F(y))-y \right \|_1]$


Суть его в том, чтобы изображение из домена $X$, пройдя через генератор $G$, а потом через генератор $F$, было максимально похоже на оригинал. Короче, $F(G(x))\approx x$.


Таким образом, целевая функция принимает вид:


$L(G, F, D_X, D_Y)=L_{GAN}(G, D_Y, X,Y)+L_{GAN}(F,D_X,Y,X)+\lambda L_{cyc}(G,F)$


и мы решаем следующую задачу оптимизации:


$ G^*,F^* = arg \min_{F,G} \max_{D_X,D_Y} L(G,F,D_X,D_Y) $


Здесь $\lambda$ — гиперпараметр, контролирующий вес дополнительного лосса.


Но это еще не все. Было замечено, что генераторы очень сильно меняют цветовую гамму оригинального изображения.


Чтобы это исправить, авторы добавили дополнительный лосс — Identity Loss. Это своего рода регуляризатор, который требует от генератора identity mapping для изображений целевого домена. Т.е. если на вход генератору зебр пришла зебра — то не надо такую картинку изменять.


$L_{identity}(G,F) = \mathbb{E}_{y \sim p_{data}(y)}[\left \| G(y)-y \right \|_1] + \mathbb{E}_{x \sim p_{data}(x)}[\left \| F(x)-x \right \|_1]$


На (мое) удивление это помогло решить проблему сохранения цветовой гаммы. Вот примеры от авторов статьи (там картины Моне пытаются преобразовать в реальные фотографии):




Архитектуры используемых сетей


Для того чтобы описать используемые архитектуры, введем некоторые условные обозначения.
c7s1-k — это сверточный слой 7х7 с последующей батч-нормализацией и ReLU, со страйдом 1, паддингом 3 и количеством фильтров k. Такие слои не уменьшают размерность нашего изображения. Пример на pytorch:


[nn.Conv2d(n_channels, inplanes, kernel_size=7, padding=3),
nn.BatchNorm2d(k, affine=True),
nn.ReLU(True)]

dk — сверточный слой 3х3 со страйдом 2 и кол-вом фильтров k. Такие свертки уменьшают размерность входного изображения в 2 раза. Опять пример на pytorch:


[nn.Conv2d(inplanes, inplanes * 2, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(inplanes * 2, affine=True),
nn.ReLU(True)]

Rk — residual блок с двумя свертками 3х3 с одинаковым количеством фильтров. У авторов он сконструирован так:


resnet_block = []
resnet_block += [nn.Conv2d(inplanes, planes, kernel_size=3, stride=1, padding=1),
                nn.BatchNorm2d(planes, affine=True),
                nn.ReLU(inplace=True)]
resnet_block += [nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1),
                nn.BatchNorm2d(planes, affine=True)]

uk — 3x3 up-convolution слой с BatchNorm и ReLU — для увеличения размерности изображения. Опять пример:


[nn.ConvTranspose2d(inplanes * 4, inplanes * 2, kernel_size=3, stride=2,
                    padding=1, output_padding=1),
nn.BatchNorm2d(inplanes * 2, affine=True),
nn.ReLU(True)]

С указанными обозначениями генератор с 9 резнет-блоками выглядит так:


c7s1-32,d64,d128,R128,R128,R128,R128,R128,R128,R128,R128,R128,u64,u32,c7s1-3


Мы делаем изначальную свертку с 32 фильтрами, потом два раза уменьшаем изображение, попутно увеличивая количество фильтров, затем идут 9 резнет-блоков, потом два раза увеличиваем изображение, уменьшая кол-во фильтров, и финальной сверткой создаем 3-канальный выход нашей нейросети.


Для дискриминатора будем ипользовать обозначение Ck — свертка 4х4 с последующими батч-норм и LeakyReLU с параметром 0.2. Архитектура дискриминатора следующая:


C64-C128-C256-C512


При этом для первого слоя C64 мы не делаем BatchNorm.
А в конце еще добавляем один нейрон с сигмоидной функцией активации, который говорит, фейк ему пришел или нет.


Еще пару слов про дискриминатор


Такой дискриминатор является так называемой fully-convolutional сетью — в нем нет полносвязных слоев, только свертки. Такие сети могут принимать на вход изображения любого размера, а количество слоев регулирует receptive field сети. Впервые такая архитектура была представлена в статье Fully Convolutional Networks for Semantic Segmentation.


В нашем случае генератор мапит входное изображение не на один скаляр, как обычно, а на 512 выходных картинок (уменьшенного размера), по которым уже делается вывод "real or fake". Это можно интерпретировать как взвешенное голосование по 512 патчам входного изображения. Размер патча (рецептивного поля) можно прикинуть пробросив обратно ко входу все активации. Но хорошие люди сделали утилиту, которая посчитает все за нас. Такие сети еще называют PatchGAN.


В нашем случае 3-слойный PatchGAN при входном изображении 256х256 имеет рецептивное поле 70х70, и это эквивалентно тому, как если бы мы вырезали несколько случайных патчей 70х70 из входа и по ним судили, реальная картинка пришла или сгенерированная. Контролируя глубину сети, мы можем контролировать размер патчей. Например, 1-слойный PatchGAN имеет рецептивное поле 16х16, и в таком случае мы смотрим на низкоуровневые фичи. 5-слойный PatchGAN будет уже смотреть почти на всю картинку целиком. Вот здесь Phillip Isola мне доходчиво объяснил всю эту магию. Почитайте, вам тоже должно стать понятней. Главное: полностью сверточные сети работают лучше обычных, и ими надо пользоваться.


Особенности обучения Cycle-GAN


Данные


Для начала мы попробовали решить задачу превращения лиц мужщин в женщин и наоборот. Благо, датасеты для этого есть. Например, CelebA, содержащий 200 тысяч фотографий лиц знаменитостей с бинарными метками Пол, Очки, Борода и пр.




Собственно, разбив этот датасет по нужному признаку мы получаем порядка 90к картинок мужщин и 110к — женщин. Это наши DomainX и DomainY.


Средний размер лиц на этих фото однако не очень большой (около 150х150), и вместо ресайза всех картинок к 256х256 мы привели их к 128х128. Также, для сохранения соотношения сторон, картинки не растягивались, а вписывались в черный квадрат 128х128. Типичный вход генераторов мог выглядеть так:




Perceptual Loss


Интуиция и опыт подсказали нам считать identity loss не в пространстве пикселей, а в пространстве фич предобученной VGG-16 сети. Именно этот трюк был впервые представлен в статье Perceptual Losses for Real-Time Style Transfer and Super-Resolution и широко используется в задачах Style Transfer. Логика здесь простая: если мы хотим делать генераторы инвариантыми к стилю изображений из целевого домена, то зачем считать ошибку на пикселях, если есть фичи, содержащие информацию о стиле. К какому эффекту это привело, вы узнаете чуть позже.


Процедура обучения


В целом модель получилась довольно громоздкой, учатся сразу 4 сети. Изображения по ним надо несколько раз прогнать туда-сюда, чтобы посчитать все лоссы, а потом и обратно распространить все градиенты. Одна эпоха обучения на CelebA (200к картинок 128х128) на GForce 1080 занимает порядка 5 часов. Так что особо не поэкспериментируешь. Скажу лишь, что наша конфигурация отличалась от авторской только заменой Identity Loss на Perceptual. PatchGAN'ы с большим или меньшим количеством слоев не зашли, оставили 3-слойный. Оптимизатор для всех сетей — Adam с параметрами betas=(0.5, 0.999). Learning rate по умолчанию 0.0002 и уменьшался каждую эпоху. BatchSize был равне 1, и во всех сетках BatchNorm был заменен (авторами) на InstanceNorm. Интересный момент — на вход дискриминатору подавался не последний выход генератора, а случайная картинка из буфера в 50 изображений. Таким образом, дискриминатору мог прийти образ, сгенерированный прошлой версией генератора. Этот трюк и многие другие, которые использовали авторы, перечислены в заметке Сумита Чинталы (автора PyTorch) How to Train a GAN? Tips and tricks to make GANs work. Рекомендую распечатать этот список и повесить возле рабочего места. У нас не дошли руки перепробовать все, что там есть, например LeakyReLU и альтернативные методы апсемплинга для генератора. Но повозились с дискриминатором и расписанием обучения пары генератор/дискриминатор. Это действительно добавляет стабильности.


Эксперименты


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


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




Генераторы постепенно расходятся, остальные лоссы чуть-чуть уменьшились, но тем не менее, сеть выдает приличные картинки и явно чему-то научилась. Кстати, для визуализации хода обучения модели мы использовали visdom, довольно простой в настройке и удобный инструмент от Facebook Research. Каждые несколько итераций мы смотрели на следующие 8 картинок:


  • real_A — вход из домена А
  • fake_B — real_A, преобразованная генератором A->B
  • rec_A — реконструированная картинка, fake_B, преобразованный генератором B->A
  • idty_B — real_A, преобразованный генератором B->A
  • и 4 аналогичных изображения в обратную сторорну

В-среднем, хорошие результаты можно увидель уже после 5ой эпохи обучения. Смотрите, ошибка генераторов никак не уменьшается, но это не помешало сети превратить человека, похожего на Хинтона, в женщину. Ничего святого!




Иногда дела могут идти совсем плохо.




В таком случае можно нажимать Ctrl+C и звонить журналистам, рассказывать, как вы остановили искусственный интеллект.


В целом, несмотря на некоторые артефакты и низкое разрешение, Cycle-GAN на ура справился с задачей.
Смотрите сами:


Мужчины <-> Женщины




Белые <-> Азиаты





Белые <-> Черные




Вы заметили интересный эффект, который дают identity mapping и perceptual loss? Посмотрите на idty_A и idty_B. Женщина становится более женственной (больше макияжа, гладкая светлая кожа), мужщине добавляется растительность на лице, белые становятся еще белее, а черные, соттветственно — чернее. Генераторы выучивают средний стиль для всего домена, благодаря perceptual loss. Здесь прямо напрашивается создание приложения для "бьютификации" ваших фоточек. Shut up and give me your money!


Вот вам Лео:




И еще несколько знаменитостей:











Лично меня этот мужик-Джоли испугал.


А теперь, внимание, очень сложный кейс.




Увеличение разрешения


CycleGAN хорошо справился с поставленной задачей. Но получающиеся изображения имеют маленький размер и некие артефакты. Задача увеличения разрешения называется Image Superresolution. И эту задачу уже научились решать с помощью нейронных сетей. Хочу отметить две state-of-the-art модели: SR-ResNet и EDSR.


SRResNet


В статье Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network авторы предлагают архитектуру генеративной сети для задачи super-resolution (SRGAN), в основу которой положена ResNet. В дополнение к попиксельной MSE авторы добавляют Perceptual loss, используя активации предобученной VGG (видите, все так делают!) и дискриминатор, естесственно.


В генераторе используются residual блоки со свертками 3x3, 64 фильтрами, батчнормом и ParametricReLu. Для увеличения разрешения используются два SubPixel слоя.


В дискриминаторе есть 8 сверточных слоев с ядром 3х3 и увеличивающимся числом каналов с 64 до 512, активации везде — LeakyReLu, после каждого удвоения числа фич — разрешение картинки уменьшается за счет страйда в свертках. Пулинг-слоев нет, в конце — два полносвязных слоя и сигмоида для классификации. Схематично генератор и дискриминатор изображены ниже.




EDSR


Enhanced Deep Super-Resolution network это тот же SRResNet, но с тремя модификациями:


  • Нет батч-нормализации. Это позволяет сократить до 40% используемой во время обучения памяти и увеличить число фильтров и слоев
  • За пределами residual блоков не используется ReLu
  • все resnet-блоки умножаются на коэффициент 0.1 перед их добавлением к предыдущим активациям. Это позволяет стабилизировать обучение.

Обучение


Для обучения SR-сети нужно иметь датасет изображений высокого разрешения. Определенные усилия и время пришлось потратить на то, чтобы спарсить с инстаграма несколько тысяч фотографий по хештегу #face. Но куда без этого, все мы знаем, что сбор и обработка данных это 80+% объема нашей работы.


Обучать SR-сети принято не на полных изображениях, а на патчах небольшого размера, вырезанных из них. Это позволяет генератору обучиться работать с мелкими деталями. А в рабочем режиме на вход сети можно подавать картинки любого размера, ведь это fully-convolutional сеть.


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


В итоге для нашего пайплайна мы выбрали SRRestNet, обученную на патчах 64х64, в качестве Perceptual loss использовались 2 и 5 слои VGG-16, и дискриминатор мы вообще убрали. Ниже несколько примеров из обучающего множества.








А вот так эта модель работает на наших искусственных изображениях. Не идеал, но уже неплохо.






Вставка изображения в оригинал


Даже эту задачу можно решить нейросетями. Я нашел одну интересную работу по image blending. GP-GAN: Towards Realistic High-Resolution Image Blending. Подробности рассказывать не буду, покажу лишь картинку из статьи.




Реализовать эту вещь мы не успели, отделались простым решением. Вставляем наш квадрат с трансформированным лицом обратно в оригинал, постепенно увеличивая прозрачность картинки ближе к краям. Получается примерно так:




Опять же, не идеал, но на скорую руку — ок.


Заключение


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


И вообще, очень хочется собраться на каком-нибудь хакатоне и допилить получившийся прототип до нормального веб-приложения.


А дальше уже можно думать о том, чтобы попробовать перенести ГАНы на мобильные устройства. Для этого надо пробовать разные техники по ускорению и уменьшению нейросетей: факторизация, knowledge distillation, вот это вот все. И про это у нас скоро будет отдельный пост, следите за обновлениями. До новых встреч!


Комментарии (58)


  1. Unk
    16.10.2017 15:47

    Каждый раз, когда я вижу очередную статью про то, что нейросети делают что-то крутое и не нахожу ссылку на веб-сайт с демонстрацией, где можно загрузить свою картинку и чтобы сеть её обработала — я очень расстраиваюсь. Уж простите моё дилетанство.


    1. VovanZ
      16.10.2017 15:56
      +1

      Нейросети — это очень дорого, в смысле вычислительных ресурсов. Чтобы сделать такой сайт, придётся либо потратить много денег на сервера, либо вы никогда не дождётесь результата, т. к. пользователи будут добавлять фоточки быстрее, чем они будут обрабатываться.


      1. sumanai
        16.10.2017 16:36

        Ждём реализации на яваскрипт.


        1. VovanZ
          16.10.2017 16:56

          Сходу гуглится: раз, два, уверен, что на самом деле их куда больше.


          Правда, ни первая, ни вторая пока не поддерживают GPU, но, думаю, это дело времени.


          1. erwins22
            16.10.2017 19:19

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


      1. Dmitry_7
        17.10.2017 07:38

        Сделать очередь на улучшение фоток и продавать места


  1. erwins22
    16.10.2017 16:03

    Спасибо.
    Такое впечатление что люди текут, нагрели восковые фигуры и щеки потекли.


  1. Meklon
    16.10.2017 16:19

    Восхитительно, спасибо. Кстати, интересный эффект при наложении male на male и female на female. Признаки пола усиливаются и, субъективно, лицо становится привлекательнее.


    1. gaploid
      17.10.2017 00:45

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


      1. SynmanProff
        17.10.2017 09:44
        +1

        Если я возьму фотку очень страшной женщины и начну накладывать ее саму на себя N-ное количество раз, станет ли она красоткой? филосовский вопрос


        1. mephistopheies
          17.10.2017 09:53
          +1

          хоть вопрос и философский, но ответ есть

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

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


        1. johnkorn Автор
          17.10.2017 10:03
          +1

          вот, я прогнал Джоли три раза — постепенно она превращается в куклу.
          image


          1. BubaVV
            17.10.2017 11:21

            Многие такого добиваются пластикой IRL


        1. johnkorn Автор
          17.10.2017 10:25
          +3

          Вообще я этот эффект подробнее хотел расписать, но забыл))
          Вот еще пара фоток
          image


          1. Meklon
            17.10.2017 10:49

            Вооот) То, что надо) А можно с мужчинами? Причем изначально взять какой-нибудь небрутальный вариант.


            1. johnkorn Автор
              17.10.2017 11:08
              +3

              Бибер — это достаточно небрутально?))


              1. Meklon
                17.10.2017 11:24

                Милота какая. Он куда-то в сторону Колина Фаррела съехал) Фильтр-брутализатор.
                image


                1. GAZ69
                  17.10.2017 13:00

                  А мне асоциируется Бутусов

                  спрятал фото
                  image


              1. Tallefer
                17.10.2017 17:46

                Зомг. Я правильно понял, что на 3 итерации кадык превратился в подбородок или это просто зум?


                1. johnkorn Автор
                  17.10.2017 22:40

                  зум)


          1. Aquilo
            17.10.2017 11:38
            +2

            Разберись с высокими разрешениями и продай как фильтр Adobe


          1. Z0K
            17.10.2017 14:31

            А вот это просто великолепный результат!

            Реквестирую для полноты картины пример конвертации европеоидов в супер-азиаток и обратно.


  1. Bone
    16.10.2017 17:43

    Очень круто. Побольше бы таких статей.


  1. ToJIka4
    16.10.2017 19:18
    +1

    Лена Сёдерберг напрашивается в эту статью


  1. erwins22
    16.10.2017 21:03
    +1

    По анализу статьи.

    Фотки красивых не используете, что бы не было видно сразу искажение?
    AvеregePool и MaxPool больше не в тренде?
    Выделение частей изображения через N-сеть и использование получившихся масок и последующим объединением, некий вариант внимания? например для фона и лица разные сети.

    Не пытались обучать на повороте лица?
    Не пытались сделать ган для определения привлекательности лица (учет лайков) и использования как дополнительного параметра обучения?

    Полное соединение имеет слишком большое количество коэффициентов поэтому не особо обучаемо.


    1. johnkorn Автор
      17.10.2017 10:57

      Фотки красивых не используете

      имеете в виду высокого разрешения? на вход cycleGAN идут картинки 128x128 из-за особенностей датасета

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

      а вот это не понял, извините.


      1. erwins22
        17.10.2017 11:20

        Знаменитости в основном это старые куклы. Средний возраст знаменитости помойму за 50.
        Все таки молодые лица более красивые.

        Выбрать фотки с высоким числом лайков (предполагаю более красивые) и использовать их как еще один дискриминатор. Т.е. не только мужчина/женщина, но и красивая/подделка.


        1. mephistopheies
          17.10.2017 11:23

          у женщин это дет 25, у мужиков 40

          а число лайков это слишком смещенная мера, слишком зависит от раскрутки аккаунта


          1. erwins22
            17.10.2017 13:07

            т.е. Мужчин будет делать старше, а женщин моложе?


        1. johnkorn Автор
          17.10.2017 11:41

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


  1. sim0nsays
    16.10.2017 21:11
    +1

    Отличная работа!
    Вопрос по объяснениям, я не очень понял вот этот пассаж:

    В нашем случае генератор мапит входное изображение не на один скаляр, как обычно, а на 512 выходных картинок (уменьшенного размера), по которым уже делается вывод «real or fake». Это можно интерпретировать как взвешенное голосование по 512 патчам входного изображения.

    Генератор же выдает не скаляр, а картинку? И как это — выдавать 512 выходных картинок? Или это дискриминатор имеется вввиду? Почему он тогда картинку выдает? Поясните плз?


    1. mephistopheies
      16.10.2017 21:15

      ага это дискриминатор


  1. ganqqwerty
    17.10.2017 00:21

    Все-таки традиционный подход с вычислением среднего лица как-то лучше работает, по-моему.


  1. divanikus
    17.10.2017 00:26

    Я подумал это female Нагиев…
    image


  1. salisbury-espinosa
    17.10.2017 00:31
    +1

    Если же работа "старых" методов по каким-то причинам вас не устраивает, можно попробовать deep learning. Для решения задачи обнаружения лица подойдут любые Region Proposal Networks, например YOLOv2 или Faster-RCNN. Как попробуете — обязательно поделитесь тем, что у вас получилось.

    использую https://github.com/davidsandberg/facenet
    причина — dlib не распознает часто лица под разным наклоном


  1. Dmitry_7
    17.10.2017 07:32

    А можно нейросеть научить генерировать биткоины, похожие на настоящие?


    1. erwins22
      17.10.2017 07:57

      пока не видел подобного. Возможно просто никто не пробовал.


    1. xmaster83
      17.10.2017 13:40

      Ты аккуратней с такими идеями а то сейчас откроешь новый эльдорадо.


  1. DarkByte2015
    17.10.2017 13:40
    -2

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


    1. erwins22
      17.10.2017 13:52

      Идея для правительства. Разрешить только такие трансформации данных, которые можно объяснить. (аналог ограничений на системы выдачи кредитов в Европе и США, там нейронки нельзя)


    1. mephistopheies
      17.10.2017 13:54

      да, тебе одному кажется, что существуют какие то «традиционные ценности»


      1. erwins22
        17.10.2017 14:29

        Это общепринятые ценности 50 лет назад вне зависимости от точки отсчета.


    1. alix_ginger
      17.10.2017 14:05
      +4

      Возможно, вы просто слишком много думаете о транссексуалах.


    1. sumanai
      17.10.2017 16:24

      Теперь психи меняющие пол

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


      1. DarkByte2015
        17.10.2017 16:27

        Ну мое мнение — что тот кто этого хочет по умолчанию психически нездоров, а то что какие-то психиаторы в пиндостане считают это нормальным еще ничего не значит.


        1. vvzvlad
          18.10.2017 18:37

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


          1. erwins22
            19.10.2017 10:01
            -1

            У вас есть такой опыт?


          1. alix_ginger
            19.10.2017 13:58

            Похоже, что Вы разбираетесь в вопросе. Можете объяснить, почему если условный Игорь считает, что он Наполеон — то он болен, а если условный Пётр считает, что он женщина — он здоров? В чем объективное различие? Не ради троллинга, я на самом деле хочу это понять.


            1. erwins22
              19.10.2017 14:08

              Просто хочется узнать из первоисточника. Не играть в глухой телефон.
              Еще интересно посмотреть различие гормонов, МРТ и т д.


            1. vvzvlad
              19.10.2017 14:31
              +1

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

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

              И если вы считаете, что такой комфорт человека — ерунда, то стоит держать свое мнение при себе. Поверьте, у человека, гендер которого не совпадает с полом(если это не выпендреж, а реальные ощущения) и так огромная куча проблем по взаимодействию с окружающими, больше чем вы можете себе представить. Не надо ему лишний раз говорить о том, что он болен.


              1. alix_ginger
                19.10.2017 16:02

                Главный вопрос у меня, если честно — что такое вообще гендер? Из всего, что я читал, я понял, что это не более чем стереотип поведения «типичный мужик» или «типичная женщина». Разговаривал с несколькими людьми «в теме», никто так и не смог привести аргументы, почему одному из этих стереотипов непременно нужно соответствовать.

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

                Я так понимаю, что здесь под «мужчиной» и «женщиной» вы понимаете гендер, потому что физические отличия довольно-таки существенные, а пол определяется при зачатии.

                петр может не только считать себя женщиной, но и фактически быть ей. Это подтвердят и психологические тесты, и анализы.

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

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

                Я пока вижу Петра человеком, который считает, что у него нет руки.

                И если вы считаете, что такой комфорт человека — ерунда, то стоит держать свое мнение при себе.

                Я не считаю, что комфорт человека — ерунда. Но без Ваших объяснений я вряд ли пойму, в чем вообще проблема и как ее решению может помочь пластическая операция.


                1. vvzvlad
                  19.10.2017 17:07

                  Главный вопрос у меня, если честно — что такое вообще гендер?

                  Ну, вы википедию-то откройте. Гендер — это то, кто вы, безотносительно физического пола. Если у вас завтра оторвет половые органы, то вы не перестанете быть мужчиной. Более того, если вам насильно сделают операцию по перемене пола, вы все равно не перестанете ощущать себя мужчиной(по крайней мере, первое время). Значит, гендерно вы мужчина. Если завтра утром вы проснетесь в теле девушки, ваш гендер будет отличаться от вашего пола.

                  Я так понимаю, что здесь под «мужчиной» и «женщиной» вы понимаете гендер, потому что физические отличия довольно-таки существенные, а пол определяется при зачатии.

                  Нет, таки я понимаю пол. Физические отличия мужчины от женщины, при том, что они оба живут в современности, гораздо меньше физических отличий некого мужчины от наполеона(тело наполеона представляет собой что-то вроде костей, а личности наполеона нет вообще, а мужчина вот он, стоит) или мужчины от бога/инопланетянина/земляного червяка/демона ада. Это к вопросу «а чем мужчина, считающий, что он женщина, отличается от мужчины, считающего себя наполеоном».
                  По поводу зачатия и пола — не все так однозначно. При зачатии определяется хромосомный набор. В зависимости от этого в развивающемся плоде начинается экспрессия различных генов, которые запускают развитие желез, которые вырабатывают гормоны, в соответствии с которыми развиваются органы. Мог ошибиться в терминологии, но в целом — хромосомный набор мужчины не равен мужскому полу(и даже не равен мужским половым органам, если уж на то пошло, пусть это и бывает гораздо реже). Строение вашего мозга по мужскому типу обусловлено концентрацией гормонов во время развития этого самого мозга. Изменяется концентрация гормонов — и вот уже вторичные половые признаки(и зачастую первичные) уже не так хорошо идентифицируют вас как мужчину, а мозг развивается по другому, и вы уже сами перестаете так себя идентифицировать.

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

                  Причем тут стереотипы? Петр(из-за каких-то внутренних изменений, это не суть важно) чувствует, что ему комфортнее ощущать себя женщиной. Ну вот вам будет некомфортно, если вас будут называть девушкой, а ему не очень комфортно, если его называют парнем. Хочет он при этом быть строителем или модельером, не суть важно.
                  И делать ему операцию или не делать — это уж как ему хочется. Если ему вполне нормально с членом между ног, то смысла в операции нет. Если ему это ужасно мешает — то пусть делает. Главное, не запрещать ему это, и не говорить «сраный извращенец».

                  Я пока вижу Петра человеком, который считает, что у него нет руки.

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

                  Я не считаю, что комфорт человека — ерунда. Но без Ваших объяснений я вряд ли пойму, в чем вообще проблема и как ее решению может помочь пластическая операция.

                  Ну, я уже говорил — представьте, что у выросла грудь, а все знакомые называет вас Ирой. Каждый день. Попытки доказать им, что вы не Ира, а Виталий, просто случилась фигня, ничего не дают. У выхода с работы вас ждет коллега, который жаждет пригласить вас в кино, потом в ресторан, а потом переспать с вами. Коллега мужчина, если что. Коллега вам по-человечески нравится, но так как вы остались гендерно мужчиной с гетеросексуальной ориентацией, от мысли переспать с ним вас воротит. Если вы не считаете эту ситуацию(а именно с такими проблемами сталкиваются люди с гендером, не соответствующим полу) проблемой, то могу вас поздравить, вы на редкость непрошибаемый человек. У большинства людей такая ситуацию вызывает проблемы в общении с обществом, близкими, мысли «со мной что-то не так», депрессию и далее по нарастающей, вплоть до попыток самоубиться.
                  Спокойной отношение к людям с такими проблемами помогут им жить нормальной жизнью. Причем помогут гораздо больше, чем операция.


                  1. alix_ginger
                    19.10.2017 19:03
                    +1

                    Ну, вы википедию-то откройте.

                    Если бы там все было мне понятно, я бы Вас не спрашивал. Кстати, Ваш ответ тоже ничего не проясняет.

                    Что вообще может означать «чувствовать себя мужчиной» и «чувствовать себя женщиной»? Если я вдруг проснусь и обнаружу, что мое тело — женское, а личность и воспоминания остались прежними, я не буду никому доказывать, что я «на самом деле» мужчина. Я буду девушкой, которая большую часть времени ведет себя как мужчина.

                    При зачатии определяется хромосомный набор.

                    В том числе XX или XY-хромосомы, которые и определяют пол. Или с 2007 года что-то новое открыли?

                    Причем тут стереотипы? Петр(из-за каких-то внутренних изменений, это не суть важно) чувствует, что ему комфортнее ощущать себя женщиной.

                    Как он смог ощутить себя женщиной, чтобы это определить?

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

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

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

                    А в чем проблема-то? Что меня зовут в кафе и хотят переспать со мной (в женском теле), когда я этого не хочу? С этим и цисгендерные люди сталкиваются. Я сделаю то же самое, что сделаю, если меня сейчас пригласит в кафе (с целью переспать) гей — откажусь.

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

                    Я вообще таких людей не встречал. И я еще раз повторюсь, я здесь пишу не для того, чтобы оскорбить трансгендеров или Вас лично, а наоборот, чтобы их понять. Давайте не будем переходить на личности.


                    1. vvzvlad
                      19.10.2017 20:09

                      В том числе XX или XY-хромосомы, которые и определяют пол. Или с 2007 года что-то новое открыли?

                      Эм. Гм. Я даже потерялся, что на это ответить.
                      Я там помимо предложение, на которые вы ответили, написал еще несколько. Вы сейчас процитировали первое, и утверждаете, что из него следует утверждение Z. Но я же в следующих предложениях объяснил, что их этого следует не Z, а D! Вы их читали или нет? А то сейчас вы утверждаете, что у человека член растет напрямую из Y-хромосомы.
                      Еще раз. Хромосомный набор != пол. После слияния сперматозоида с яйцеклеткой получается клетка, которая обладает или женским или мужским хромосомным набором. Дальше она начинает делиться. В процессе развития зародыша, в зависимости от экспрессии соответствующих генов(= хромосомного набора), формируются те или иные половые железы, которые начинают выделять гормоны и пептиды, которые направляют развитие организма в ту или иную сторону. Экспрессия генов не влияет напрямую на половое развитие организма. Строение органов и по мужскому, и по женскому типу закодировано во всем геноме, и то, будут ли мужские половые признаки или женские зависит в большей степени от концентраций гормонов во время развития/жизни.
                      У вас есть соски и грудь, и есть вы начнете принимать гормоны, у вас вырастет женская грудь, которая будет способна в какой-то мере даже продуцировать молоко, несмотря на то, что хромосомный набор у вас полностью мужской.
                      Если вы знаете про XY и XX хромосомы, значит вы должны хотя бы на уровне школьной программы понимать разницу между фенотипом и генотипом. Генотип — то, что заложено, фенотип — то, что выросло, если совсем-совсем упрощать. Так вот, фенотип не определяется полностью генотипом. И нет четкого участка в геноме, который определяет фенотипический пол. Потому что фенотипический пол зависит от кучи мест в геноме, а так же от условий развития.
                      Есть, например, такое заболевание, как синдром Морриса — когда генотип мужской, т.е. XY, но в хромосоме X сломан ген, который кодирует андрогеновый рецептор. Знаете, какая там получается забавная штука? Если андрогеновый рецептор сломан совсем, то у человека с таким заболеванием есть мужские половые железы, яички, которые прекрасно продуцируют весь набор мужских гормонов. Однако, так как во всем остальном теле не работают рецепторы андрогенов, воспринимать эти гормоны клетки не могут, и организм развивается полностью по женскому типу — с развитой грудью и влагалищем, мужские яички при этом в процессе развития остаются на месте, внутри таза, и не опускаются. И определяют этот синдром зачастую лет в 20, когда девушка приходит к врачу с вопросом «а чо это у меня месячных нет?». А их и не будет — матки и яичников-то нет. Потому что генотипом определяется только будет яичники или яички, а то, будет там грудь или волосы на лице, это слишком мелко для генома, проще запихнуть в днк оба варианта, а определять уже на месте, в зависимости от гормонального фона.
                      А если при синдроме Морриса ген рецептора сломан не полностью, то там может быть самые разные штуки — от мужчины, у которого всего лишь снижена спермопродукция, до любых промежуточных состояния между мужчиной и вышеописанной женщиной без яичника и матки.
                      Есть еще Синдром де ля Шапеля — когда часть генов мигрирует с Y-хромосомы на X. Получается мужчина(правда бесплодный, со сниженным либидо, и малым ростом волос на лице) с генотипом XX.
                      Синдром Рейфенштейна — мужчина(XY), но в зависимости от выраженности, от разных «веселых» нарушений строения половых органов, до вполне себе девушки.
                      Синдром Свайера — опять девушка с хромосомами XY. Волосы на теле, бесплодие, мыщцы и высокий рост в комплекте. Что забавно, в отличии от с. Морриса матка в этом случае присутствует, и вполне себе функциональна, поэтому, если с помощью ЭКО подсадить туда эмбрион, такая женщина может выносить и родить ребенка. Да, имея хромосомы XY и мужской пол, по вашей логике.

                      И это я кратко-кратко прошелся по нарушениям строения тела. Тело — это, в общем, фигня. Человек это такая сволочь, что ко всему привыкает. Но кроме тела, существует еще и сознание. Сознание напрямую завязано на мозг, который тоже развивается в зависимости от пола по-разному. Почитайте про отличия сами, мне пересказывать еще и это лень. Как думаете, как мозг узнает, развиваться ему по «мужскому» или «женскому» типу? Нет, это опять не закодировано в геноме. В геноме более основные вещи — типа, вот тут у нас кора, вот тут такие структуры, тут другие(на самом деле в геноме и этого, по сути нет, но в данном случае это не суть важно). А мелкие различия типа того, кто будет лучше ориентироваться, а кто лучше будет предметы искать — определяются уже концентрацией гормонов. Причем определяются зачастую не при развитии, а уже при жизни. Начните гормональную терапию, и женщина начнет гораздо лучше ориентироваться на местности и водить. Правда, начнут расти усы и голос станет ниже. Упс.

                      Так вот. Психологические особенности и гендер зависят от строения мозга. Это было доказано еще в каких-то годах, когда девочек и мальчиков пытались воспитывать без гендерных особенностей. Типа, вот вам куча машинок и кукол, разбирайтесь сами. Разбирались, что характерно — девочки играли с куклами и собирались в кучки, мальчики были более индивидуальны и хотели подраться. Без всяких «ну ты же мальчик, ты должен уметь постоять за себя» от взрослых. Если интересно, я попробую найти что-нибудь о тех исследованиях.
                      Строение мозга зависит, как мы выяснили, от гормонального фона. Гормональный фон зависит от кучи факторов — начиная от поломок генов, о чем я говорил выше, заканчивая болезнями и образом жизни родителей. Если у женщины во время беременности повышенный уровень мужских гормонов, то часть этих гормонов проникнет через плаценту и будет влиять и на плод. Соответственно, тут уже можно получить любой спектр изменений. От девушки, которой просто нравятся мужские занятия, до женского мозга, запертого в мужском теле.

                      Как он смог ощутить себя женщиной, чтобы это определить?

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

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

                      Подозреваю, это потому, что вы точно знали, что вы мужчина, а обращающийся ошибся. А вот если бы вы не были точно уверены в своем поле, да вас бы еще ваши родители с детства убеждали в обратном…

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

                      Ни-ни, по отношению к вам я ничего плохого не испытываю(ну, кроме раздражения от уверенности что пол определяется геномом), вы вполне корректны. Я скорее бешусь на людей, которые используют в отношении таких людей слова «психи» и так далее.


                      1. alix_ginger
                        20.10.2017 12:56

                        Насчет определения биологического пола я столько не знал, спасибо, что просветили. По крайней мере, можем согласиться, что после рождения пол определен? Гермафродитов оставим в стороне, не о них сейчас речь.

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

                        В общем, всё исключительно субъективно и всё-таки основывается на стереотипах поведения. Ведь девушку не забьют камнями за то, что она выйдет из дома в брюках, а мужчину не посадят в тюрьму, если он не посмотрел футбол в пятницу?

                        Подозреваю, это потому, что вы точно знали, что вы мужчина, а обращающийся ошибся.

                        Да. Но ведь это то же самое, что и с трансгендерами: например, человек знает, что выглядит как девушка, но «в душе» он/она мужчина?


      1. alix_ginger
        18.10.2017 11:48

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


  1. chroneus
    18.10.2017 22:46

    Отличная работа! Основное замечание — CycleGAN классно переводит текстуры, но не форму. Посмотрите на DiscoGAN, там готовый пример есть. По мелочам — странный выбор dlib, размер патчей исторически определяется железом, разница между EDSR и SRResNet буквально во всем, но для восстановления покореженного лица VGGLoss и правда предпочтительней.


    1. johnkorn Автор
      19.10.2017 10:18

      Спасибо, DiscoGAN я как-то пропустил, надо будет попробовать!