Pull to refresh
13
0
Никита @InfluxOW

Backend Developer | AI Artist

Send message

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

До:

- base
- big_pr -> base

После:

- small_pr_1 -> base
- small_pr_2 -> small_pr_1
- small_pr_3 -> small_pr_2

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

Увидел комментарии про "лишние пробелы" в скриншоте из примера правильного ревью и немножко подгорел. И плохой, и хороший примеры там - это часть плохого явления. Имхо, ничего lint-related в код-ревью быть вообще не должно.

В моей первой компании, куда я устроился работать джуном, большая часть ревью у отдельных ревьюеров уходила на "тут лишняя запятая", "тут фигурная скобка не на той строке" и так далее. Ты джун, и так много всего нового и комплексного. Ты с этим разбираешься, но вместо полезного технического фидбэка получаешь ответы от линтера, просто в данном случае им выступает человек, а не софт. В этом ноль пользы и смысла для обеих сторон этого ревью. Часы, потраченные на выявление этих несоответствий и написание этих бессмысленных комментариев, лучше было заложить в настройку линтера и включение его в CI/CD и хуки гита.

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

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

Штука клёвая, немного пощупал и в целом остался доволен результатом, хотя есть и нюансы.

Установка вполне понятная, как мне кажется. Всё расписано по шагам, я с первого раза установил.

Но я так до конца и не вкурил, какие значения параметров нужно ставить. У меня 4080, но Thread Count пришлось в 2 раза уменьшить, чтоб всё работало. Хотя бегало всё равно довольно шустро и гораздо быстрее, чем я ожидал.

если у вас карта по слабее, просто понизьте все настройки в два раза и повышайте понемногу, пока не начнут появляется ошибки Out of memory

Месяца полтора-два назад вышли драйвера, где добавили возможность использования RAM в качестве VRAM. В общем, если ты выходишь за пределы своей VRAM, то у тебя может не вылезти ошибка, а просто процесс очень сильно замедлится. Пока я тестировал, у меня так и было. А возможности прервать процесс, кроме как закрыв терминал, нет :) Неудобно.

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

И ещё у меня почему-то вообще никак не обрабатывались gif файлы. А из mp4 многие просто не хотели сохраняться, несмотря на то, что в превью лицо заменялось. Короче, где-то с 40% файлов какие-то неоднозначные проблемы возникали.

Короче, инструмент клёвый, но как будто ещё немного сырой.

На вашем примере что-то с глазами не так, с тенями вокруг них, украшения и прочие микродетали изменились из-за применения кодформера на всё изображение

Вот именно, что это микродетали, лично в моём случае они не сильно сказались на общем восприятии изображения ¯_(ツ)_/¯

схожесть, как по мне, хорошая

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

Ваша лора слишком изменила референсное изображение

Я в другом комменте привёл примеры, где был отлично сохранён референс, имхо.

Прическу прописать в запросе так вообще не проблема

А форму лица как в запросе прописать? Без этого сходство будет неполноценным.

проще использовать замену лица

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

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

А если ставить целью изменить внешность человека на уже существующем изображении, то и идти к этой цели нужно иными путями. И то я уже привёл беглые примеры того, как с использованием ControlNet этого можно достигнуть.

Не совсем понимаю, что ты имеешь в виду под разными вариациями identity.

В случае обучения модели GUI нужен только для удобного управления параметрами, а при старте обучения под капотом запускается скрипт accelerate launch --num_cpu_threads_per_process=2 "./train_network.py" --enable_bucket --min_bucket_reso=256 --max_bucket_reso=2048 <...>, так что в целом ничего не мешает запускать его вручную или из другого скрипта.

В случае генерации изображений у AUTOMATIC 1111 есть API, если запускать его с флагом --api. Так что его в целом тоже можно дёргать из каких-то внешних скриптов.

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

Да, ты прав, лора сильно влияет на всю сцену целиком и ограничить область её влияния сложно. Но всё же сделать нужного персонажа мы можем, правда с некоторыми ограничениями. Например, если у нас уже есть изображение с нужным персонажем, то кидаем его в ControlNet, там включаем Canny, к нему добавляем Tile по желанию. В зависимости от весов обоих моделей получится что-то подобное тому, что ниже (я взял базу из картинок выше). По-моему, вполне аутентично: соответствует как изначальной картинке, так и внешности персонажа.

Вот сделайте вашу даму с лицом, но в таком фентезийном облачении, как на последнем кадре.

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

В общем, сложно добавить лору к уже имеющемуся изображению и не похерить его. С ControlNet сделать это всё ещё не сильно просто, но уже возможно.

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

В общем, да, погуглил и нашёл. Реактор - это форк roop.

Микросравнение.

База
База
База с лорой
База с лорой
Фото для переноса лица
Фото для переноса лица
База с roop
База с roop
База с reactor
База с reactor

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

Например, вся графика уже точно отсекается. Выглядит, как какой-то прикол. Форма лица, волосы и все прочие особенности внешности никак не учитываются. В общем, если у вас там какое-то коллективное фото, где на расстоянии в 5 метров от объектива стоят 20 человек и тебе нужно заменить лицо одного из них, то roop справится. А если ты хочешь именно создавать какой-то более-менее уникальный контент с персонажем желаемой внешности, то тут только лоры.

Всё-таки нашёл - https://github.com/Gourieff/sd-webui-reactor, это именно версия для AUTOMATIC 1111.

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

В идеале карточка минимум 20-ой серии от Nvidia, поддержка AMD есть не везде и не очень хорошая. У меня на 1080 Ti на одну модель уходило порядка 7 часов, но там ещё можно было оптимизировать часов до 4-5, я думаю. Потом перешёл на 4080, сейчас обучение модели, как в гайде, занимает 15-30 минут. Если смотрим именно на память, то, задавшись целью, можно обучить и на 6 Gb, но лучше иметь не меньше 8 Gb. Местами в гайде я приводил сравнения того, как тот или иной параметр влияет на рост потребления памяти, так что можно посмотреть.

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

ReActor, если нужно просто лицо девушки на генерацию воткнуть.

Можно ссылочку? А то гугл ничего не находит. Это что-то типа roop? Если да, то лора на порядок лучше результаты выдаёт, имхо.

Лора мощный инструмент, когда нужно сделать то, что не понимает модель

Я лично лору использую, например, когда надо сделать какие то детали

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

Автор написал что "лора встраивается межу слоями", но это не совсем так.

Это была больше попытка втиснуть краткое техническое объяснение.

Скорее всего этот чекпоинт уже "знал" этот концепт, поэтому дообучить его было проще, чем обучить с нуля. Интересно было бы посмотреть на график loss в обоих случаях.

Это график loss с применением регуляризационных изображений
Это график loss с применением регуляризационных изображений
Это график loss из сравнения чекпойнтов
Это график loss из сравнения чекпойнтов

Тут loss вообще ни о чём не говорит, так что я на него и не смотрел, делая выводы. Просто было странно, что тот же Dreamshaper показал результаты хуже. Возможно, есть ещё какие-то подобные чекпойнты, которые хорошие результаты покажут, а я лишь наткнулся на один из них. Но наткнулся вполне удачно :) Потому что я раньше всегда просто на Realistic Vision 2.0 обучал и без применения регуляризации, такая модель почти все чекпойнты сразу покрывала. А если регуляризацию к такой модели подключить, то уже не на всех графических чекпойнтах красиво получается, так что тут тот второй чекпойнт очень к месту пришёлся.

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

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

С CLIP Skip при обучении интересная вещь.

У меня с Clip Skip тоже были противоречивые ситуации. В сравнениях, которые проводил в рамках гайда, существенной разницы не было, но на практике с Clip Skip 1 часто получалось хуже. Видимо, нужно было в том сравнении большую выборку чекпойнтов сделать, а не 2, как во всех остальных. Но я просто припёкся уже к некоторым настройкам, грубо говоря, так что страшно менять. С Clip Skip 2 много хороших результатов и в реализме, и в графике было, так что попытался обосновать этот выбор :)

Пытался, но так и не смог продвинуть эту услугу среди населения :) Если интересно, то TG в профиле есть, можем обсудить.

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

Information

Rating
Does not participate
Location
Владивосток, Приморский край, Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Web Developer
Middle
PHP
Laravel
OOP
SQL
Docker
Git
Linux
Golang
RabbitMQ
ELK Stack