744. Пластмассовый мир победил (вторая часть)

Когда первые восторги от сгенерированных картинок прошли, я заметил, что лица у нейросетевых девушек выглядят одинаково. Такое ощущение, что в основе модели лежит одно и то же лицо. Красивое, милое, но скучное и стандартное. В медиапространстве таких миллионы. Это не проблема установленной у меня модели, а общая закономерность нашего мира. Ботокс, филеры, пластическая хирургия и желание выглядеть превосходно убивают индивидуальность и сводят все лица к единому стандарту: стерильному, симметричному и мёртвому. Нейросети просто подхватили эту тенденцию и довели до абсурдного совершенства. Но я хотел видеть человека. Настоящего. Живого. Не идеального.

Различные промты не помогали, но я смог найти решение. Модель можно дообучить своими данными! Точнее сделать небольшой довесок. Называется это решение LoRA – Low-Rank Adaptation. LoRA учит базовую модель конкретным особенностям — например, новому стилю рисования, узнаваемому объекту или, в моем случае, конкретному лицу с его уникальными чертами.

Вместо того чтобы изменять огромную матрицу весов модели, LoRA добавляет к ней маленькие матрицы, перемножение которых дает нужные изменения. Веса основной модели остаются неизменными. При работе нейросети результат основной модели просто складывается с результатом этих маленьких матриц. Это позволяет дообучать модель довольно быстро и готовый файл занимает относительно мало места, примерно 50-500 Мб.

К сожалению обучение на CPU будет слишком медленным. Придётся воспользоваться облачными вычислениями. Вариантов много, но я выбрал Google Colab. Выбрал просто потому что это первое, что мне попалось и я смог без особого напряжения с ним разобраться. Есть специализированные сервисы, но обилие мигающего аниме и полное отсутствие понимания куда тут нажимать вынудили меня отказаться от их использования.

Louise Brooks. Фотографии из датасета (источник Wikimedia)

Следующий шаг – подготовка датасета. Это набор изображений (для персонажа 20-30 штук) и их описаний специальными тэгами. Первый тэг всегда “кодовое” имя персонажа – слово, которое в промте будет его призывать. Оно должно быть необычным, чтобы не совпасть со словами значения которых нейросеть уже знает. Тэги можно указать вручную или воспользоваться специальным решением, но я забегаю вперед. Сперва нужно выбрать персонажа.

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

Моей героиней стала Louise Brooks. Я вбил её имя в поисковую строку и окунулся в мир корпоративной жадности: всем известные лицемерно-либеральные соцсети, Pinterest и прочие негодяи цифрового мира охотно втягивают пользовательский контент, но очень неохотно его отдают. Методы забрать есть, но мне хотелось собрать датасет быстро. На помощь пришла Wikimedia. Там эти же изображения были доступны без каких либо сложностей, бесплатно и в высоком качестве.

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

Самым логичным для меня шагом казалось использовать для описания другую нейросеть. Нормальные люди воспользовались бы готовым продуктом таким как WD14 или BLIP. Но я про них ничего не знал (и сейчас знаю только названия). Выбор пал на llama cpp и китайскую модель MiniCPM, про которую пишут в интернете, что она лучше всего подходит под мою задачу.

Собрав из исходников llama cpp и запустив lama-cli я легко получил описание одной картинки. Но надо было всех, а вводить команду и копировать вывод из консоли не хотелось. Хотя если бы я знал сколько времени потрачу, то выбрал бы ручной вариант.

В комплекте с llama-cli шел llama-server предоставляющий API. Я начал его тестировать, но вместо тэгов получил прекрасное: текст про то, что мой чисто утилтитарный инструмент “студентка из Китая учащаяся в восьмом классе (интересные у них там институты) и любящая аниме”. Аниме я тоже люблю, как и студенток (восьмой класс правда смущает), но мне нужны тэги. Заставить “восьмиклассницу” работать над разметкой данных мне так и не удалось.

Ища причину своей неудачи, я нашёл библиотеку llana-cpp-python. С ней моя “студентка” превратилась в хорошего, но ленивого работника. Вместо нужных 12-15 тэгов я получал семь или восемь. А иногда всего пять. Меняя параметры, температуру и промт я с трудом научился получать нужное мне количество тэгов, но так устал, что даже не стал проверять их, доверившись нейросети.

Последним шагом стала загрузка размеченного датасета на Google Drive и запуск готового блокнота в Colab. Мне хотелось побыстрее обучить модель, поэтому я оставил все значения такими как рекомендовал автор блокнота. Этот этап был психологически самым сложным. Здесь я не владел процессом и меня это беспокоило. Однако всё прошло гладко и я получил свою LoRA.

743. Пластмассовый мир победил (первая часть)

Зима грустное время года. От скуки и серости я решился на вторую попытку исследования генеративных нейросетей. Впервые я экспериментировал с ними в 2022 году и за прошедшее с тех пор время они совершили большой скачок вперёд.

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

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

Читать далее

740. Сайтокрушение

Произошедшее глазами нейросети

В ночь с 20 на 21 января мой сайт перестал быть доступен. Я создал тикет и пошёл спать с надеждой, что утром всё образуется. Но утром сайт был по прежнему недоступен. По моему опыту адекватные хостеры чинили свои сервера максимум за пару дней и при этом писали что произошло и сильно извинялись. Я подумал, что ситуация серьёзная и сайт вот-вот починят. Тем более на тикет ответили, что есть большая проблема с доступностью. площадки и её уже решают.

Прошёл ещё один день… Сайт по прежнему недоступен. Хостер не обновляет статус. Ситуация становится ненормальной. Я проверяю бэкапы и понимаю, что самый новый за ноябрь прошлого года. Терять данные за два месяца не хочется, и я всё ещё надеюсь, что хостер починит сервер.

Сегодня, 26 января, после пяти дней даунтайма, мои нервы не выдержали и я переехал на другой хостинг. Данные, которых не было в бэкапе кое-как удалось восстановить. Печальные выводы: делайте и верифицируйте бэкапы, храните их в надёжном месте (лучше не одном) и всегда имейте план Б. Ну и не пользуйтесь плохими хостерами, такими как Aeza.