Почему ваш 720p после нейросети похож на акварельный сон?
Вы скачали свежий билд Real-ESRGAN, скормили ему клип в 720p, нажали кнопку и... получили размытое месиво с артефактами по краям. Звучит знакомо? Добро пожаловать в клуб. 90% проблем апскейлинга — не в моделях, а в том, что никто не читает документацию по параметрам tile и denoise. Я перелопатил десятки тестов и готов показать, где конкретно вы теряете качество.
Первая кровь: выбираем модель с умом
Список моделей для апскейла ширится быстрее, чем библиотеки Python. Но 90% случаев покрываются тремя архитектурами. Запомните их, остальное — нишевый хлам.
| Модель | Для чего | VRAM (1080p, tile=256) | Особенность |
|---|---|---|---|
| Real-ESRGAN (v1.3.0) | Реалистичное видео, шумные исходники | 4-6 GB | Лучший баланс скорость/качество. Новая версия исправила баги с полосами. |
| SwinIR (Swin2SR) | Старые фильмы, VHS, текстуры с pattern | 8-12 GB | Практически не галлюцинирует на текст. Требует tile осторожно. |
| Real-CUGAN (anime) | Аниме, арт, плоские заливки | 3-5 GB | Не размывает линии. Игнорирует шум — иногда это плюс. |
| GFPGAN / CodeFormer | Только лица (реставрация) | 2-4 GB | Никогда не применяйте на весь кадр — только на боксы лиц. |
Лично я для 90% видео беру Real-ESRGAN 4x+ и меняю denoise strength от 0.1 до 0.3. Для старых плёнок — SwinIR, но с tile=160 и overlap=32, иначе память отвалится. Помните: один проход с хорошей моделью лучше, чем два прохода с говном.
⚠️ Грабли: не ставьте scale factor больше 2 за раз. Если нужно 720p -> 1080p (x1.5), лучше сделайте x2, а потом вручную ресайз до 1080p. Иначе модель нарисует галлюцинации.
Контринтуитивные настройки: о которых молчат туториалы
1 Tile size — не ставьте 512, если не хотите шахматной доски
Большой tile уменьшает количество чанков и даёт более детальный результат, но артефакты на стыках становятся заметнее. Оптимум для 1080p — tile=256, overlap=32. Если видите полосы на стыках — уменьшайте tile до 192 или увеличьте overlap до 48.
2 Denoise strength — враг скрытых деталей
Real-ESRGAN имеет встроенный denoise. Многие выкручивают его на 0.5, чтобы убить шум. В результате — пластиковые лица и потеря текстуры кожи. Правило: шумный исходник — 0.2, чистый — 0.05. И никогда не включайте denoise для аниме — Real-CUGAN справится лучше.
3 FP16 vs FP32 — скорость или точность?
FP16 даёт прирост скорости 40-50%, но на тёмных сценах возможны цветные полосы (banding). Если исходник темный и с градиентами — используйте FP32. Для аниме и ярких сцен — смело жмите FP16.
Предобработка: как не убить лица и текст
Апскейл видео — это не просто скормить кадры нейросети. Пропустите этап очистки — и получите дёргающийся шум на фоне, плывущие лица, мерцание текста.
- Стабилизируйте видео перед апскейлом. Любая тряска усилит артефакты. Используйте VidToStab или FFmpeg + deshake.
- Удалите чересстрочность (deinterlace), если исходник interlaced. Yadif или bwdif — обязательно перед апскейлом.
- Почините цвет — если исходник с ужасным цветовым балансом, нейросеть закрепит этот ужас. Быстрая цветокоррекция через ffmpeg или lut.
- Нормализуйте яркость — контрастные перепады заставят модель выдумывать детали в тенях.
Кстати, если вы восстанавливаете старую плёнку, стандартный denoise может убить текстуру плёнки. Правильный подход — использовать модели, обученные на физике дефектов. Отличный разбор этой темы есть в статье "Как я учил нейросеть физике дефектов пленки, а не просто размывать шум" — там показано, как сохранить зерно, убрав царапины.
Батч-процессинг и грабли с памятью
Когда вы гоните 10 000 кадров, каждая секунда экономии решает. Но большинство пайплайнов упираются в VRAM. Вот как я настраиваю chaiNNer (или свою сборку на базе Real-ESRGAN).
# Пример команды для Real-ESRGAN (один проход, tile=256, overlap=32)
realesrgan-ncnn-vulkan -i input_frames -o output_frames \
-m models/realesrgan-x4plus \
-s 2 -t 256 -x -f jpg -j 2:2:2
# Ключи:
# -s 2 - scale 2x (потом сжатие до 1080p)
# -t 256 - tile size
# -x — FP16 (для скорости)
# -j 2:2:2 — параллельные потоки (подберите под своё CPU)
⚠️ Грабли с памятью: если вы используете батч из нескольких фреймов, каждый кадр будет считаться независимо, но VRAM будет занята всеми сразу. Уменьшайте batch size до 1, если падаете в OOM. Лучше 1 кадр быстро, чем 2 кадра с аут-оф-мемори.
Сначала даунскейл? Парадоксальный приём
Звучит безумно, но иногда перед апскейлом 720p стоит сначала уменьшить до 540p, а потом апскейлить до 1080p. Зачем? Если исходник очень шумный, нейросеть, работающая на большом разрешении, будет усиливать шум. Даунскейл убивает высокочастотный шум, модель угадывает структуру, а второй апскейл доводит до 1080p. Тестировал на VHS-рипе — результат значительно чище, чем прямой апскейл 720p->1080p.
Этот трюк работает только для очень грязных исходников. Для нормального 720p — не надо, потеряете детали.
Лица: отдельная песня
Глаза и рты — самые сложные объекты. Нейросеть дорисовывает зубы там, где их нет, меняет выражения лиц. Если в видео много крупных планов — используйте CodeFormer или GFPGAN, но с детекцией лиц. Принцип: прогнать кадр через Real-ESRGAN, потом найти лица (MTCNN или RetinaFace), вырезать, апскейлить через GFPGAN, вклеить обратно. По ссылке есть отличный анализ того, как модели галлюцинируют лица — "RepE: Как хакнуть активации нейросети и заставить её меньше галлюцинировать". Оттуда можно почерпнуть идеи, как подавлять фантомные детали.
# Пример среза лица через OpenCV (упрощённо)
import cv2
image = cv2.imread('frame.jpg')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
face = image[y:y+h, x:x+w]
# отправить face в GFPGAN
# потом заменить область на кадре
Баги: если лицо повёрнуто, детекция может не сработать. Используйте RetinaFace (надёжнее).
Как избежать пластикового эффекта
Типичная жалоба: после апскейла лица становятся как у куклы Барби. Это из-за слишком сильного denoise и / или использования GFPGAN с дефолтными настройками. Советы:
- В GFPGAN уменьшайте
strengthдо 0.5-0.7 (не 1.0). - Не обрабатывайте лица на каждом кадре — раз в 2-3 секунды, а промежуточные интерполируйте, иначе будет мерцание.
- Используйте CodeFormer с
codebook_weight=0.5— он более аккуратный. - Попробуйте вообще не использовать восстановление лиц, если исходник не ужасный. Часто Real-ESRGAN вытягивает лица достаточно хорошо.
Финальный совет: смотрите на кадры, а не на цифры
Я перестал гнаться за PSNR и SSIM. Лучший инструмент оценки — ваши глаза. Сделайте тестовый проход на 30-60 секундах, пролистайте ключевые сцены в быстром превью (достаточно 2-3 fps). Если заметили хоть один кадр с артефактом — возвращайтесь к настройкам.
Самый недооценённый параметр — denoise strength на уровне 0.2. Поставьте его, и картинка перестанет быть мыльной. И никогда не используйте GFPGAN на каждом кадре — вставьте его только для ключевых лиц, а остальное интерполируйте. Экономия времени — в 10 раз, качество то же.