# IP-Adapter

Используйте изображения в качестве подсказок для генерации Stable Diffusion.

{% hint style="success" %}
Все примеры можно запускать на GPU-серверах, арендуемых через [CLORE.AI Marketplace](https://clore.ai/marketplace).
{% endhint %}

## Аренда на CLORE.AI

1. Посетите [CLORE.AI Marketplace](https://clore.ai/marketplace)
2. Отфильтруйте по типу GPU, объему VRAM и цене
3. Выберите **On-Demand** (фиксированная ставка) или **Spot** (цена по ставке)
4. Настройте ваш заказ:
   * Выберите Docker-образ
   * Установите порты (TCP для SSH, HTTP для веб-интерфейсов)
   * Добавьте переменные окружения при необходимости
   * Введите команду запуска
5. Выберите способ оплаты: **CLORE**, **BTC**, или **USDT/USDC**
6. Создайте заказ и дождитесь развертывания

### Доступ к вашему серверу

* Найдите данные для подключения в **Моих заказах**
* Веб-интерфейсы: используйте URL HTTP-порта
* SSH: `ssh -p <port> root@<proxy-address>`

## Что такое IP-Adapter?

IP-Adapter позволяет использовать изображения как подсказки:

* Используйте референсные изображения для управления генерацией
* Совмещайте с текстовыми подсказками
* Перенос стиля и перенос содержимого
* Работает с SD 1.5 и SDXL

## Типы адаптеров

| Адаптер              | Случай использования                          | VRAM |
| -------------------- | --------------------------------------------- | ---- |
| IP-Adapter           | Общее использование изображений как подсказок | 8GB  |
| IP-Adapter-Plus      | Более высокое качество                        | 10GB |
| IP-Adapter-Face      | Ориентирован на лица                          | 10GB |
| IP-Adapter-Full-Face | Детали полного лица                           | 12GB |

## Быстрое развертывание

**Docker-образ:**

```
pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
```

**Порты:**

```
22/tcp
7860/http
```

**Команда:**

```bash
pip install diffusers transformers accelerate && \
python ip_adapter_app.py
```

## Доступ к вашему сервису

После развертывания найдите ваш `http_pub` URL в **Моих заказах**:

1. Перейдите на **Моих заказах** страницу
2. Нажмите на ваш заказ
3. Найдите `http_pub` URL (например, `abc123.clorecloud.net`)

Используйте `https://YOUR_HTTP_PUB_URL` вместо `localhost` в примерах ниже.

## Установка

```bash
pip install diffusers transformers accelerate
```

## Базовое использование изображений как подсказок

```python
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16
).to("cuda")

# Загрузить IP-Adapter
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name="ip-adapter_sdxl.bin"
)

# Загрузить референсное изображение
ip_image = load_image("reference.jpg")

# Сгенерировать с использованием изображения как подсказки
image = pipe(
    prompt="кот в таком же стиле",
    ip_adapter_image=ip_image,
    num_inference_steps=30
).images[0]

image.save("output.png")
```

## Перенос стиля

```python
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
).to("cuda")

pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter_sd15.bin"
)

# Референс стиля (например, картина Ван Гога)
style_image = load_image("van_gogh_starry_night.jpg")

# Сгенерировать новый контент в этом стиле
image = pipe(
    prompt="современный городской горизонт",
    ip_adapter_image=style_image,
    num_inference_steps=30,
    guidance_scale=7.5
).images[0]

image.save("city_van_gogh.png")
```

## Адаптер для лиц

Для генерации, ориентированной на лица:

```python
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16
).to("cuda")

# Загрузить адаптер, специфичный для лиц
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name="ip-adapter-plus-face_sdxl_vit-h.bin"
)

# Референс лица
face_image = load_image("face_reference.jpg")

# Сгенерировать портрет
image = pipe(
    prompt="портретная живопись, масло на холсте, музейное качество",
    ip_adapter_image=face_image,
    num_inference_steps=30
).images[0]

image.save("portrait.png")
```

## Комбинирование нескольких изображений

```python
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16
).to("cuda")

pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name="ip-adapter_sdxl.bin"
)

# Несколько референсных изображений
images = [
    load_image("style1.jpg"),
    load_image("style2.jpg")
]

# Сгенерировать, смешав оба
image = pipe(
    prompt="пейзажная живопись",
    ip_adapter_image=images,
    num_inference_steps=30
).images[0]
```

## Управление масштабом

```python

# Установить силу адаптера
pipe.set_ip_adapter_scale(0.6)  # от 0.0 до 1.0

# Низкий масштаб = больше влияние текстовой подсказки

# Высокий масштаб = больше влияние изображения-подсказки

# Индивидуальное масштабирование для нескольких изображений
pipe.set_ip_adapter_scale([0.7, 0.3])
```

## С ControlNet

```python
from diffusers import (
    AutoPipelineForText2Image,
    ControlNetModel
)
from diffusers.utils import load_image
import torch

# Загрузить ControlNet
controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11p_sd15_canny",
    torch_dtype=torch.float16
)

pipe = AutoPipelineForText2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    controlnet=controlnet,
    torch_dtype=torch.float16
).to("cuda")

# Загрузить IP-Adapter
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter_sd15.bin"
)

# Изображение стиля
style_image = load_image("style.jpg")

# Контрольное изображение (карта контуров)
control_image = load_image("edges.png")

image = pipe(
    prompt="детализированная иллюстрация",
    image=control_image,
    ip_adapter_image=style_image,
    num_inference_steps=30
).images[0]
```

## Интерфейс Gradio

```python
import gradio as gr
import torch
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image

pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16
).to("cuda")

pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name="ip-adapter_sdxl.bin"
)

def generate(reference_image, prompt, negative_prompt, scale, steps):
    pipe.set_ip_adapter_scale(scale)

    image = pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        ip_adapter_image=reference_image,
        num_inference_steps=steps
    ).images[0]

    return image

demo = gr.Interface(
    fn=generate,
    inputs=[
        gr.Image(type="pil", label="Референсное изображение"),
        gr.Textbox(label="Подсказка", value="высокое качество"),
        gr.Textbox(label="Негативная подсказка", value="уродливое, размытое"),
        gr.Slider(0.0, 1.0, value=0.6, label="Масштаб IP-Adapter"),
        gr.Slider(10, 50, value=30, step=1, label="Шаги")
    ],
    outputs=gr.Image(label="Generated Image"),
    title="IP-Adapter: image prompting"
)

demo.launch(server_name="0.0.0.0", server_port=7860)
```

## Пакетный перенос стиля

```python
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch
import os

pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16
).to("cuda")

pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name="ip-adapter_sdxl.bin"
)

# Референс стиля
style_image = load_image("art_style.jpg")

# Объекты для генерации
subjects = [
    "горный пейзаж",
    "город ночью",
    "лес осенью",
    "закат над океаном",
    "заснеженная деревня"
]

output_dir = "./styled_outputs"
os.makedirs(output_dir, exist_ok=True)

for i, subject in enumerate(subjects):
    print(f"Генерация {i+1}/{len(subjects)}: {subject}")

    image = pipe(
        prompt=subject,
        ip_adapter_image=style_image,
        num_inference_steps=30
    ).images[0]

    image.save(f"{output_dir}/styled_{i:03d}.png")
```

## Сценарии использования

### Стиль продуктовой фотографии

```python

# Референс: профессиональное фото продукта
style = load_image("product_photo_reference.jpg")

image = pipe(
    prompt="красные кроссовки на белом фоне",
    ip_adapter_image=style,
    num_inference_steps=30
).images[0]
```

### Художественный перенос стиля

```python

# Референс: знаменитая картина
style = load_image("monet_painting.jpg")

image = pipe(
    prompt="портрет женщины в саду",
    ip_adapter_image=style,
    num_inference_steps=30
).images[0]
```

### Согласованность бренда

```python

# Референс: изображение из руководства по стилю бренда
style = load_image("brand_style.jpg")

prompts = [
    "баннер на главной странице сайта",
    "публикация в социальных сетях",
    "шапка письма-рассылки"
]

for prompt in prompts:
    image = pipe(prompt=prompt, ip_adapter_image=style).images[0]
```

## Оптимизация памяти

```python
pipe.enable_model_cpu_offload()
pipe.enable_vae_slicing()

# Для очень ограниченной видеопамяти (VRAM)
pipe.enable_sequential_cpu_offload()
```

## Производительность

| Модель                 | GPU      | Время |
| ---------------------- | -------- | ----- |
| SD 1.5 + IP-Adapter    | RTX 3090 | \~5 с |
| SDXL + IP-Adapter      | RTX 3090 | \~12с |
| SDXL + IP-Adapter      | RTX 4090 | \~8s  |
| SDXL + IP-Adapter-Plus | RTX 4090 | \~10с |

## Устранение неполадок

### Стиль не применён

* Увеличьте ip\_adapter\_scale
* Используйте более четкое референсное изображение
* Убедитесь, что адаптер загружен правильно

### Слишком сильное влияние референса

* Уменьшите ip\_adapter\_scale
* Более конкретная текстовая подсказка
* Увеличить guidance\_scale

### Проблемы с памятью

* Включить выгрузку на CPU
* Используйте SD 1.5 вместо SDXL
* Понизьте разрешение

## Оценка стоимости

Типичные ставки на маркетплейсе CLORE.AI (по состоянию на 2024):

| GPU       | Почасовая ставка | Дневная ставка | Сессия 4 часа |
| --------- | ---------------- | -------------- | ------------- |
| RTX 3060  | \~$0.03          | \~$0.70        | \~$0.12       |
| RTX 3090  | \~$0.06          | \~$1.50        | \~$0.25       |
| RTX 4090  | \~$0.10          | \~$2.30        | \~$0.40       |
| A100 40GB | \~$0.17          | \~$4.00        | \~$0.70       |
| A100 80GB | \~$0.25          | \~$6.00        | \~$1.00       |

*Цены варьируются в зависимости от провайдера и спроса. Проверьте* [*CLORE.AI Marketplace*](https://clore.ai/marketplace) *для текущих тарифов.*

**Экономьте деньги:**

* Используйте **Spot** рынок для гибких рабочих нагрузок (часто на 30–50% дешевле)
* Платите с помощью **CLORE** токенов
* Сравнивайте цены у разных провайдеров

## Дальнейшие шаги

* [InstantID](/guides/guides_v2-ru/lico-i-identichnost/instantid.md) - Идентичность лица
* [ControlNet](/guides/guides_v2-ru/obrabotka-izobrazhenii/controlnet-advanced.md) - Контроль структуры
* Stable Diffusion WebUI - расширение IP-Adapter


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-ru/lico-i-identichnost/ip-adapter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
