Исследуйте и создавайте уникальные и оригинальные изображения на основе существующих наборов данных.

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

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

В этом руководстве основное внимание уделяется безусловной генерации изображений. К вашему сведению, основной целью создания безусловного изображения является создание новых и уникальных изображений без каких-либо конкретных входных данных (текст, изображение и т. д.).

Безусловная генерация изображений служит различным целям и подходит для следующих случаев использования:

  • 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, либо с помощью пользовательских наборов данных в папке.

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

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

Спасибо за чтение этого произведения. Не стесняйтесь проверить мои другие статьи. Желаю отличного дня!

Рекомендации

  1. Github — безусловное создание изображений диффузоров
  2. Гитхаб — Ускоряй
  3. Гитхаб — DeepSpeed
  4. Блог HuggingFace — безусловное создание изображений