Реставрация фото во Flux1.Kontext ч2: чёрное-белые фото и сложные случаи
В прошлой статье я описал опыт реставрации слайдов с помощью относительно новой нейросети Flux1.Kontext. Читатели задавали много вопросов по старым чёрно-белым фотографиям. У меня у самого около 400 штук ждёт своей очереди, поэтому я провёл несколько дней в экспериментах и подобрал запросы под разные ситуации. И в целом более подробно изучил возможности нейронки.
Коротко для тех, кто не видел прошлый текст. Для редактирования я использую модель flux1.kontext. Получить доступ к ней можно разными способами: в песочнице или через api у разработчика модели, на сторонних сервисах, которые установили модель у себя, в телеграм-ботах, локально на своём ПК. На сайте модели есть ссылки на гитхаб, huggingface, документация. На ютубе полно туториалов по локальной работе модели.
В песочнице разработчиков при регистрации дают 200 кредитов, одна генерация стоит 4 кредита для модели pro и 8 - для max. Если у вас небольшой архив фото, то стартового баланса хватит на все эксперименты. Если нужно обработать много фото, то 1000 кредитов стоит 10$ (только зарубежные карты). Можно воспользоваться посредниками типа бота syntx ai. В прошлый раз я написал, что это будет сильно дороже, но я накосячил с расчётами и в итоге получается, что цены у посредников и разработчиков +/- одинаковые.
Главный недостаток нейронки - низкое разрешение фото на выходе. Результат годится для соцсетей или чатов с родственниками. Но для архива или печати это не подходит. Поэтому ручную работу нейронки ещё полностью не заменяют, хоть и сильно упрощают некоторые этапы обработки.
Настройки генерации
Перед обработкой в песочнице нужно поменять некоторые параметры модели. Они доступны в поле, где нужно вводить промпт - кнопка в виде трёх точек.
- Model - выбрать модель Kontext [max] или [pro]. Они дают разную картинку, но эксперименты показали, что нельзя сказать, что max прям лучше, при том, что стоит в 2 раза дороже. На некоторых фото pro давала гораздо более чёткую и контрастную картинку. Я рекомендую попробовать обе модели.
- Batch Size - выбрать количество картинок, которое будет генерироваться за раз. Они будут немного отличаться друг от друга. И далеко не всегда первая - лучшая. Поэтому я оставляю 4 варианта, чтобы выбрать лучшую. Но надо помнить, что каждая картинка в генерации будет снимать по 4 или 8 кредитов.
- Prompt Upsampling - при включении промпт будет автоматически "улучшаться". Это часто даёт хороший результат на простых запросах. Например, при включении этого параметра кроме прочих изменений обычно повышается резкость фотографий, даже если в исходном промпте об этом не было ни слова. Но могут быть и нежелательные улучшения - колоризация, о которой не просили, дорисовки и т.п. Поэтому стоит попробовать и так и так.
- Output Format - выбираем png или jpg. Я оставляю png, чтобы не появилось артефактов сжатия на и так маленькой картинке.
- Seed - параметр, необходимый для стабильной генерации. По-умолчанию он выбирается случайно. Его нужно задавать, например, если мы разрезали исходное фото на несколько частей, чтобы потом склеить результат обработки и получить фото в высоком разрешении. Тогда нужно, чтобы у каждой генерации был один и тот же сид. Его нужно оставлять случайным, если хотите получить несколько генераций, чуть-чуть отличных друг от друга, чтобы выбрать лучшую.
Подготовка изображения
Исходное фото должно быть отсканировано в высоком разрешении. Большинство вопросов по качеству генерации в прошлой теме возникли именно из-за низкого разрешения исходников. Если на фото человек крупным планом (как на фото ниже), детали лица хорошо читаются и дефекты незначительны (мелкие царапины, небольшой расфокус) разрешение должно быть не меньше, чем будет итоговая картинка, то есть в районе 1248*832 но лучше больше. Выцветшие, повреждённые фото или фото, где лица занимают небольшую площадь, сканируйте в разрешении 600-800 ppi. Так нейронка сможет вытащить какие-то детали даже из мыла.
Нужно выровнять фото по горизонту и убрать рамку. Если этого не сделать, нейронка может попытаться дорисовать фото вместо рамки как здесь:
Важно - изображение на выходе из нейронки нельзя использовать для дальнейшего редактирования в ней же. Если надо что-то поменять после редактирования, переписываем исходный промпт и используем исходное изображение, чтобы обработать его снова. Если пропустить через нейронку фото, которое до этого в ней уже обработали, то на выходе будет месиво из артефактов.
Как составить запрос
Для начала можно изучить руководство по запросам от разработчиков. В прошлый раз я работал с таким промптом для реставрации фото:
Restore this old photo to look as if it was taken today with high-resolution digital cameras without changing anything about the image. Just repair it, clean it, sharpen it, improve shadow detail and adjust the colors to look natural and lifelike.
Он хорошо обработает даже чёрно-белую фотографию, если там хватает разрешения и деталей, но с проблемными фото он уже не справляется - слишком много рисует. Кроме того часто хочется получить точно такое же фото как было, но с исправленными косяками и без сильной обработки, чтобы сохранился изначальный винтажный вид.
Начинать лучше с простых запросов. Когда добавляешь деталей в запрос, он увеличивается как снежный ком. Нейронка дословно выполняет указания и "теряет" детали, о которых не говорится в запросе. Забываешь упомянуть контраст - получаешь серое неконтрастное изображение. Пишешь про контраст - серое становится слишком тёмным, светлое - белым. Справился с этим - лица не в фокусе. Забудешь три раза за запрос напомнить, что работаем только в ч/б, раскрасит картинку. И так по кругу.
При этом многие запросы приводят к одним и тем же результатам. Если в запросе есть слова "Restore photo", то часто весь остальной текст не нужен, а многие детали запроса игнорируются. Ещё нейронка очень сильно фокусируется на командах, которые сохраняют чёрно-белый цвет. Например, запрос "Restore this photo to a fresh state" полностью отреставрирует и раскрасит фото. Но если не нужна колоризация, то команды типа: "Restore this photo to a fresh state while providing a vintage black and white look" только уберёт царапины и дефекты. Более сложной корректировки (повышение резкости, улучшение лиц) уже не будет.
Поэтому общий промпт на реставрацию с колоризацией я нашёл в готовых примерах за несколько минут и выглядит он вот так:
Restore this photo to a fresh state without changing anything about the image
А промпт на реставрацию но без колоризации я собирал пол-дня, потратив сотню генераций на эксперименты и выглядит он вот так:
Improve tonal balance and clarity of a black and white photograph without changing anything about the image. Enhance fine details in shadows and highlights without crushing blacks or blowing out whites. Increase facial sharpness and definition, especially for slightly out-of-focus faces. Remove minor defects like scratches, dust, and blemishes. Leave the photo in grayscale. Preserve original textures, lighting, and facial features. Avoid excessive contrast. No colorization.
А этот запрос уберёт дефекты бумаги (или плёнки), но не будет улучшать картинку:
Restore this photo to a fresh state without changing anything about the image while providing a vintage black and white look
Иногда бывает, что по запросу "Restore this photo to a fresh state" нейронка не раскрашивает фото, а хочется. Или она меняет детали фото. Если запрос "сделай как на современную камеру" слишком сильно меняет картинку, тогда поможет такой:
Colorize and enhance a black and white photograph with realistic accurate tones. Improve tonal balance and clarity. Enhance fine details in shadows and highlights without crushing blacks or blowing out whites. Increase facial sharpness and definition, especially for slightly out-of-focus faces. Remove minor defects like scratches, dust, and blemishes. Adjust the colors to look natural and lifelike. Preserve original textures, lighting, and facial features. Subtle and natural colorization only - no oversaturation or stylization.
В целом, как только подключается работа с цветом, модель позволяет себе гораздо больше самодеятельности и может много чего дорисовать. Поэтому в идеале разделить реставрацию и колоризацию. Результат придётся собирать в фотошопе или другом редакторе, который может работать со слоями. Сначала надо получить исправленное чёрно-белое фото, потом цветное.
Примеры обработки
Чёрно-белое фото без серьёзных недостатков - есть небольшие царапины, лица немного не в фокусе.
В идеале обработку таких фото делать в фотошопе - убрать дефекты, увеличить резкость, а потом накинуть цвет, который сделает нейронка. Но придётся много поработать руками, и, если нет навыков работы в фотошопе и не хочется разбираться, результат, полученный чисто на нейронке, будет отличаться только более низким разрешением. Несколько вариантов обработки во Flux.Kontext привёл выше.
Отмечу, что при колоризации на примере выше нейронка замазала вмятину на черепе мужчины, хотя не тронула её при чёрно-белой обработке. Т.к. хочется исторической достоверности, то идём по описанному пути: склеиваем чёрно-белую и цветную реставрацию в фотошопе:
К вопросу, почему нельзя последовательно редактировать фото несколькими запросами. Если попытаться добавить цвет в отредактированное ч-б фото запросом типа "Colorize grayscale photo; accurate skin tones, natural lighting; preserve original textures and facial features. Adjust the colors to look natural and lifelike.", получим вот такое:
Поэтому, берём фотошоп или другой редактор, кидаем вторую картинку новым слоем поверх чёрно-белой и задаём режим смешения "цвет" ("color"), получаем фото без артефактов и глюков нейронки.
Для подобных портретов flux.kontext сейчас - это лучшее решение для колоризации. Даже если вся работа по реставрации проводится вручную, цвет можно всегда взять из результата нейронки. Лично я цвет так никогда не нарисую.
Повреждённые фото
Тут ничего особо сказать нельзя. Если в целом на фото есть детали, нейронка восстановит фото по любому из указанных запрососв без проблем. Если лицо мелкое, то может потребоваться несколько генераций, как в сложных случаях дальше.
Фото детей и подростков
Выделил в отдельный пункт, потому что заметил, что нейронка плохо работает с ними. У детей часто меняется выражение лица, подростки вообще на себя не похожи. Если такое случается, нужно поправить промпт. Убираем слово "old" отовсюду, указываем, кто на фото ("kid", "teenage boy", "young man", можно прямо возраст указать), добавляем больше ограничений. Ну и переходим в ч-б, потому что при колоризации нейронка рисует активнее. Вот промпт, который выдаёт более стабильные результаты со старыми детскими портретами (даже игрушки не стал дорисовывать):
Restore this kid's photo without changing anything about the image. Improve tonal balance and clarity of a black and white photograph. Enhance fine details in shadows and highlights without crushing blacks or blowing out whites. Increase facial sharpness and definition, especially for slightly out-of-focus faces. Remove minor defects like scratches, dust, and blemishes. Leave the photo in grayscale. Preserve original textures, lighting. Preserve original facial expression and facial features. Avoid excessive contrast. No colorization.
Перед тем, как редактировать текст запроса, сделайте несколько генераций, желательно, меняя модель pro-max. Если результат стабильно плохой, тогда уже нужно менять промпт.
Ручное раскрашивание предметов
Вещи, которые нужно перекрасить, указываем в кавычках. Ищем точное название на анлийском. Если написать 'tie' вместо 'pioneer's tie', нейронка идеально перерисует пионерский галстук на обычный. На фото ушанка не того цвета - так и пишем 'ushanka' is green.
Пример, где исходный запрос искажает лицо и неправильно красит галстук. Переписываю запрос на максимальную строгость, урезаю его до минимально возможного (т.к. фото изначально хорошего качества, тут не нужно много подробностей), добавляю указание на цвет галстука.
Restore this teenager boy's photo without changing anything about the image. Preserve original facial expression and facial features. 'pioneer's tie' is red
Артефакты на лицах после реставрации
Даже если разрешение исходника достаточное, но лица на фото мелкие, на итоговом снимке на них могут быть артефакты. На этом фото всё вроде норм, нужно только подкрутить контраст, но лицо не читается и, если обработать это фото как есть, результат будет не очень. При 100% масштабе видно, что лицо стало даже хуже прорисовано.
Вырезаем из фото объекты, которые хотим улучшить. Главное требование - высокое разрешение скана. Пусть на фото при 100% масштабе всё будет в мыле из-за недостатка разрешения оригинала, но нейросетке надо дать хотя бы эти данные. С таким кропом результат гораздо лучше.
Итог добавление кропа на общий план:
Аналогично обработал фото детей (с поправкой на промпт про детей). На кропе отреставрированной картинки есть артефакты:
Поэтому также отдельно обработал центральную часть с лицами и наложил результат на общий план. Сверху накинул цвет:
Можно пойти ещё дальше, разрезать исходник на кусочки с разрешением в районе 1500 по каждой стороне, обработать каждый отдельно, потом склеить их обратно. В этом случае надо выключить prompt upsampling, генерировать за раз по одной картинке и использовать единый seed на все генерации. Тогда куски фотографии сложатся обратно после обработки без видимых переходов. Но я всё-таки предпочитаю обрабатывать такие фото в фотошопе, а в нейронке генерирую только отдельные участки с людьми или совсем размытыми деталями.
Ещё один вариант - настроить локальную генерацию на более высокое разрешение. Вот обсуждение этой темы на реддите с возможными решениями и проблемами.
Фотографии с потерянными деталями
Перейдём к самым тяжёлым случаям, когда деталей лиц уже почти не остаётся. В этом случае придётся рисовать.
Запрос для дорисовки:
Improve tonal balance and clarity of a black and white photograph. Reconstruct lost facial details. Use only visible facial features. Enhance fine details in shadows and highlights without crushing blacks or blowing out whites. Increase facial sharpness and definition, especially for slightly out-of-focus faces. Remove minor defects like scratches, dust, and blemishes. Leave the photo in grayscale. Preserve original textures, lighting, and facial features. Avoid excessive contrast. No colorization.
В плане составления запроса тут большой простор для экспериментов. Скорее всего, можно найти запрос, который справится заметно лучше.
Т.к. модель будет фантазировать, не факт, что результат будет удовлетворительным с первого раза (хоть в запросе её фантазия и ограничена по-максимуму). Нужно увеличить количество генераций за раз до 4, включить рандомный seed и ждать, пока лица не нарисуются как надо. Иногда приходится сделать и 5 генераций по 4 картинки. На чудо рассчитывать не стоит, но простор для улучшения даже для таких фото есть.
Метод с улучшением кропа работает в этой ситуации не так хорошо, как на прошлом примере. Во-первых, исходник уж очень плохо сохранился и нейронке проще дорисовать небольшое лицо. Во-вторых, из-за того, что нейронка рисует часть изображения, кроп будет сильно выделяться на фоне остальной картинки. Поэтому без навыков фотошопа картинку с высоким разрешением уже не получить.
С колоризацией тоже получается далеко не так эффектно, как в предыдущих примерах.
Colorize, improve tonal balance and clarity of a black and white photograph. Reconstruct lost facial details. Use only visible facial features. Enhance fine details in shadows and highlights without crushing blacks or blowing out whites. Increase facial sharpness and definition, especially for slightly out-of-focus faces. Remove minor defects like scratches, dust, and blemishes. Preserve original textures, lighting, and facial features. Avoid excessive contrast.
Но если попробовать запрос из прошлой статьи "сделай как на современный фотоаппарат" результат вообще будет мало похож на исходный снимок.
Когда нейронка бессильна
Совсем тяжёлый случай - от лица остались какой-то силуэт с некоторыми чертами и оно не в фокусе. Тут даже нейронка бессильная
Максимум, что тут можно сделать - чуть-чуть накинуть деталей таким запросом:
Restore this photo. Add morе details to all faces, using visible facial features. Increase facial sharpness and definition. Make man's face in the foreground clearly visible. Preserve original facial features.
Результат совсем немного лучше, чем если просто подвигать кривые в фотошопе. Но всё-таки лучше =).
Сильно пере/недоэкспонированные слайды
В конце вернусь к объектам, где нейронка меня продолжает радовать - к слайдам из 80-х. В прошлый раз я показал процесс реставрации с участием нейронки, которую использовал только для восстановления цвета. Но flux.kontext отлично достаёт информацию из поврёждённых слайдов. Например, такой я ещё несколько лет назад не надеялся восстановить, потому что он очень переэкспонирован. Если срезать яркость кривыми, то максимум, что можно получить - в центре. Нейронка с первого раза восстановила картинку:
Аналогично для слишком тёмных фото.
Вот, что будет, если попытаться вытянуть лица без оглядки на остальное фото:
А вот обработка нейронки:
У подобынх фотографий собственное разрешение очень низкое из-за нарушения условий съёмки. Нейросеть в этом случае выдаёт даже более чёткую и детализированную картинку, чем на исходнике. Так что у зашумлённых фото тоже есть шанс получить вторую жизнь.
Спасибо за внимание!