Нейронные сети для редактирования изображений: удаление объектов и замена фона

Открытые модели и решения

FLUX.1 Kontext — текущий лидер

FLUX.1 Kontext представляет собой передовую модель редактирования изображений на основе инструкций. Эта модель демонстрирует высочайшую точность при редактировании по текстовым командам на естественном языке:[1][2]

https://huggingface.co/black-forest-labs/FLUX.1-dev

Ключевые возможности:

  • Удаление и замена объектов с сохранением контекста[2][3]
  • Замена фона с сохранением положения основного объекта[2]
  • Редактирование по текстовым инструкциям, например: «удалить руки, держащие предмет, оставить только сам предмет, установить нейтральный фон»[3][4]
  • Сохранение целостности персонажей при множественных правках[5][1]
  • Сверхбыстрая обработка (3–5 секунд на изображения 1024x1024)[2]

Преимущества:

  • Понимает сложные инструкции по удалению конкретных элементов
  • Сохраняет целостность объекта при изменении фона
  • Поддерживает многопроходное редактирование для пошагового улучшения[4]

Три модели в линейке FLUX:

  • Версия PRO (только доступ по API)
  • Dev Version (версия с открытым исходным кодом)
  • Schnell Version (ускоренная версия с открытым исходным кодом)

Версия PRO генерирует изображения самого высокого качества, в то время как версии dev и schnell могут быть использованы бесплатно на своих серверах. Из этих версий версия schnell оптимизирована для создания высококачественных изображений за меньшее количество шагов, что делает ее более быстрой.

Модель FLUX.1 [dev] является 12-миллиардным трансформером, способным генерировать изображения по текстовым описаниям. Модель поддерживает возможности генерации «текст-в-изображение», «изображение-в-изображение» и inpainting.

Inpainting — это процесс заполнения или восстановления определённых областей изображения, которые были удалены или замаскированы, с использованием искусственного интеллекта. Цель inpainting — создать визуально согласованный и реалистичный результат, чтобы удалённый объект (например, руки, держащие товар) был заменён фоном или другим содержимым, органично вписанным в общую композицию изображения. Как работает inpainting в контексте FLUX.1 [dev] и других моделей:

  • Загрузка изображения — вы предоставляете исходное изображение.
  • Создание маски — вы указываете, какие части изображения нужно удалить (например, руки), закрашивая их специальной маской (обычно белым цветом на чёрном фоне).
  • Текстовый промпт (инструкция) — вы описываете, что должно появиться на месте удалённого фрагмента (например: "нейтральный белый фон, только продукт, профессиональное освещение").
  • Генерация — модель анализирует окружающий контекст и генерирует новое содержимое внутри замаскированной области, соответствующее промпту и стилю изображения.
  • Результат — получается изображение, где нежелательный объект исчез, а его место занял логичный и незаметный фон или другой объект.

https://huggingface.co/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta

Пример

from diffusers import DiffusionPipeline
from diffusers.utils import load_image

pipe = DiffusionPipeline.from_pretrained("alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta")

prompt = "Turn this cat into a dog"
input_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")

image = pipe(image=input_image, prompt=prompt).images[0]

Также некоторые модели могут поддерживать и outpainting. Outpainting — это процесс расширения изображения за его исходные границы с генерацией нового, визуально согласованного содержимого, которое логично продолжает оригинальную сцену. В отличие от inpainting (заполнение внутри изображения), outpainting работает вне границ изображения — добавляет новые области вокруг него.

Gemini 2.5 Flash Image (Nano Banana)

Последняя модель Google для редактирования изображений привлекла большое внимание благодаря своей точности:[6][1][5]

Ключевые особенности:

  • Редактирование без масок — не требуется ручное выделение областей[1]
  • Инструкции на естественном языке для удаления объектов и изменения фона[5]
  • Сохранение целостности лиц и объектов во время редактирования[5]
  • Лучшие результаты в тестах LMArena[5]

Qwen-Image-Edit

Специализированная модель для редактирования изображений от Alibaba, сочетающая семантическое и визуальное редактирование:[7]

Возможности:

  • Двойное редактирование — как по содержанию, так и по внешнему виду[7]
  • Точное создание и редактирование текста прямо на изображении[7]
  • Продвинутое удаление объектов с сохранением визуальной согласованности[7]

Stable Diffusion с функцией Inpainting (заполнения)

Модели: SD 1.5, SDXL, SD 3.5 Large[8][9]

Варианты реализации:

  • AUTOMATIC1111 WebUI — удобный интерфейс с инструментами для inpainting[10][11]
  • ComfyUI — система рабочих процессов на основе узлов для продвинутых пользователей
  • Библиотека Diffusers — прямая реализация на Python

Пример рабочего процесса для удаления объекта на примере задачи «удалить руки, держащие предмет, оставить только предмет и установить нейтральный фон».

  1. Загрузить изображение
  2. Создать маску для рук / нежелательных объектов
  3. Использовать inpainting с промптом: "нейтральный фон, только продукт"
  4. Настроить силу удаления шума (0.7–0.9 для полного удаления)

Рекомендации по использованию:[11]

  • Используйте обработку всего изображения, а не только замаскированной области
  • Устанавливайте высокую силу удаления шума (0.8–0.9) для полного удаления объекта
  • Используйте описательные промпты для замены фона
  • Применяйте негативные промпты, чтобы указать, чего избегать

Модель Segment Anything (SAM) + конвейер диффузионных моделей

Комбинированный подход:[12][13][14]

Рабочий процесс:

  1. SAM автоматически сегментирует объекты[15][12]
  2. Grounding DINO определяет конкретные объекты по текстовому запросу[13]
  3. Inpainting в Stable Diffusion заполняет удалённые области[13]

Реализации на GitHub:

  • EditAnything — готовый конвейер, объединяющий SAM + ControlNet + Stable Diffusion[14] https://github.com/sail-sg/EditAnything
  • Интеграция SAM + Stable Diffusion для удаления объектов без предварительной настройки (zero-shot)[13]


Нейросеть для редактирования изображений. Перенос одного изображения на другое Нейронная сеть для редактирования изображений. Изменить фрагмент



Рис 1. Что можно делать с инструментом EditAnything

Специализированные инструменты с открытым кодом

InfEdit (CVPR 2024)[16]

  • Редактирование без инверсии (inversion-free) по инструкциям на естественном языке
  • Поддержка многопроходного редактирования
  • Сохраняет согласованность изображения при последовательных правках

Learnable Regions (CVPR 2024)[17]

  • Редактирование на основе регионов по текстовому описанию
  • Не требует ручного выделения масок
  • Справляется со сложными сценами с несколькими объектами

Проприетарные API-решения

OpenAI DALL-E API

Модели: DALL-E 2 (редактирование), DALL-E 3 (только генерация)[18][19][20]

Текущие ограничения:

  • DALL-E 3 не поддерживает редактирование через API[21][22]
  • API редактирования DALL-E 2 доступен, но даёт более низкое качество[22]
  • Inpainting и outpainting доступны через DALL-E 2[19][23]

Пример:

# Пример редактирования с помощью DALL-E 2
response = openai.Image.create_edit(
    image=open("image.png", "rb"),
    mask=open("mask.png", "rb"),
    prompt="нейтральный фон, только продукт",
    n=1,
    size="1024x1024"
)

Adobe Firefly API

Комплексный набор инструментов для редактирования:[24][25][26][27]

Ключевые возможности:

  • Generative Fill — AI-заполнение с учётом содержимого[27]
  • Удаление и замена объектов[24]
  • Расширение и изменение фона[28]
  • Перенос стиля и улучшение изображений[24]

Пример:

// Firefly Fill API для удаления объекта
const response = await firefly.fill({
    image: uploadedImageId,
    mask: maskImageId,
    prompt: "нейтральный фон, незаметное заполнение"
});

Специализированные коммерческие API

PhotoRoom API[29]

  • Продвинутое удаление фона[29]
  • Оптимизация фото для товаров
  • API, ориентированный на e-commerce задачи

Remove.bg API

  • Специализированное удаление фона
  • Высокая точность обнаружения людей и объектов
  • Поддержка пакетной обработки

PicWish API[30]

  • Удаление объектов и inpainting[30]
  • Замена фона[30]
  • Доступные цены при пакетной обработке[30]

Для конкретной задачи: «Удалить руки, держащие предмет, оставить только предмет, нейтральный фон»

Пример программного кода. Потребует достаточно большое количество видеопамяти для работы, в маленькую карту (16Гб и менее не уберется).

# controlnet_inpaint_pipeline.py
# Удаление рук с помощью ControlNet + SAM + SDXL Inpainting

import os
import torch
import numpy as np
from PIL import Image
from transformers import AutoModelForZeroShotObjectDetection, AutoProcessor
from segment_anything import sam_model_registry, SamPredictor
from diffusers import StableDiffusionXLInpaintPipeline, ControlNetModel, StableDiffusionInpaintPipeline
import cv2

DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
DTYPE = torch.float16 if torch.cuda.is_available() else torch.float32

# Пути к файлам входа и выхода
IMAGE_PATH = "product_with_hands.jpg"
OUTPUT_PATH = "final_controlnet_no_hands.png"

# Параметры
TEXT_PROMPT = "hand, person, finger, arm"
BOX_THRESHOLD = 0.25
MASK_DILATION_KERNEL = 15
GUIDANCE_SCALE = 7.5
NUM_STEPS = 30
SEED = 42
RESIZE_TO = 1024  # SDXL лучше работает на 1024x1024

# ========================================
# Загрузка моделей
# ========================================
print("🚀 Загрузка моделей...")

# 1. Grounding DINO — для поиска рук
print("🔍 Загрузка Grounding DINO...")
dino_model = AutoModelForZeroShotObjectDetection.from_pretrained("IDEA-Research/grounding-dino-tiny").to(DEVICE)
dino_processor = AutoProcessor.from_pretrained("IDEA-Research/grounding-dino-tiny")

# 2. SAM — для сегментации
print("🧠 Загрузка Segment Anything (SAM)...")
SAM_CHECKPOINT = "https://huggingface.co/HCMUE-Research/SAM-vit-h/resolve/main/sam_vit_h_4b8939.pth"  # https://github.com/facebookresearch/segment-anything
sam = sam_model_registry["vit_h"](checkpoint=SAM_CHECKPOINT)
sam.to(DEVICE)
sam_predictor = SamPredictor(sam)

# 3. ControlNet + SDXL Inpainting
print("🎨 Загрузка ControlNet + SDXL Inpainting...")
controlnet = ControlNetModel.from_pretrained(
    "diffusers/controlnet-depth-sdxl-1.0",
    torch_dtype=DTYPE
)

# 4. StableDiffusion XL-1.0
pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    torch_dtype=DTYPE,
    variant="fp16",
    use_safetensors=True
).to(DEVICE)

# Оптимизация (если мало VRAM)
pipe.enable_xformers_memory_efficient_attention()  # если установлено
pipe.enable_model_cpu_offload()  # для слабых GPU

# ========================================
# Вспомогательные функции
# ========================================

def load_image(path):
    image = Image.open(path).convert("RGB")
    return np.array(image)

def detect_boxes(image, text, threshold):
    inputs = dino_processor(images=image, text=text, return_tensors="pt").to(DEVICE)
    with torch.no_grad():
        outputs = dino_model(**inputs)
    results = dino_processor.post_process_object_detection(
        outputs, threshold=threshold, target_sizes=[image.shape[:2]]
    )[0]
    return results["boxes"].cpu().numpy()

def get_sam_mask(image, boxes):
    sam_predictor.set_image(image)
    combined_mask = np.zeros(image.shape[:2], dtype=bool)
    for box in boxes:
        mask, _, _ = sam_predictor.predict(box=box, multimask_output=False)
        mask = cv2.dilate(mask[0].astype(np.uint8), np.ones((MASK_DILATION_KERNEL, MASK_DILATION_KERNEL)))
        combined_mask = np.logical_or(combined_mask, mask.astype(bool))
    return combined_mask

# ========================================
# Основной пайплайн
# ========================================

print(f"🖼️ Загрузка изображения: {IMAGE_PATH}")
image_rgb = load_image(IMAGE_PATH)

# 1. Найти руки
boxes = detect_boxes(image_rgb, TEXT_PROMPT, BOX_THRESHOLD)
print(f"🔍 Найдено {len(boxes)} объектов")

# 2. Получить маску рук через SAM
mask_bool = get_sam_mask(image_rgb, boxes)
mask_image = Image.fromarray(mask_bool.astype(np.uint8) * 255, mode="L")

# 3. Подготовка изображения и маски
def resize_image(img, size=RESIZE_TO):
    w, h = img.size if hasattr(img, 'size') else img.shape[1::-1]
    scale = size / max(w, h)
    new_w, new_h = int(w * scale), int(h * scale)
    return img.resize((new_w, new_h), Image.LANCZOS)

# Изменяем размер
init_image = Image.fromarray(image_rgb)
init_image = resize_image(init_image)
mask_image = resize_image(mask_image)

# Дополняем до квадрата 1024x1024 (обязательно для SDXL)
def pad_to_square(img, target=1024, pad_color=255):
    w, h = img.size
    left = (target - w) // 2
    top = (target - h) // 2
    out = Image.new(img.mode, (target, target), pad_color)
    out.paste(img, (left, top))
    return out, (left, top, w, h)  # возвращаем смещение

init_image_padded, bbox_crop = pad_to_square(init_image, target=1024)
mask_padded, _ = pad_to_square(mask_image, target=1024)

# 4. Создаём "conditioning image" — оригинальное + маска (как в Inpainting)
def make_inpaint_condition(image, mask):
    image = np.array(image) / 255.0
    mask = np.array(mask) / 255.0
    return Image.fromarray(np.clip(image * (1 - mask), 0, 1) * 255).convert("RGB")

control_image = make_inpaint_condition(init_image_padded, mask_padded)

# 5. Генерация с ControlNet
prompt = (
    "a professional product photo on clean white background, studio lighting, "
    "no hands, no people, high detail, e-commerce, sharp focus"
)
negative_prompt = (
    "hands, fingers, people, blurry, text, logo, shadow, dark, low quality"
)

generator = torch.Generator(DEVICE).manual_seed(SEED)

print("🖌️ Генерация с ControlNet...")
result = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=init_image_padded,
    mask_image=mask_padded,
    control_image=control_image,
    strength=0.78,
    guidance_scale=GUIDANCE_SCALE,
    num_inference_steps=NUM_STEPS,
    generator=generator,
    controlnet_conditioning_scale=1.0,
).images[0]

# 6. Обрезаем обратно
left, top, w, h = bbox_crop
result_cropped = result.crop((left, top, left + w, top + h))

# 7. Сохранение
result_cropped.save(OUTPUT_PATH)
print(f"✅ Результат сохранён: {OUTPUT_PATH}")

Лучшее решение с открытым исходным кодом:

  1. FLUX.1 Dev (если доступна) или Stable Diffusion SDXL + Inpainting
  2. SAM для автоматической сегментации рук / нежелательных объектов
  3. Специализированный inpainting-конвейер с промптами вроде:
    • Позитивный: «чистое фото товара, нейтральный фон, профессиональное освещение»
    • Негативный: «руки, пальцы, люди, держать, хватать»

Лучшее коммерческое API-решение:

  1. Adobe Firefly Fill API для сложного удаления объектов
  2. API FLUX.1 Kontext (когда станет доступен) для редактирования по инструкциям
  3. PhotoRoom API для результатов, оптимизированных под e-commerce

Условный рабочий процесс:

# 1. Использовать SAM для выявления и маскирования рук
mask = sam_model.segment(image, prompt="руки, держащие объект")

# 2. Использовать FLUX.1 или Stable Diffusion для inpainting
result = inpaint_model.edit(
    image=original_image,
    mask=hand_mask,
    instruction="удалить руки, оставить только предмет, нейтральный белый фон"
)

# 3. Дополнительная обработка для согласованности
final_image = enhance_product_photo(result)

Рекомендации по производительности:

  • FLUX.1 Kontext: наилучшее качество и точность следования инструкциям[1][2]
  • Stable Diffusion + SAM: наиболее гибкое и экономически эффективное решение с открытым кодом[13]
  • Adobe Firefly: лучший выбор для коммерческих приложений, где важна надёжность[24]
  • Gemini 2.5 Flash: отличное решение для точного редактирования без ручного выделения[5]

Выбор зависит от ваших конкретных требований к качеству, стоимости, скорости обработки и сложности интеграции. Для промышленного использования с высокими требованиями к качеству рекомендуются API FLUX.1 Kontext или Adobe Firefly. Для разработки и экспериментов комбинация Stable Diffusion + SAM предлагает максимальную гибкость и возможности для обучения.

Ссылки

  1. https://dev.to/_37bbf0c253c0b3edec531e/which-is-the-best-image-editing-ai-in-2025-273f
  2. https://flux-context.org
  3. https://flux1.ai/flux-kontext
  4. https://fluximage.co
  5. https://techcrunch.com/2025/08/26/google-geminis-ai-image-model-gets-a-bananas-upgrade/
  6. https://developers.googleblog.com/en/introducing-gemini-2-5-flash-image/
  7. https://hyper.ai/en/news/43359
  8. https://hiringnet.com/image-generation-state-of-the-art-open-source-ai-models-in-2025
  9. https://blog.segmind.com/best-open-source-ai-image-generation-models-of-2024/
  10. https://www.reddit.com/r/StableDiffusion/comments/18frvdn/how_do_you_guys_remove_an_object_with_inpainting/
  11. https://stable-diffusion-art.com/how-to-remove-a-person-with-ai-inpainting/
  12. https://www.labelvisor.com/the-future-of-image-editing-exploring-the-potential-of-segment-anything/
  13. https://blog.roboflow.com/stable-diffusion-sam-image-edits/
  14. https://github.com/sail-sg/EditAnything
  15. https://www.geeksforgeeks.org/data-science/what-is-sam-segment-anything-model/
  16. https://github.com/sled-group/InfEdit
  17. https://github.com/yuanze-lin/Learnable_Regions
  18. https://help.openai.com/en/articles/8555480-dall-e-3-api
  19. https://www.youtube.com/watch?v=f6H8ZJoXvQY
  20. https://community.openai.com/t/dalle3-inpainting-editing-your-images-with-dall-e/705477
  21. https://community.openai.com/t/how-to-use-image-to-image-generation-with-dall-e-3-via-openai-api/1200439
  22. https://community.openai.com/t/create-image-edit-with-dall-e-3/615746
  23. https://realpython.com/generate-images-with-dalle-openai-api/
  24. https://developer.adobe.com/firefly-services/docs/firefly-api/guides/how-tos/firefly-generate-image-api-tutorial/
  25. https://developer.adobe.com/firefly-services/docs/firefly-api/guides/api/image_generation/V2/
  26. https://developer.adobe.com/firefly-services/docs/firefly-api/guides/api/image_generation/V3_Async/
  27. https://developer.adobe.com/firefly-services/docs/firefly-api/guides/api/generative_fill/V1/
  28. https://developer.adobe.com/firefly-services/docs/firefly-api/guides/concepts/structure-image-reference/
  29. https://www.photoroom.com/blog/top-5-ai-photo-editor-apis
  30. https://dynamicmockups.com/tools/best-image-processing-api/
  31. https://harfanglab.io/insidethelab/image-manipulations-deteriorate-deep-learning/
  32. https://escholarship.org/uc/item/7844b07h
  33. https://cyme.io/en/blog/photo-editing-software-ai/
  34. https://opencv.org/blog/deep-learning-with-computer-vision/
  35. https://zapier.com/blog/best-photo-editing-apps-iphone-android/
  36. https://arxiv.org/html/2404.02897v1
  37. https://dataloop.ai/library/model/subcategory/image_manipulation_2161/
  38. https://arxiv.org/html/2308.09764v2
  39. https://vocal.media/photography/top-5-ai-photo-editor-ap-is
  40. https://blog.spheron.network/best-9-open-source-text-to-image-models-in-2024
  41. https://mobidev.biz/blog/background-removal-and-blur-in-a-real-time-video
  42. https://pesto.tech/resources/top-10-open-source-ai-tools-in-2024
  43. https://astanahub.com/en/blog/top-10-luchshikh-neirosetei-dlia-udaleniia-fona-s-foto
  44. https://leadpanda.media/en/blog/top-5-neiromerej-dlya-generacii-zobrajen-y-2024/
  45. https://fal.ai/models/fal-ai/flux/dev/image-to-image
  46. https://arxiv.org/abs/2304.03246
  47. https://www.promptus.ai/blog/flux-ai-image-editor-complete-guide-transform-images-like-magic
  48. https://www.youtube.com/watch?v=Zh3MC89GbcQ
  49. https://blog.metaphysic.ai/better-stable-diffusion-inpainting-by-learning-to-remove-real-objects/
  50. https://intuitionlabs.ai/articles/anthropic-claude-4-llm-evolution
  51. https://claudeaihub.com/claude-ai-vision-and-image/
  52. https://relevanceai.com/llm-models/utilize-claude-v3-vision-for-effective-image-analysis
  53. https://aws.amazon.com/bedrock/anthropic/
  54. https://www.ultralytics.com/blog/anthropics-claude-4-features-whats-new-and-improved
  55. https://www.raymondcamden.com/2024/03/26/automate-generative-image-apis-with-firefly-services