Пост 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 напрямую
Твой текущий промпт — "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"])
Твой 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?