Чтобы научить компьютер рисовать так же, как человек, создавая рисунок из абстрактных частей, как оказалось, нужно вложить немало усилий. Компания Google в свежей статье рассказывает о том, как она обучает нейросети рисованию, начиная с примитивных эскизов, изображающих животных.
Абстрактная визуальная коммуникация – ключевая для процесса передачи идей от одного человека к другому. С раннего возраста дети развивают способность изображать объекты и, возможно, даже эмоции, всего несколькими штрихами. Эти простые рисунки хоть и не отражают реальности, как фотография, но рассказывают нам о том, как люди воссоздают образы окружающего их мира.
В нашем недавнем исследовании “Репрезентация нейросетью рисунков-эскизов” мы рассказываем о рекуррентной нейронной сети (нейронной сети с обратными связями, RNN), способной производить наброски известных объектов, с целью научить компьютер рисовать и обобщать абстрактные идеи так же, как это делает человек.
Мы обучаем нашу модель на данных эскизов, нарисованных от руки, каждый рисунок – это последовательность движений руки, контролирующей ручку: в какую сторону ей вести, когда окончить рисунок. Мы создали модель, которая может найти себе множество применений: от помощи художнику до помощи в обучении рисованию.
Существует огромное количество исследований о генерирационном моделировании изображений с использованием нейросетей. Большинство ФОКУСируются на моделировании растровых изображений, представленных как 2D-сетка пикселей. Эти модели способны генерировать реалистичные изображения благодаря высокой размерности 2D-сетки, но ключевая проблема для них – создавать образы со связной структурой. К примеру, эти модели иногда производят забавные изображения кошек с тремя глазами или многоголовых собак:
Но в данной работе мы исследуем низкоразмерное векторное отображение – ведь так обычно рисуют люди. Наша модель, эскизная RNN, основана на фреймворке sequence-to-sequence-автоэнкодера, цель которого – обучить сеть кодировать входящую последовательность во входной вектор чисел с плавающей точкой, и из него реконструировать исходящую последовательность, используя декодер, который воссоздает входящую последовательность как можно точнее.
В нашей модели мы специально добавляем к этому вектору шум. Мы показываем, что если добавить шум в коммуникационный канал между энкодером и декодером, модель более не сможет точно воссоздать входящее изображение – ей придется учиться “схватывать сущность” эскиза. Наш декодер берет входящий вектор и имитирует последовательность движений рукой, нужных, чтобы создать новый скетч. На рисунке ниже мы “скормили” модели несколько настоящих рисунков кота:
Важно подчеркнуть, что воссозданные эскизы – это не копии входящих данных, это новые наброски котов, с такими же характеристиками, как и входящие. Чтобы продемонстрировать, что модель не просто копирует входящую последовательность и что она фактически чему-то обучилась о том, как рисуют люди, мы пробуем отдать ей нестандартные рисунки:
Когда мы предлагаем ей рисунок трехглазого кота, модель генерирует похожего кота, но с двумя глазами: ведь она обучилась тому, что у кошек обычно два глаза. Чтобы доказать, что наша модель не выбрала этого кота из набора нормальных рисунков котов, которые она запомнила до этого, попробуем что-то совершенно другое: набросок зубной щетки. Сеть генерирует котоподобную фигуру с длинными усами, которая имитирует черты и положение щетки.
Это означает, что сеть обучилась раскодировать входящий рисунок в набор абстрактных идей, из которых состоит кот, воплощенных во входящем векторе, и способна создать на его основе полностью новый рисунок. Мы повторим эксперимент – на сей раз на модели, натренированной на рисунках поросят и придем к тому же выводу. Когда ей предлагают рисунок восьминогой свиньи, модель генерирует подобную свинью, но с четырьмя ногами. Если мы подложим ей рисунок грузовика – получим свинью, которая немного смахивает на грузовик.
Чтобы понять, как входящие векторы кодируют отдельные черты животных, мы получаем такие векторы для двух очень разных рисунков поросят – это голова свиньи в зеленой клеточке и целая свинья в оранжевой.
Мы хотим понять, как наша модель научилась представлять поросят и единственный способ сделать это – интерполяция между двумя разными входящими векторами и визуализация каждого сгенерированного рисунка от каждого интерполированного вектора. На рисунке внизу мы показываем, как набросок головы поросенка медленно превращается в рисунок целой свиньи и в процессе – как модель организовывает эти наброски. Мы видим, что входящий вектор контролирует относительную позицию и размер носа, а также – существование тела и ног.
Мы также хотим понять, сможет ли наша модель представлять различных животных и если да – как они будут выглядеть. На картинке внизу мы сгенерировали рисунки из интерполированных входящих векторов для головы кота и целой свиньи. Мы видим, как представление медленно меняется от головы кота к коту с хвостом, к коту с телом и наконец – к свинье с телом. Как ребенок, учащийся рисовать животных, наша модель учится конструировать животных, добавляя голову, ноги, хвост к телу.
Эти примеры интерполяции показывают, что входящие векторы действительно кодируют ключевые черты рисунка. Но можем ли мы использовать их, чтобы менять другие рисунки (без этих черт) – к примеру, добавлять тело к голове кота?
Мы видим, что для модели, обученной на рисунках кота и поросенка, аналогии в рисунке возможны. Мы можем изъять вектор, отвечающий за голову поросенка, из вектора целого поросенка, и получить при этом вектор, представляющий идею тела поросенка. Если добавить его к вектору головы кота, получим целого кота.
Творческое применение
Кроме исследовательской ценности работы мы также заинтересованы в творческом применении RNN-рисовальщика. Самый простой кейс: дизайнеры орнаментов и узоров для текстиля или обоев могут использовать нашу RNN для генерации большого количества похожих, но уникальных орнаментов. Ниже – подобные, но уникальные коты, сгенерированные моделью на основе примеров.
Как и в примере с грузовиком, похожим на поросенка, дизайнеры смогут скармливать нашей RNN различные объекты, чтобы получать абстрактные композиции. К примеру, на рисунке ниже мы отдали модели, обученной на котах, рисунки различных стульев, и получились “котостулья”.
С помощью этой RNN мы можем также предсказывать, как может выглядеть окончательная версия незавершенного рисунка. Модель сможет предлагать художникам различные способы закончить рисунок.
Мы можем пойти еще дальше и заставить разные модели завершать один и тот же незавершенный рисунок:
Подобные модели найдут творческое применение во многих областях, возможно, также научат нас чему-то новому о том, как работает творческое мышление человека.