Menu

Генератор синтетических изображений FLUX v1, запускаем в Colab

Альтернативная модель по отношению к Stable Diffusion (и SDXL) - это FLUX v.1.

FLUX тоже можно запустить в Google Colab и генерировать изображения бесплатно.

Сравнение FLUX и SDXL

Про Stable Diffusion, и особенно про Fooocus, я уже неоднократно писал.

Давайте сравним две модели.

SDXL и Flux v.1 — это две модели генерации изображений, которые имеют разные подходы и характеристики. SDXL от Stability AI является одной из самых мощных моделей на базе Stable Diffusion. Она предлагает высокое качество изображений и универсальность, что делает ее идеальной для художественных и фотореалистичных работ. SDXL использует архитектуру с большим количеством параметров, что позволяет ей лучше уточнять изображения на основе текстовых подсказок. SDXL Turbo, усовершенствованная версия SDXL, способна генерировать изображения в режиме реального времени, сокращая количество шагов с 50 до одного и достигая невероятной скорости генерации — всего 207 миллисекунд для изображения размером 512x512 пикселей на графическом процессоре A10013. Тут стоит подчеркнуть, что FLUX особенно хорош при фиксированном разрешении 1024x1024.

Flux v.1, разработанная Black Forest Labs, фокусируется на быстрой скорости генерации и улучшении качества изображений, особенно в обработке деталей людей и встраивании текста.

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

В целом, SDXL выделяется своей мощностью и универсальностью, в то время как Flux v.1 фокусируется на скорости (иногда, наоборот!) и эффективности в конкретных задачах, таких как встраивание текста и обработка деталей персонажей. SDXL Turbo, с ее возможностью генерации в реальном времени, делает ее особенно привлекательной для быстрого прототипирования и тестирования идей, хотя ее некоммерческая лицензия ограничивает ее применение.

Давайте посмотрим, что творит FLUX из коробки, если ему передать сложные запросы (увы, на простых запросах он пока буксует!).

Первый пример: генерируем изображения по запросу "Красивая волшебница в шляпе из льда, окруженная снегом и инеем, с горящими голубыми глазами".

Второй пример: генерируем изображения по запросу "Красивая волшебница в малиновой шляпе из огня, с горящими голубыми глазами, искры, боке".

Запуск в Colab

Оказывается, достаточно описать две ячейки в Colab.

Первая ячейка - это инициализация. Выполняется единожды.

%cd /content
!git clone -b totoro3 https://github.com/camenduru/ComfyUI /content/TotoroUI
%cd /content/TotoroUI

!pip install -q torchsde einops diffusers accelerate xformers==0.0.28.post2
!apt -y install -qq aria2

!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/flux1-dev-fp8.safetensors -d /content/TotoroUI/models/unet -o flux1-dev-fp8.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/ae.sft -d /content/TotoroUI/models/vae -o ae.sft
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors -d /content/TotoroUI/models/clip -o clip_l.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors -d /content/TotoroUI/models/clip -o t5xxl_fp8_e4m3fn.safetensors

import random
import torch
import numpy as np
from PIL import Image
import nodes
from nodes import NODE_CLASS_MAPPINGS
from totoro_extras import nodes_custom_sampler
from totoro import model_management

DualCLIPLoader = NODE_CLASS_MAPPINGS["DualCLIPLoader"]()
UNETLoader = NODE_CLASS_MAPPINGS["UNETLoader"]()
RandomNoise = nodes_custom_sampler.NODE_CLASS_MAPPINGS["RandomNoise"]()
BasicGuider = nodes_custom_sampler.NODE_CLASS_MAPPINGS["BasicGuider"]()
KSamplerSelect = nodes_custom_sampler.NODE_CLASS_MAPPINGS["KSamplerSelect"]()
BasicScheduler = nodes_custom_sampler.NODE_CLASS_MAPPINGS["BasicScheduler"]()
SamplerCustomAdvanced = nodes_custom_sampler.NODE_CLASS_MAPPINGS["SamplerCustomAdvanced"]()
VAELoader = NODE_CLASS_MAPPINGS["VAELoader"]()
VAEDecode = NODE_CLASS_MAPPINGS["VAEDecode"]()
EmptyLatentImage = NODE_CLASS_MAPPINGS["EmptyLatentImage"]()

with torch.inference_mode():
clip = DualCLIPLoader.load_clip("t5xxl_fp8_e4m3fn.safetensors", "clip_l.safetensors", "flux")[0]
unet = UNETLoader.load_unet("flux1-dev-fp8.safetensors", "fp8_e4m3fn")[0]
vae = VAELoader.load_vae("ae.sft")[0]

def closestNumber(n, m):
q = int(n / m)
n1 = m * q
if (n * m) > 0:
n2 = m * (q + 1)
else:
n2 = m * (q - 1)
if abs(n - n1) < abs(n - n2):
return n1
return n2

 

Вторая ячейка (пишем свой запрос и выполняем после этого):

with torch.inference_mode():
positive_prompt = "Macro photography of a Irish female with freckles, smile, wind"
width = 1024
height = 1024
seed = 0
steps = 20
sampler_name = "euler"
scheduler = "simple"

if seed == 0:
seed = random.randint(0, 18446744073709551615)
print(seed)

cond, pooled = clip.encode_from_tokens(clip.tokenize(positive_prompt), return_pooled=True)
cond = [[cond, {"pooled_output": pooled}]]
noise = RandomNoise.get_noise(seed)[0]
guider = BasicGuider.get_guider(unet, cond)[0]
sampler = KSamplerSelect.get_sampler(sampler_name)[0]
sigmas = BasicScheduler.get_sigmas(unet, scheduler, steps, 1.0)[0]
latent_image = EmptyLatentImage.generate(closestNumber(width, 16), closestNumber(height, 16))[0]
sample, sample_denoised = SamplerCustomAdvanced.sample(noise, guider, sampler, sigmas, latent_image)
model_management.soft_empty_cache()
decoded = VAEDecode.decode(vae, sample)[0].detach()
Image.fromarray(np.array(decoded*255, dtype=np.uint8)[0]).save("/content/flux.png")

Image.fromarray(np.array(decoded*255, dtype=np.uint8)[0])

 

Готово.

Авторизуйтесь, чтобы получить возможность оставлять комментарии

Другие материалы в этой категории:

Go to top