В этом руководстве мы разрабатываем практический рабочий процесс генерации изображений с использованием библиотеки Diffusers. Мы начинаем со стабилизации среды, затем генерируем высококачественные изображения из текстовых подсказок с помощью Stable Diffusion с оптимизированным планировщиком.
Подготовка среды
Мы подготавливаем чистую и совместимую среду выполнения, устраняя конфликты зависимостей и устанавливая все необходимые библиотеки. Мы обеспечиваем надёжную работу обработки изображений, фиксируя правильную версию Pillow и загружая экосистему Diffusers. Также мы импортируем все основные модули, необходимые для создания рабочих процессов генерации, управления и редактирования изображений.
Определение вспомогательных функций
Мы определяем вспомогательные функции для обеспечения воспроизводимости и организации визуальных результатов. Мы устанавливаем глобальные случайные начальные значения, чтобы наши генерации оставались согласованными между запусками. Мы также определяем доступное оборудование и настраиваем точность для оптимизации производительности на GPU или CPU.
«`python
def seed_everything(seed=42):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manualseedall(seed)
def to_grid(images, cols=2, bg=255):
# …
return grid
device = «cuda» if torch.cuda.is_available() else «cpu»
dtype = torch.float16 if device == «cuda» else torch.float32
print(«device:», device, «| dtype:», dtype)
seed_everything(7)
BASE_MODEL = «runwayml/stable-diffusion-v1-5»
«`
Генерация изображений
Мы инициализируем базовый конвейер Stable Diffusion и переключаемся на более эффективный планировщик UniPC. Мы генерируем высококачественное изображение непосредственно из текстовой подсказки, используя тщательно выбранные параметры наведения и настройки разрешения.
«`python
pipe = StableDiffusionPipeline.from_pretrained(
BASE_MODEL,
torch_dtype=dtype,
safety_checker=None,
).to(device)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
prompt = «a cinematic photo of a futuristic street market at dusk, ultra-detailed, 35mm, volumetric lighting»
negative_prompt = «blurry, low quality, deformed, watermark, text»
img_text = pipe(
prompt=prompt,
negativeprompt=negativeprompt,
numinferencesteps=25,
guidance_scale=6.5,
width=768,
height=512,
).images[0]
«`
Ускорение вывода
Мы ускоряем вывод, загружая и объединяя адаптер LoRA, и демонстрируем быструю выборку с очень небольшим количеством шагов диффузии.
«`python
LCM_LORA = «latent-consistency/lcm-lora-sdv1-5»
pipe.loadloraweights(LCM_LORA)
try:
pipe.fuse_lora()
lora_fused = True
except Exception as e:
lora_fused = False
print(«LoRA fuse skipped:», e)
fast_prompt = «a clean product photo of a minimal smartwatch on a reflective surface, studio lighting»
fast_images = []
for steps in [4, 6, 8]:
fast_images.append(
pipe(
prompt=fast_prompt,
negativeprompt=negativeprompt,
numinferencesteps=steps,
guidance_scale=1.5,
width=768,
height=512,
).images[0]
)
«`
Структурное управление
Мы конструируем структурное условное изображение и применяем ControlNet для управления компоновкой генерируемой сцены. Это позволяет нам сохранить композицию, одновременно используя творческое текстовое руководство.
«`python
CONTROLNET = «lllyasviel/sd-controlnet-canny»
controlnet = ControlNetModel.from_pretrained(
CONTROLNET,
torch_dtype=dtype,
).to(device)
cnpipe = StableDiffusionControlNetPipeline.frompretrained(
BASE_MODEL,
controlnet=controlnet,
torch_dtype=dtype,
safety_checker=None,
).to(device)
cn_prompt = «a modern cafe interior, architectural render, soft daylight, high detail»
imgcontrolnet = cnpipe(
prompt=cn_prompt,
negativeprompt=negativeprompt,
image=canny_image,
numinferencesteps=25,
guidance_scale=6.5,
controlnetconditioningscale=1.0,
).images[0]
«`
Локализованное редактирование
Мы создаём маску для выделения определённой области и применяем редактирование путём вставки, чтобы изменить только эту часть изображения. Мы уточняем выбранную область, используя целевую подсказку, сохраняя остальную часть изображения неизменной.
«`python
mask = Image.new(«L», img_controlnet.size, 0)
mask_draw = ImageDraw.Draw(mask)
mask_draw.rectangle([60, 90, 320, 170], fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(2))
inpaintpipe = StableDiffusionInpaintPipeline.frompretrained(
BASE_MODEL,
torch_dtype=dtype,
safety_checker=None,
).to(device)
inpaint_prompt = «a glowing neon sign that says ‘CAFÉ’, cyberpunk style, realistic lighting»
imginpaint = inpaintpipe(
prompt=inpaint_prompt,
negativeprompt=negativeprompt,
image=img_controlnet,
mask_image=mask,
numinferencesteps=30,
guidance_scale=7.0,
).images[0]
«`
Сохранение результатов
Мы сохраняем все промежуточные и окончательные результаты на диск для проверки и повторного использования.
«`python
os.makedirs(«outputs», exist_ok=True)
img_text.save(«outputs/text2img.png»)
gridfast.save(«outputs/lorafast_grid.png»)
layout.save(«outputs/layout.png»)
canny_image.save(«outputs/canny.png»)
img_controlnet.save(«outputs/controlnet.png»)
mask.save(«outputs/mask.png»)
img_inpaint.save(«outputs/inpaint.png»)
«`
В заключение мы продемонстрировали, как единая конвейерная линия Diffusers может превратиться в гибкую систему генерации изображений, готовую к использованию в производственных условиях. Мы объяснили, как перейти от простой генерации изображений по тексту к быстрой выборке, структурному управлению и целенаправленному редактированию изображений без изменения фреймворков или инструментов.
1. Какие основные шаги включает в себя подготовка среды для генерации изображений с помощью HuggingFace Diffusers?
Ответ: подготовка среды включает в себя устранение конфликтов зависимостей, установку всех необходимых библиотек, фиксацию правильной версии Pillow и загрузку экосистемы Diffusers.
2. Какие вспомогательные функции определены для обеспечения воспроизводимости и организации визуальных результатов?
Ответ: определены функции `seedeverything` для установки глобальных случайных начальных значений и `togrid` для организации изображений в сетку. Также настроена точность для оптимизации производительности на GPU или CPU.
3. Какой планировщик используется для генерации высококачественных изображений и почему он эффективен?
Ответ: для генерации высококачественных изображений используется планировщик UniPC. Он эффективен благодаря оптимизации производительности и улучшению качества генерируемых изображений.
4. Как осуществляется структурное управление при генерации изображений?
Ответ: структурное управление осуществляется с помощью ControlNet, который позволяет сохранить композицию, одновременно используя творческое текстовое руководство.
5. Какие инструменты и методы используются для локализованного редактирования изображений?
Ответ: для локализованного редактирования используется создание маски для выделения определённой области и применение редактирования путём вставки с использованием целевой подсказки.