Today

Пост 07.06.2026

Отличный вопрос. Смотрю что у тебя уже есть в pipeline и что можно добавить.Всё понятно. Смотри что у тебя есть и чего не используется:Теперь по каждому пункту конкретно:

1. Clean Patch Reference — самый большой прирост

Твой _merge_reference уже есть в pipeline, но не используется для Fill. Идея: вместо того чтобы подавать FLUX всё изображение целиком, подавать два кропа — кроп с маской (где был текст) и кроп чистого фона того же документа (соседний участок без текста). FLUX видит точный образец паттерна и воспроизводит его, а не выдумывает.

def _extract_clean_reference(image: Image.Image, mask_np: np.ndarray, pad: int = 60) -> Image.Image | None:
    """Вырезать участок того же фона без текста — для референса FLUX."""
    ys, xs = np.where(mask_np > 0)
    if len(ys) == 0:
        return None
    y1, y2 = ys.min(), ys.max()
    x1, x2 = xs.min(), xs.max()
    h, w = y2 - y1, x2 - x1

    # Ищем чистый участок: сначала ниже, потом выше
    img_h, img_w = image.height, image.width
    for dy in [h + pad, -(h + pad), (h + pad) * 2, -((h + pad) * 2)]:
        sy1, sy2 = y1 + dy, y2 + dy
        if 0 <= sy1 and sy2 <= img_h:
            ref_crop = image.crop((x1, sy1, x2, sy2))
            return ref_crop
    return None

Потом в _process_fill перед FLUX:

clean_ref = _extract_clean_reference(image, np.array(mask))
if clean_ref:
    # Склеить image и reference горизонтально — FLUX Fill умеет это использовать
    # но только через Kontext режим, не Fill напрямую

2. Точный промпт по типу фона

Твой текущий промпт — "Remove all text in white mask. Extend background texture seamlessly." — слишком абстрактный. FLUX не знает какую именно текстуру воспроизводить. Нужно генерировать промпт динамически из bg_type который уже определяет background.py:

PROMPTS = {
    "guilloche": "light green guilloche security pattern, fine curved lines, no text, seamless background",
    "solid":     "plain smooth background, uniform color, no text",
    "simple":    "clean document background, no text, seamless",
    "complex":   "seamless background texture matching surroundings, no text, no letters",
}
prompt = PROMPTS.get(bg_type, PROMPTS["complex"])

3. Negative prompt

Твой pipeline передаёт только prompt, но FluxFillPipeline принимает negative_prompt. Сейчас это поле просто не используется:

pipe_kwargs["negative_prompt"] = "text, letters, words, numbers, blurry, artifacts, watermark"

4. Что НЕ даст прирост для паспорта

Идея подавать больше референсов через Kontext для guilloche не поможет — Kontext это editing модель (меняет содержимое по тексту), а не Fill (заполняет маску). Для guilloche лучший инструмент это CV2 который мы уже починили, а FLUX оставить только для по-настоящему сложных фонов.

Хочешь — сделаю патч для динамического промпта + negative prompt в flux_remote.py?