Исследуйте и создавайте уникальные и оригинальные изображения на основе существующих наборов данных.
Ранее я рассматривал следующие статьи о тонкой настройке модели стабильной диффузии для создания персонализированных изображений:
- Как настроить стабильную диффузию с помощью текстовой инверсии
- Как настроить стабильную диффузию с помощью Dreambooth
- Как настроить стабильную диффузию с помощью LoRA
Вышеупомянутые модели с тонкой настройкой относятся к условной генерации изображений, которая принимает входные данные (текст, изображение и т. д.) для создания изображений.
В этом руководстве основное внимание уделяется безусловной генерации изображений. К вашему сведению, основной целью создания безусловного изображения является создание новых и уникальных изображений без каких-либо конкретных входных данных (текст, изображение и т. д.).
Безусловная генерация изображений служит различным целям и подходит для следующих случаев использования:
artistic expression
— исследуйте новые концепции и возможностиdata augmentation
— создавать синтетические наборы данных для задач компьютерного зрения, таких как классификация изображений и распознавание изображений.innovative design
— создавать инновационный дизайн для продуктов и произведений искусства
Перейдите к следующему разделу для настройки и установки.
Настраивать
Настоятельно рекомендуется создать новую виртуальную среду.
Пакеты Python
Активируйте его и выполните следующую команду, чтобы установить модуль diffusers
:
pip install diffusers
Чтобы установить последнюю разрабатываемую версию diffusers
, выполните следующие действия:
pip install git+https://github.com/huggingface/diffusers
Затем выполните следующую команду, чтобы установить остальные зависимости:
pip install accelerate torchvision datasets tensorboard
Ускорить
Перед этим давайте запустим следующую команду для настройки accelerate
.
accelerate config
В зависимости от вашей настройки вы можете использовать следующую конфигурацию для обучения на одном графическом процессоре:
---------------------------------------------------------------------------------------------------------------------------- In which compute environment are you running? This machine ---------------------------------------------------------------------------------------------------------------------------- Which type of machine are you using? No distributed training Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]: no Do you wish to optimize your script with torch dynamo?[yes/NO]: no Do you want to use DeepSpeed? [yes/NO]: no What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]: all ---------------------------------------------------------------------------------------------------------------------------- Do you wish to use FP16 or BF16 (mixed precision)? no accelerate configuration saved at /home/wfng/.cache/huggingface/accelerate/default_config.yaml
Официальный репозиторий рекомендует обучение без смешанной точности как со смешанной точностью. Тем не менее, вы все еще можете тренироваться со смешанной точностью. Если вы столкнулись с ошибкой при обучении со смешанной точностью, проверьте сценарий обучения и убедитесь, что он не копируется при создании образцов изображений для визуального контроля. Измените следующую строку кода
unet = copy.deepcopy(accelerator.unwrap_model(model))
to
unet = accelerator.unwrap_model(model)
Приведенная выше конфигурация была протестирована на одной GeForce RTX 2080 ti с 12 ГБ памяти. Он способен обучать безусловную модель генерации изображений с размером пакета 2 и разрешением 256. Обратите внимание, что сценарий обучения столкнется с ошибкой нехватки памяти при обучении с разрешением 512 на графическом процессоре 12 ГБ.
Наборы данных
Существует два способа подготовки обучающих наборов данных:
- загружать или использовать большинство наборов данных изображений, доступных на HuggingFace Hub
- подготовить тренировочные изображения в папке
Наборы данных на HuggingFace Hub
Задайте для аргумента dataset_name
уникальное имя набора данных, доступное в HuggingFace Hub. Он автоматически загрузит файлы в папку .cache
при первом запуске. Впоследствии обучающий сценарий будет повторно использовать кешированную версию наборов данных.
Взгляните на следующий пример, в котором используются наборы данных huggan/pokemon
из HuggingFace Hub.
accelerate launch train_unconditional.py \ --dataset_name="huggan/pokemon" \ ...
Приведенные выше наборы данных взяты из Kaggle, который поставляется с лицензией Attribution 4.0 International (CC BY 4.0).
Пользовательские изображения в папке
Для загрузки локальных наборов данных поместите все обучающие изображения в папку. Взгляните на следующую структуру папок в качестве справки:
data/xxx.png data/xxy.png data/train/xxz.png data/eval/yyz.png
Рекомендуется иметь около 1000 обучающих изображений в качестве основы. Однако он должен работать как есть независимо от количества обучающих наборов данных, если наборы данных имеют высокое качество.
Сценарий обучения рекурсивно идентифицирует все изображения в папке. Просто установите аргумент train_data_dir
в соответствующую папку. Например:
accelerate launch train_unconditional.py \ --train_data_dir="data" \ ...
Обучение
Получите доступ к официальному учебному сценарию train_unconditional.py
и сохраните его локально в рабочем каталоге. Сам скрипт обучения основан на последней версии разработки.
Скрипт сообщит об ошибке, если текущая версия diffusers
не соответствует ожидаемой версии. Найдите функцию check_min_version
и закомментируйте ее (применимо, только если вы используете более старую версию diffusers
):
... # check_min_version("0.13.0.dev0")
Наборы данных на HuggingFace Hub
Для обучения наборам данных, доступным в HuggingFace Hub, просто выполните следующую команду, чтобы начать обучение:
accelerate launch train_unconditional.py \ --dataset_name="huggan/pokemon" \ --resolution=256 --center_crop --random_flip \ --output_dir="output-256" \ --train_batch_size=2 \ --num_epochs=100 \ --gradient_accumulation_steps=1 \ --use_ema \ --learning_rate=1e-4 \ --lr_warmup_steps=500 \ --mixed_precision=no
Замените
dataset_name
на нужные наборы данных, доступные на HuggingFace Hub.
resolution
— разрешение для входных изображений, все изображения в наборах данных для обучения/проверки будут изменены до этого. Более высокое разрешение требует большей памяти во время обучения. Например, установите значение 256, чтобы обучить модель, которая генерирует изображения 256 x 256.train_batch_size
— Размер пакета (на устройство) для загрузчика обучающих данных. Уменьшите размер пакета, чтобы предотвратить ошибку нехватки памяти во время обучения.num_epochs
— Количество эпох обучения. По умолчанию 100. Вы должны получить разумный результат около 50 эпох для 10 000 обучающих изображений.checkpointing_steps
— Сохранять контрольную точку состояния обучения каждые X обновлений. Эти контрольные точки подходят только для возобновления. По умолчанию 500. Установите более высокое значение, чтобы уменьшить количество сохраняемых контрольных точек.
Пользовательские изображения в папке
Обязательно подготовьте все тренировочные изображения в папке. Например, предположим, что текущая структура рабочего каталога выглядит следующим образом:
|- data (folder) | |- xxx.png | |- xxy.png | |- ... |- train_unconditional.py
Папка
data
содержит все соответствующие обучающие изображения для этого урока.
Выполните следующую команду, чтобы начать обучение безусловной модели генерации изображений с использованием пользовательских наборов данных:
accelerate launch train_unconditional.py \ --train_data_dir="data" \ --resolution=256 --center_crop --random_flip \ --output_dir="output-256" \ --train_batch_size=2 \ --num_epochs=100 \ --gradient_accumulation_steps=1 \ --use_ema \ --learning_rate=1e-4 \ --lr_warmup_steps=500 \ --mixed_precision=no
В зависимости от общего количества обучающих изображений завершение обучения может занять некоторое время.
Игнорировать горизонтальное отражение (больше не применимо, начиная с версии 0.13.0)
Обратите внимание, что старый обучающий скрипт будет выполнять случайное горизонтальное отражение во время этапа предварительной обработки изображения. Следовательно, выходные изображения в конечном итоге будут обращены в разные стороны, даже если наборы обучающих данных состоят только из символов, обращенных в фиксированном направлении.
Поскольку старый сценарий обучения не имеет аргумента для динамической установки случайного переворота, просто удалите вызов функции RandomHorizontalFlip()
из следующих строк кода, чтобы предотвратить случайный переворот по горизонтали во время предварительной обработки изображения:
augmentations = Compose( [ Resize(args.resolution, interpolation=InterpolationMode.BILINEAR), CenterCrop(args.resolution), RandomHorizontalFlip(), ToTensor(), Normalize([0.5], [0.5]), ] )
Окончательный код должен быть следующим:
augmentations = Compose( [ Resize(args.resolution, interpolation=InterpolationMode.BILINEAR), CenterCrop(args.resolution), ToTensor(), Normalize([0.5], [0.5]), ] )
Обратите внимание, что обучение без горизонтального флипа может повлиять на производительность модели.
Я создал pull request, который был объединен с diffusers
начиная с версии 0.13.0.dev0. Двигаясь вперед, случайная обрезка и горизонтальное отражение по умолчанию отключены, и их необходимо явно включить следующим образом:
accelerate launch train_unconditional.py \ --center_crop --random_flip \ ...
Сохранять модель в каждую N эпоху
По умолчанию скрипт будет сохранять модель каждые 10 эпох. Используйте аргумент save_model_epochs
, чтобы изменить значение по умолчанию.
accelerate launch train_unconditional.py \ ... --save_model_epochs=5 \ ...
Он перезапишет файлы по адресу output_dir
. Для тех, кто хочет сохранить все сохраненные модели, просто измените следующую строку кода:
pipeline.save_pretrained(args.output_dir)
to:
pipeline.save_pretrained(os.path.join(args.output_dir, f"epoch-{epoch}"))
Обратитесь к следующей фиксации для получения дополнительной информации об исправлении.
Таким образом, скрипт сохранит модели в отдельных папках в папке output_dir
.
Например:
|- data (folder) | |- xxx.png | |- xxy.png | |- ... |- output-256 | |- epoch-10 | | |- scheduler | | |- unet | | |- model_index.json | |- epoch-20 | |- ... | |- epoch-50 |- train_unconditional.py
Вывод
В том же рабочем каталоге создайте новый файл Python с именем inference.py
и добавьте в него следующий код:
from diffusers import DDIMPipeline, DDIMScheduler device = "cuda" # load model and scheduler pipeline = DDIMPipeline.from_pretrained('./output-256/epoch-10', local_files_only=True) pipeline.scheduler = DDIMScheduler.from_config(pipeline.scheduler.config) pipeline.to(device) # generate image image = pipeline(num_inference_steps=50).images[0] # save image image.save("image.png")
Приведенный выше сценарий основан на конвейере DDIM, а не на DDPM, поскольку процесс создания образа намного быстрее.
Выполните следующую команду для безусловной генерации изображений:
python inference.py
Он будет генерировать одно изображение при каждом запуске. Просто установите параметр batch_size
для генерации N изображений за прогон.
Обратите внимание, что потребление памяти будет увеличиваться по мере увеличения
batch_size
. Для вывода сbatch_size
1 требуется около 4 ГБ памяти, а для вывода сbatch_size
4 требуется около 10 ГБ памяти.
Например, следующий код будет генерировать 4 изображения за одно прогон:
... # generate images images = pipeline(num_inference_steps=50, batch_size=4).images # save images count = 0 for image in images: count += 1 image.save(f"image-{count}.png")
Вот некоторые примеры результатов моего местного обучения:
Обратите внимание, что некоторые из сгенерированных выходных данных имеют серьезные недостатки. Безусловная генерация изображений часто дает неожиданный результат, что может быть плюсом для творчества.
В зависимости от обучающих изображений некоторые наборы данных могут не сойтись должным образом даже после обучения в течение 100 эпох.
Заключение
Давайте вспомним некоторые моменты обучения для этой статьи.
Этот учебник начался с краткого введения в безусловное создание изображений и варианты его использования.
Затем он перешел к процессам установки и установки. Сюда входит установка пакета diffusers
с pip и настройка модуля accelerate
.
Впоследствии он рассказал, как подготовить наборы данных либо с помощью наборов данных, доступных в HuggingFace Hub, либо с помощью пользовательских наборов данных в папке.
Затем он подробно объяснил весь процесс обучения, включая некоторые полезные аргументы обучения.
Наконец, он исследовал, как выполнить вывод, используя специально обученную модель для безусловного создания изображений.
Спасибо за чтение этого произведения. Не стесняйтесь проверить мои другие статьи. Желаю отличного дня!