Как Google учит компьютер рисованию с помощью котят и поросят

12383

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

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

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

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

Существует огромное количество исследований о генерирационном моделировании изображений с использованием нейросетей. Большинство ФОКУСируются на моделировании растровых изображений, представленных как 2D-сетка пикселей. Эти модели способны генерировать реалистичные изображения благодаря высокой размерности 2D-сетки, но ключевая проблема для них — создавать образы со связной структурой. К примеру, эти модели иногда производят забавные изображения кошек с тремя глазами или многоголовых собак:

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

В нашей модели мы специально добавляем к этому вектору шум. Мы показываем, что если добавить шум в коммуникационный канал между энкодером и декодером, модель более не сможет точно воссоздать входящее изображение — ей придется учиться «схватывать сущность» эскиза. Наш декодер берет входящий вектор и имитирует последовательность движений рукой, нужных, чтобы создать новый скетч. На рисунке ниже мы «скормили» модели несколько настоящих рисунков кота:

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

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

Это означает, что сеть обучилась раскодировать входящий рисунок в набор абстрактных идей, из которых состоит кот, воплощенных во входящем векторе, и способна создать на его основе полностью новый рисунок. Мы повторим эксперимент — на сей раз на модели, натренированной на рисунках поросят и придем к тому же выводу. Когда ей предлагают рисунок восьминогой свиньи, модель генерирует подобную свинью, но с четырьмя ногами. Если мы подложим ей рисунок грузовика — получим свинью, которая немного смахивает на грузовик.

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

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

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

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

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

Творческое применение

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

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

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

Мы можем пойти еще дальше и заставить разные модели завершать один и тот же незавершенный рисунок:

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

Оставить комментарий

Комментарии | 0

Поиск