Lingtrain books


Upd. 04.12.2021. Наш телеграм канал


Upd 10.09.2021. Добавил ещё одну подборку Colab'ов для генерации картинок


Upd 21.09.2021. Добавил пару иллюстраций к Дюне для примера


Статья будет интересна всем любителям программирования, иностранных языков и красивых книг. Сначала мы сделаем параллельную книгу, имея на руках два обычных текста. Затем мы проиллюстрируем ее картинками в стиле pixel art на основе лишь текстовых подсказок.


Книгу можно сделать более чем на сотне языков с восстановлением и подсветкой связей между предложениями:


Lingtrain


А теперь давайте сделаем такую книгу сами.


Как выбрать книгу


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


И как её найти


Как же, например, найти Стругацких на немецком или рассказы Акутагавы Рюноскэ в оригинале? Многие произведения на иностранном языке можно приобрести на площадках типа Amazon или Google Play. Можно пойти другим путем (халява, сэр) и поискать книги в не менее популярных местах, типа Флибусты или Z-library, прикрытых тонкой сетью Роскомнадзора.


Чем будем делать


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


Демо


Я записал небольшое демо с выравниванием английско-русской версии рассказа "Страж-птица" Роберта Шекли и японско-русской редакции известного рассказа Акутагавы Рюноскэ "В чаще". Там же показано как пользоваться кодом для создания иллюстраций.



Проект Lingtrain


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


Установка


Для начала запустим приложение Lingtrain Alignment Studio локально при помощи docker'а. Если вы еще не знакомы с этой технологией, то вот основное, что вам нужно знать, — приложение со всеми зависимостями уже установлено внутри некой сущности, называемой контейнером, и хранится в облаке. Вам нужно этот контейнер скачать и запустить. Docker доступен на всех популярных операционных системах и с его установкой обычно не бывает сложностей. Также приложение можно запустить из исходников, инструкция есть в репозитории проекта.


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


docker pull lingtrain/aligner:v6-labse

docker run -v C:\app\data:/app/data -v C:\app\img:/app/static/img -p 80:80 lingtrain/aligner:v6-labse

Здесь папки C:\app\data и C:\app\img это папки на вашем компьютере, которые надо предварительно создать, в них будут храниться все ваши наработки.


После запуска приложение станет доступно в браузере по адресу localhost.



Поддержка языков


Как видно из названия образа lingtrain/aligner:v6-labse, в нем используется модель LaBSE, натренированная на 109 языках. Кроме того, родственные языки тоже должны неплохо выравниваться, башкирские коллеги успешно проверили это на местной версии "Книги джунглей" Киплинга, хотя модель на башкирском не обучалась. Помогло "знание" моделью татарского языка, близкого по лексике и грамматике. Также есть версия на другой модели от sentence-transformers, на 50+ языков, меньшей по объему и работающей быстрее.


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


Подготавливаем тексты


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


Сейчас поддерживаются следующие метки:


Метка Значение Пример Примечание
%%%%%author. Автор А.С. Пушкин%%%%%author. Обязательная метка
%%%%%title. Название Капитанская дочка%%%%%title. Обязательная метка
%%%%%qtext. Цитата Сытый конному не пеший%%%%%qtext. Парная метка
%%%%%qname. Подпись под цитатой Народная мудрость%%%%%qname. Парная метка
%%%%%image. Изображение https://ya.ru/image.png%%%%%image. Парная метка
%%%%%h1. %%%%%h2. Заголовки (большой и поменьше) Глава 1%%%%%h2. Парная метка
%%%%%translator. Автор перевода Нора Галь%%%%%translator.
%%%%%divider. Разделитель %%%%%divider.

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


После добавления разметки у вас должен получиться примерно такой текст:


Дэн Симмонс%%%%%author.
Гиперион%%%%%title.

Посвящается Тэду%%%%%qtext.

Пролог%%%%%h1.

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

Зазвонил приемник мультилинии.

...

И второй:


Dan Simmons%%%%%author.
Hyperion%%%%%title.

This is for Ted%%%%%qtext.

Prologue%%%%%h1.

The Hegemony Consul sat on the balcony of his ebony spaceship and played Rachmaninoff’s Prelude in C-sharp Minor on an ancient but well-maintained Steinway while great, green, saurian things surged and bellowed in the swamps below.

A thunderstorm was brewing to the north. Bruise-black clouds silhouetted a forest of giant gymnosperms while stratocumulus towered nine kilometers high in a violent sky. Lightning rippled along the horizon. Closer to the ship, occasional vague, reptilian shapes would blunder into the interdiction field, cry out, and then crash away through indigo mists. The Consul concentrated on a difficult section of the Prelude and ignored the approach of storm and nightfall.

The fatline receiver chimed.

...

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


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


Lingtrain app 1


Создаем параллельный корпус


То, что мы сейчас построим, называется параллельным корпусом. У нас есть N предложений на одном языке и M на другом. Выравнивания два этих потока, мы получим какое-то количество пар текстов, это и будет корпус. Процесс разбит на три части:


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


  2. Разрешение конфликтов. Система комбинирует строки между корректными цепочками между собой и выбирает наилучший вариант. На размер конфликта в этой сборке стоит ограничение в 30 строк, чтобы не повиснуть при слишком большом количестве вариантов.


  3. Валидация и редактирование. После второго пункта могут остаться большие конфликты либо разрывы, если в одном из текстов не было соответствующего отрывка. На конфликт можно посмотреть и перейти к нему в редакторе по нажатию на кнопку Open in editor. В редакторе можно редактировать строки, объединять их или удалять. Большие конфликты можно довести до меньшего размера руками и разрешить автоматически.



Выберем загруженные нами тексты и перейдем к выравниванию.


Настройки



Количество батчей. Выравнивание идет по кускам размером 200 строк, можно задать количество таких кусков для обсчета в параллель. Максимально можно выровнять 5 батчей, то есть 1000 строк за раз.


Окно. При помощи размеров окна можно регулировать "нахлёст" батчей друг на друга, чтобы правильные варианты точно попадали в выравнивание.


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


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


Визуализация


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


Lingtrain app 1


Конфликты


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



Разрешение руками


В редакторе можно восстанавливать непопавшие в выравнивание строки.



Также можно объединять строки подкорпуса друг с другом. Важно делать это через элементы управления, а не копированием текста. Тогда система будет знать из каких исходных строк состоит элемент параллельного корпуса.



Автоматическое разрешение


Для разрешения конфликтов в автоматическом режиме нужно нажать на кнопку Resolve all. Этот процесс может занять некоторое время и по его окончании останутся либо неразрешимые (слишком широкие) конфликты и конфликты по краям корпуса, либо все пройдет гладко и мы получим готовый корпус.


Подстрочник


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


Lingtrain app 1


Чтобы добавить такой перевод, надо скачать корпус, либо открыть его в браузере. Это можно сделать в секции Subscript. При открытии в Chrome есть полезная функция по автоматическому переводу. Причем объем текста может быть довольно большим, что лично меня очень радует. Текст на несколько тысяч строк переводится за несколько секунд.


Переведенный текст надо сохранить в файл и загрузить обратно в той же секции.


Lingtrain app 1


Потерянные строки


В секции Unused strings можно убедиться, что никакие строки не потеряны. Такое может быть на концах текстов, так как при разрешении конфликтов мы опираемся на хорошие кусочки, а на краях текста их может не быть.


Делаем книгу


Удостоверившись, что корпус хорошего качества и никакие строки не потеряны, перейдем на вкладку Create.


Если вам нужен только параллельный корпус, то его можно скачать в нужном формате (tmx или txt) в секции Download и на этом закончить.


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


Lingtrain app 1


Для подсветки соответствий между предложениями нужно выбрать один из стилей pastel_fill или pastel_start. Сгенерируем начало книги и посмотрим на результат:


Lingtrain app 1


Скачаем всю книгу в секции Download, при наведении курсора на абзац с текстом мы увидим его порядковый номер. Книгу мы сделали, осталось добавить в нее обещанные иллюстрации.


За отображение иллюстраций отвечает метка %%%%%image. Добавить ее можно либо на первом этапе, либо сейчас, при создании книги. В секции Edit marks можно увидеть все метки, подредактировать и добавить новые. Картинки можно вставлять в виде URL по одной или же пачками. При добавлении метки нужно указать номер абзаца в котором она будет отображаться.


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


Добавляем картинки


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


Основные моменты


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


Примеры картинок


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


Мне нравятся сети, предобученные на картинах художников. Добавляя к ним имя того или иного автора можно получить изображение в его стиле. Заметьте, это не перенос стиля на фотографию, а создание нового изображения. При различных начальных условиях (параметр seed в блокнотах) будут сгенерированы разные картинки.


Картинка Подсказка
drawing Little house in the meadow with flowers by Claude Monet
drawing Little house in the meadow with flowers by Vasnetsov
drawing Little house in the meadow with flowers by Van Gogh
drawing Center of the Moscow city by Van Gogh
drawing Center of the Moscow city by Picasso
drawing Center of the Moscow city by Rembrandt

Также есть возможность подать в качестве подсказки не только текст, но и отправное изображение. Тогда можно получить перенос стиля на это изображение. Главное тут вовремя остановиться и не делать слишком много итераций.


Оригинал Картинка Подсказка
drawing drawing Oil painting + [photo of a cat]

При помощи подхода CLIP + Guided diffusion можно создавать фотореалистичные изображения несуществующих миров. Но тут потребуется изрядный cherry-pick (делаем много, выбираем лучшее), поэтому вот картинки от автора:


Картинка Подсказка
drawing a beautiful fantasy land forest, trending on ArtStation
drawing the transhuman condition by Rene Magritte
drawing a church in the style of cyberpunk noir

А еще среди появившихся идей есть генерирование картинок в стиле pixel art от пользователя dribnet и его доработанной версией, в которой можно задать картинке цветовую палитру. Этот подход пришелся мне по душе, поэтому его я и выбрал в качестве основного. Посмотрим на примеры:


Картинка Подсказка
drawing Game of thrones
drawing Master and Margarita by Bulgakov
drawing Three comrades by Remarque
drawing Roadside picnic

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


Попробуйте сами на досуге:


Название Ссылка на Colab Источник
VQGAN+CLIP_(z+quantize_method) Colab EleutherAI
Semantic_Style_Transfer_withCLIP+VQGAN(Gumbel_VQGAN) Colab EleutherAI
CLIP_Guided_Diffusion Colab EleutherAI
CLIP_Guided_Diffusion_HQ_512x512 Colab EleutherAI
CLIP_Decision_Transformer Colab EleutherAI
VQGAN+CLIP (with pooling) Colab эй ай ньюз
Text2PixelArt — Mishin Learning Resolution Mod Colab Мишин Лернинг
[Forked by Denis Sexy IT] Text2PixelArt Colab Denis Sexy IT
CLIPIT PixelDraw by dribnet + palette enforcement by altsoph Colab altsoph

Upd. Ещё одна отличная подборка.


Upd. Илюстрации к Дюне:


Шаи-Хулуд (Shai-Hulud):


image



Пол Атрейдес верхом на черве:




Пол и фримены с голубыми глазами:





Делаем иллюстрации


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



Если у вас текст на английском языке, то качаем его разбитую по абзацам версию из секции Download нашего приложения. Далее выбираем количество пар иллюстраций (на основе каждой текстовой подсказки мы сделаем по две картинки). Простенький NLP подход надергает нам подсказок в переменную prompts_list вместе с номерами соответствующих абзацев. Получится примерно так:


prompts_list = [('Hyperion by Dan Simmons #pixelart', 2)
('Silenus seemed ninety fifties #pixelart', 115)
('You said warship #pixelart', 230)
('poet said two sign #pixelart', 345)
('I felt sort #pixelart', 460)
('It rains afternoon #pixelart', 575)]

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


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


Все сохраненные картинки автоматически выгружаются на хостинг изображений. Первый хостинг, который я нашел, — imgbb.com, — удобен тем, что можно получить токен и с ним выгружать картинки через API. В ноутбуке я оставил свой, поэтому, если он перестанет работать, зарегистрируйте себе бесплатный аккаунт и используйте его. Либо загрузите картинки ручками в любое другое облако, например, habrastorage. Картинки можно найти в папке content.



После загрузки появится примерно такой текст:


https://i.ibb.co/82PrGmh/40d7ba3dcf1e.png, 2, Watchbird by Robert Sheckley #pixelart
https://i.ibb.co/n8qvXWB/3723ee7a9931.png, 2, Watchbird by Robert Sheckley #pixelart
https://i.ibb.co/L6WFzf4/fc52d007abf4.png, 48, scientists know one machine #pixelart
https://i.ibb.co/6HshZ7C/faeca08b4bbe.png, 48, scientists know one machine #pixelart
https://i.ibb.co/NC5TfHK/195b90eb5e29.png, 96, Macintyre grinned lot #pixelart
https://i.ibb.co/6mxFmTj/d547cec128fa.png, 96, Macintyre grinned lot #pixelart
https://i.ibb.co/HzdSq0X/96e540de5cc0.png, 144, hint came morning #pixelart
https://i.ibb.co/NNSv81j/bbfad7acc786.png, 144, hint came morning #pixelart
https://i.ibb.co/9cyVLKp/dc69e4737aef.png, 192, He put telephone #pixelart
https://i.ibb.co/kmpysR7/32e6028b7bfd.png, 192, He put telephone #pixelart

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


Полученный текст мы вставляем в секции Edit marks и жмем Save.



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



Итог


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


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


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


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


Ссылки


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


  1. Meklon
    03.09.2021 10:32
    +2

    Пиксель-арт прекрасен


    1. averkij Автор
      03.09.2021 11:12
      +1

      Не могу наиграться. Вот «the door into summer»:

      image

      image


      1. Meklon
        03.09.2021 12:58
        +1

        Кажется, я знаю, как буду иллюстрировать корпоративную Wiki


        1. averkij Автор
          03.09.2021 13:09
          +1

          Если будете сегодня это делать, то вот:

          image

          image

          image


      1. Meklon
        03.09.2021 13:15


        1. averkij Автор
          03.09.2021 13:22

          Colab не всегда дает годную видеокарту, надо перезапустить сеанс и посмотреть какая видеокарта подключилась в ячейке **!nvidia-smi**. Надо, чтобы была хотя бы T4, возможно и P4 хватит, но точно не K80.


          1. Meklon
            03.09.2021 13:33

            Опять та же фигня. Не вижу где посмотреть видеокарту


            1. averkij Автор
              03.09.2021 13:42

              Надо запустить верхнюю ячейку (на картинке — Tesla T4).

              image

              Гугл в зависимости от загруженности может разные карты подсовывать. Можно еще оформить Colab Pro подписку, тогда будет карты помощнее давать.


              1. Meklon
                03.09.2021 13:45

                Мы точно про один и тот же блокнот?

                https://colab.research.google.com/drive/1MDin_3_XE21f7XcnFw_alc1YZIuKkD15#scrollTo=qQOvOhnKQ-Tu


                1. averkij Автор
                  03.09.2021 14:12

                  Я про свой:

                  https://colab.research.google.com/drive/1B6FLBZmHCSZmCI-kmQRzPqy0PeicO0PG

                  Добавьте в вашем блокноте ячейку и выполните в ней !nvidia-smi, покажет текущую видеокарту.


                  1. Meklon
                    03.09.2021 15:18

                    Отдает всегда Tesla K80


                    1. averkij Автор
                      03.09.2021 15:28

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

                      image

                      Если все время k80 дает, то надо подождать, значит нет свободных. Вообще должен в итоге хотя бы P4 выдать.
                      Либо же раскошелиться на подписку.


                      1. Meklon
                        03.09.2021 16:29

                        Видимо нет. Я раз 20 пересоздавал машину.


                      1. Meklon
                        03.09.2021 16:38

                        Сейчас доступ к Colab Pro есть только в Бразилии, Великобритании, Германии, Индии, Канаде, США, Таиланде, Франции и Японии.

                        А локально не вариант то же самое запустить? У меня RTX 2060 Super


                      1. Alexey2005
                        03.09.2021 18:21

                        Да, это возможно, карточка тянет и 6Гб VRAM достаточно для запуска (при условии, что на вашем PC есть минимум 8Гб оперативки и минимум 11 свободных Гб на диске).
                        Проблема в том, что синтез пиксель арта здесь основан на diffvg, который придётся собирать из исходников на локальной машине, что не вполне тривиально.
                        Если у вас что-то вроде Debian или Ubuntu с установленными драйверами NVIDIA, CUDA Toolkit 10.2, и Python 3.7+, то могу написать небольшой гайд, как запустить эту нейронку локально. А вот под винду так даже и не соображу, что и как настраивать.


                      1. averkij Автор
                        03.09.2021 18:31

                        Colab Pro в России тоже можно, можете указать Америку и zip код отсюда

                        stackoverflow.com/questions/60240863/i-am-from-pakistan-can-i-buy-google-colab-pro-for-experiments


                      1. Meklon
                        03.09.2021 18:22
                        +1

                        Так.
                        Oops: runtime error: CUDA out of memory. Tried to allocate 48.00 MiB (GPU 0; 7.43 GiB total capacity; 5.83 GiB already allocated; 32.81 MiB free; 5.95 GiB reserved in total by PyTorch) Try reducing --num-cuts to save memory

                        Сколько ему надо ресурсов? Никак зарезать нельзя?


                      1. Alexey2005
                        03.09.2021 18:36
                        +1

                        От 4Гб и до бесконечности — зависит от разрешения, выставленного качества, набора используемых моделей и аугментаций.
                        В Colab'е очень часто выделяют меньше VRAM, чем есть на GPU. Издержки облака…
                        Можете попробовать в ячейке "III. Generate images" нажать на «Show code» и там, где задаются параметры, скажем после строчки

                        clipit.add_settings(use_pixeldraw=use_pixeldraw)
                        добавить строку:
                        clipit.add_settings(num_cuts=9)
                        Это очень сильно уменьшит потребление памяти.


                      1. Meklon
                        03.09.2021 18:59

                        Отлично, спасибо. Жаль опять Tesla K80 теперь только выпадает. На ней этот код вообще почему-то не взлетает. Даже медленно.


                      1. averkij Автор
                        03.09.2021 19:26

                        Да, в неё модель не поместится

                        image


                      1. Alexey2005
                        03.09.2021 21:50
                        +1

                        Там проблема не в Tesla K80, а в том, что гугловцы положили в этот контейнер кривую сборку pytorch. Но можно сделать финт ушами и, если не получается выкрутить ничего кроме K80, заменить diffvg на vqgan — тогда будет работать даже в таких условиях, хотя такого замечательного пиксель арта и не выйдет (но поиграться можно, а результат всё же будет довольно неплох).
                        Для этого можно, к примеру, воспользоваться этим Colab'ом. Там после установки всего нужного и перезапуска runtime'а:
                        1. Устанавливаем scale в 1.
                        2. Снимаем галочку use_pixeldraw (теперь у нас вместо diffvg будет vqgan).
                        3. Показать код (Show code) в этой ячейке и там:

                        clipit.add_settings(prompts=prompts, aspect=aspect)
                        заменить на
                        clipit.add_settings(prompts=prompts)
                        (иначе модель не влезет в память). Кроме того, после этой строчки добавить:
                        clipit.add_settings(size=(256,256))
                        clipit.add_settings(num_cuts=9)
                        
                        Тем самым мы запрашиваем генерацию квадратного изображения 256x256 пикселей (размеры должны быть кратны 16, чтобы сеть переварила).
                        Всё, можно запускать, не забывая указывать в запросе тип рендеринга (скажем, #Unreal Engine или #pixelart):

                        Crystal cave #Unreal engine

                        Crystal cave #pixelart
                        Работать будет довольно медленно, хотя можно значительно ускорить ценой снижения вменяемости изображения, изменив в строке
                        clipit.add_settings(quality="better", scale=scale)
                        «better» на «draft».


                      1. Meklon
                        03.09.2021 22:07

                        Спасибо. Я уже думаю, что проще на своей RTX 2060S завести.


                      1. Meklon
                        03.09.2021 22:09

                        А из PyPi не получится более корректную версию PyTorch вытащить в процессе сетапа?


                      1. Alexey2005
                        03.09.2021 23:26

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


                      1. averkij Автор
                        03.09.2021 18:41

                        Можно --num-cuts параметр меньше указать. В блокноте раскройте ячейку с настройками и добавьте строку

                        clipit.add_settings(num_cuts=96)

                        image


                      1. Alexey2005
                        03.09.2021 18:43

                        96 в 7Гб VRAM вряд ли влезет. Я бы начинал с совсем низких значений, а поднять всегда можно успеть.


                      1. averkij Автор
                        03.09.2021 18:45

                        Согласен, тут надо поиграться.


          1. Meklon
            03.09.2021 13:41

            Добавил в код:

            import tensorflow as tf
            device_name = tf.test.gpu_device_name()
            print(device_name)

            Выдал:

            /device:GPU:0


            1. averkij Автор
              03.09.2021 15:30

              image


  1. EugeneH
    03.09.2021 11:10
    +2

    Большое спасибо за статью! И за ссылки на блокноты отдельно. Вроде бы только недавно синтез изображения по текстовой подсказке был чем-то недосягаемым. Теперь же все делается в 2 клика. Страшно представить, к чему это придет через 10 лет. Синтез фильма по краткому описанию сюжета?


    1. diogen4212
      03.09.2021 12:09
      +1

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


      1. averkij Автор
        03.09.2021 13:28

        В ожидании новой книжки можно немного порисовать

        image

        image


        1. Alexey2005
          03.09.2021 15:44
          +1

          или так:


    1. averkij Автор
      03.09.2021 13:29

      Рад, что понравилось! Можете тоже поиграть, получите массу удовольствия.


  1. LevOrdabesov
    03.09.2021 13:22

    Обалденно!


    1. averkij Автор
      03.09.2021 19:22
      +1

      Ага, вот остров в космосе и девушка с татуировкой дракона

      image

      image


  1. Alexey2005
    03.09.2021 16:05
    +1

    Тот же самый CLIP, соединённый с vqgan, позволяет генерировать довольно качественные полноразмерные обоины абстрактного содержания. Правда, степень понимания языка всё ещё оставляет желать лучшего, и как ни формулируй запрос, на выходе никогда не получается в точности то, что хочется.
    Вот например

    Lyra-shaped crystal cave #Unreal Engine


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


    1. averkij Автор
      03.09.2021 16:26

      Для улучшения качества можно добавлять различного рода подсказки, — fine details, high resolution, professional photo of, ultra settings, ray tracing.


    1. averkij Автор
      03.09.2021 18:43

      image


    1. averkij Автор
      03.09.2021 18:45

      А какие изображения лучше получаются, на какую тему?


      1. Alexey2005
        03.09.2021 18:54
        +1

        Лучше всего абстрактные вещи. Пещеры, горы, леса, парусник в море и т.д.
        В общем, разного рода фоновые вещи. Людей, особенно крупным планом, оно обрабатывает так себе (в pixelart-варианте это не слишком видно, но если делать FullHD, то ужас-ужас).
        И совсем паршиво обрабатываются мифические животные, например гарпии, грифоны, драконы или (особенно) русалки. Сгенерировать нормальный русалочий хвост в FullHD так и не удалось. Похоже, нужно тюнить модель или использовать её как feature extractor, набросив сверху два дополнительных слоя, чтобы генерировать мифических животных.


        1. averkij Автор
          03.09.2021 19:31

          А вы какие модели используте, которые в сети гуляют (натренированные на Imagenet'ах, WikiArt, Flickr и т.д.)? Я вот на этих пробовал:

          image

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


          1. Alexey2005
            03.09.2021 19:53
            +1

            Да, эти плюс vqgan_gumbel_f8, которая даёт достаточно интересные результаты.


            1. averkij Автор
              03.09.2021 19:58

              Вот в этом канале девушка очень крутые картинки генерирует

              https://twitter.com/RiversHaveWings

              image

              image


  1. vektory79
    04.09.2021 19:50

    Не силён в ноутбуках... Что-то у меня упорно не находит модуль pixeldrawer :(


    1. averkij Автор
      04.09.2021 20:17

      Какую ошибку выводит?


  1. Alexey2005
    04.09.2021 23:36

    Забавно выходит, если скармливать сетке разные абстрактные вещи. Например,

    Linux vs FreeBSD


    1. averkij Автор
      05.09.2021 13:09

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


  1. averkij Автор
    05.09.2021 13:17

    Двери в осень, зиму, весну и лето

    image
    image
    image
    image


    1. Alexey2005
      05.09.2021 14:49

      В моём случае дверь в осень получается всегда без людей и результат напоминает

      скрин из какой-то компьютерной игрушки времён DOS




      1. averkij Автор
        05.09.2021 17:11

        Круто, а поделитесь кодом для такой генерации?


        1. Alexey2005
          05.09.2021 18:25
          +1

          Вверху уже поделился инструкцией — нужно в этих Colab'ах отключить diffvg, вместо этого используя vqgan.
          Ну, и если запускать локально, то там намного больше возможностей и параметров для настройки. Я использовал такой вариант запуска:

          python generate.py -p "the door into autumn #pixelart" -i 600 -qua "normal" --num_cuts 15 --output "result/output" -s 416 224 -lr 0.1 --save_every 10 --pixelize_every 50 --out_unpix "unpix/output"


  1. averkij Автор
    10.09.2021 09:05

    Нашел еще одну подборку Colab'ов:

    github.com/tg-bomze/collection-of-notebooks


  1. averkij Автор
    21.09.2021 13:09

    Высоцкий в Москве

    image

    Вин Дизель в космосе

    image

    Джим Керри

    image


  1. Alexey2005
    29.09.2021 17:32
    +1

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

    Результаты








    1. averkij Автор
      30.09.2021 10:14

      Спасибо, классно выглядит. Надо поиграться.