Сегодня будет не совсем обычный проект: мы не будем ничего программировать сами, а просто используем чужой код для интереса, развлечения и просто потому, что можем.
В чём суть
Разработчик Кэтрин Кроусон написала алгоритм, в котором нейросеть по текстовому описанию на английском языке пытается нарисовать подходящую картинку. Например, мы ей пишем (на английском, естественно) «программист-полуночник», а она выдаёт картинку:
Или, например, «Семь грехов», а она в ответ:
Мы, разумеется, попросили алгоритм показать нам кадр из ещё не вышедшей игры Half-Life 3. Фанаты по всему миру ждут, когда же будет продолжение серии про Гордона Фримена и борьбу с «Комбайном». У алгоритма для нас плохие новости:
Интересно, что в оригинальной игре у главного героя ровно такие же очки и оранжевый защитный костюм. Сложно сказать, о чём думал алгоритм, когда рисовал эту картинку, но он явно что-то знает.
Практического смысла в этих картинках пока нет, но удовольствия море. И, самое главное, вы можете получить такие же картинки по любым собственным запросам, причём даже если у вас очень простой компьютер.
Где попробовать
Для работы с алгоритмом достаточно интернета и гугловского ноутбука в облаке. Мы уже писали про jupyter-ноутбуки, но на всякий случай вот суть:
- Ноутбук — это среда выполнения для кода, которая позволяет сразу видеть результат работы всех частей кода. В нашем случае это среда для Python, но бывают и ноутбуки для других языков.
- Можно эту среду запустить на своём компьютере, а можно использовать облачные ноутбуки. Если запускать у себя, то ноутбук сможет использовать все системные ресурсы и работать быстрее. Если в облаке — ресурсы облачного компьютера.
- Пример такого облачного ноутбука — «Гугл Колаб». Им можно делиться с кем угодно, и тот, у кого есть ссылка на ноутбук, может тоже запустить тот же самый алгоритм.
Вот ноутбук, в котором можно запустить этот алгоритм. На всякий случай мы сделали свою копию, если вдруг исходный ноутбук будет недоступен.
Куда писать свой текст?
Промотайте ноутбук до середины и найдите раздел Settings for this run. В нём будет переменная prompt — в ней и задаётся фраза, по которой алгоритм будет рисовать картинку. Что вы здесь напишете — то и получите. Ну или не совсем то, но тоже будет в тему. Или нет. Мы не знаем, это нейросеть, там всё непредсказуемо.
Как запустить
Заходите в меню и выбираете «Среда выполнения» → «Выполнить всё»:
Где увидеть результат
Пролистайте страницу до конца кода — после него будет строчка с прогрессом выполнения:
Она показывает, на сколько процентов готова ваша картинка. Каждые 10% ноутбук выдаёт промежуточный результат. Можно посмотреть, как менялась картинка на очередном этапе вычислений:
Самая последняя картинка с надписью Step 999 и будет итоговым результатом работы алгоритма.
Красивые гифки с процессом
Если собрать все промежуточные картинки, то можно увидеть, как алгоритм на каждом шаге улучшает свой результат.
Что там под капотом
Внутри работают два нейросетевых алгоритма.
Первый — ImageNet из OpenAI. Он генерирует картинки 256 на 256 пикселей. Его задача — получить картинку максимального качества. Для этого он раз за разом улучшает детализацию и делает картинку чётче и подробнее.
Второй алгоритм — CLIP: он соединяет текст с картинками. Изначально CLIP создавался для того, чтобы, наоборот, распознать, что изображено на фото. Но в этом алгоритме он работает в обе стороны — говорит, что нужно сделать, а потом раз за разом проверяет, что получается.
Вместе они работают так:
- CLIP говорит второму алгоритму, к какой картинке она должна стремиться.
- ImageNet старательно делает первый набросок и показывает его.
- CLIP оценивает, насколько это совпадает с запросом, и говорит, в каком направлении нужно двигаться дальше.
- ImageNet делает второй набросок и показывает его снова.
- Так продолжается до тех пор, пока CLIP не скажет «всё, хорош» или когда точность приближения, по мнению нейросети, не будет ниже той, что нужна для остановки.
Откуда нейросеть всё это знает
Чтобы алгоритм мог сопоставлять слова с картинками, нейросеть специально обучали на огромном множестве изображений с описаниями. Там было всё: и фото людей, и котят, здания, игры, машины, книги, чашки, свитеры, чугунные ванны и фарфоровые статуэтки.
Если бы не было такого набора с данными, нейронка сама бы не поняла, что кошка — это кошка, и выдавала бы просто квадрат из несвязных пикселей.
Получается, что эти два алгоритма в связке просто пытаются подражать тем изображениям, на которых они были обучены. Они не обладают собственным образным мышлением и не придумывают ничего с нуля — лишь берут огромную базу существующих впечатлений и комбинируют их по инструкции.
Похожим образом работает «Балабоба» Яндекса — это нейросетевой алгоритм, обученный на огромном корпусе текстов из интернета. Когда мы даём задание «Балабобе», алгоритм дёргает нужные фразы из корпуса и выдаёт результат.