Этот репозиторий предоставляет код для точной настройки стабильной диффузии в керах. Он адаптирован из этого сценария, обнимая лицо. Предварительно обученная модель, используемая для точной настройки, поступает из Kerascv. Чтобы узнать об оригинальной модели, ознакомьтесь с этой документацией.
Код, предоставленный в этом репозитории, предназначен только для исследовательских целей . Пожалуйста, ознакомьтесь с этим разделом, чтобы узнать больше о возможных вариантах использования и ограничениях.
Загрузив эту модель, вы принимаете лицензию Creativeml Open Rail-M по адресу https://raw.githubusercontent.com/compvis/stable-diffusion/main/license.
Если вы просто ищете сопровождающие ресурсы этого хранилища, вот ссылки:
Оглавление :
Этот репозиторий имеет сестринский репозиторий (керас-SD), который охватывает различные модели развертывания для стабильной диффузии.
Обновление 13 января 2023 года . Этот проект получил 2-е место на первом в истории конкурса призовых призов Keras, организованном Google.
Следуя исходному сценарию от обнимающего лица, этот репозиторий также использует набор данных Pokemon. Но это было регенерировано, чтобы лучше работать с tf.data . Регенерированная версия набора данных размещена здесь. Проверьте эту ссылку для получения более подробной информации.
Код с тонкой настройкой представлен в finetune.py . Перед прохождением обучения убедитесь, что у вас установлены зависимости ( requirements.txt .
Вы можете начать обучение с аргументами по умолчанию, используя python finetune.py . Запустите python finetune.py -h чтобы узнать о поддерживаемых аргументах командной строки. Вы можете провести тренировку смешанного назначения, пропустив флаг --mp .
Когда вы запускаете обучение, контрольная точка диффузионной модели будет сгенерирована в эпохи, только если текущая потеря ниже, чем в предыдущей.
Чтобы избежать OOM и более быстрого обучения, рекомендуется использовать графический процессор V100. Мы использовали A100.
Некоторые важные детали следует отметить :
Детали обучения :
Мы точно настроили модель по двум разным решениям: 256x256 и 512x512. Мы варьировали только размер партии и количество эпох для точной настройки с этими двумя разными решениями. Поскольку мы не использовали накопление градиента, мы используем этот фрагмент кода для получения количества эпох.
python finetune.py --batch_size 4 --num_epochs 577python finetune.py --img_height 512 --img_width 512 --batch_size 1 --num_epochs 72 --mpДля разрешения 256x256 мы намеренно сократили количество эпох, чтобы сэкономить время на вычислении.
Тонкие веса :
Вы можете найти здесь тонкие веса диффузионной модели.
Набор данных Pokemon по умолчанию, используемый в этом репозитории, поставляется со следующей структурой:
pokemon_dataset/
data.csv
image_24.png
image_3.png
image_550.png
image_700.png
... data.csv выглядит так:
Пока ваш пользовательский набор данных следует за этой структурой, вам не нужно ничего менять в текущей кодовой базе, за исключением dataset_archive .
В случае, если ваш набор данных имеет несколько подписей на изображение, вы можете случайным образом выбрать один из пула подписей на изображение во время обучения.
На основе набора данных вам, возможно, придется настроить гиперпараметры.
import keras_cv
import matplotlib . pyplot as plt
from tensorflow import keras
IMG_HEIGHT = IMG_WIDTH = 512
def plot_images ( images , title ):
plt . figure ( figsize = ( 20 , 20 ))
for i in range ( len ( images )):
ax = plt . subplot ( 1 , len ( images ), i + 1 )
plt . title ( title )
plt . imshow ( images [ i ])
plt . axis ( "off" )
# We just have to load the fine-tuned weights into the diffusion model.
weights_path = keras . utils . get_file (
origin = "https://huggingface.co/sayakpaul/kerascv_sd_pokemon_finetuned/resolve/main/ckpt_epochs_72_res_512_mp_True.h5"
)
pokemon_model = keras_cv . models . StableDiffusion (
img_height = IMG_HEIGHT , img_width = IMG_WIDTH
)
pokemon_model . diffusion_model . load_weights ( weights_path )
# Generate images.
generated_images = pokemon_model . text_to_image ( "Yoda" , batch_size = 3 )
plot_images ( generated_images , "Fine-tuned on the Pokemon dataset" ) Вы можете принести свой weights_path (должен быть совместим с diffusion_model ) и повторно использовать фрагмент кода.
Проверьте этот ноутбук Colab, чтобы играть с кодом вывода.
Первоначально мы точно настроили модель по разрешению 256x256. Вот некоторые результаты, а также сравнения с результатами исходной модели.
| Изображения | Подсказки |
|---|---|
| Йода | |
| Роботизированный кот с крыльями | |
| Привет, Китти |
Мы видим, что тонкая модель имеет больше стабильных выходов, чем оригинальная модель. Несмотря на то, что результаты могут быть эстетически улучшены намного больше, эффекты тонкой настройки видны. Кроме того, мы следовали за теми же гиперпараметрами от сценария обнимающего лица для разрешения 256x256 (кроме количества эпох и размера партии). С лучшими гиперпараметрами результаты, вероятно, улучшатся.
Для разрешения 512x512 мы наблюдаем нечто подобное. Таким образом, мы экспериментировали с параметром unconditional_guidance_scale и заметили, что когда он устанавливается на 40 (при при этом оставшиеся другие аргументы зафиксированы), результаты вышли лучше.
| Изображения | Подсказки |
|---|---|
| Йода | |
| Роботизированный кот с крыльями | |
| Привет, Китти |
Примечание . На момент написания этой статьи все еще находится тонкая настройка на 512x512. Но требуется много времени, чтобы завершить одну эпоху без наличия распределенного обучения и накопления градиента. Вышеуказанные результаты взяты из контрольной точки, полученной после 60 -й эпохи.
С аналогичным рецептом (но обученным для более высоких этапов оптимизации) Lambda Labs демонстрируют удивительные результаты.