Как мы Evangelion улучшали

К нам, в Московский авиационный институт (на факультет информационных технологий и прикладной математики), привезли новый сервер с GPU A100x8 и 2TB RAM.

Первым делом мы решили его потестить. Под конец года заниматься чем-то серьёзным не очень хотелось, поэтому нагрузили оборудование задачей Enhancement (улучшает изображение, видео, звук).

Как мы Evangelion улучшали

Для апгрейда взяли Neon Genesis Evangelion (1995-1996): нашли DVD-образ, перенесли его в цифровой формат .mkv.

Оригинальное разрешение картинки 704x480, кадры сильно зашумлены, нет чёткости линий (как в современных аниме), иногда проступают белые точки/полосы от процесса съемки кадров.

В сети можно найти версии в 1080p, но это то же 480р, просто растянутое
В сети можно найти версии в 1080p, но это то же 480р, просто растянутое

Результат нашей работы — видео в формате 4К (2560x1080). Хотя и не без минусов (белые артефакты из-за при процесса съемки аниме никуда не исчезли), но всё равно круто.

В общей сложности мы обработали 26 серий и фильм End Of Evangelion. Выпускать будем постепенно, согласно этому расписанию:

  • 1 января — 1-6 серия;
  • 2 января — 6-12 серия;
  • 3 января — 12-18 серия;
  • 4 января — 18-24 серия;
  • 5 января — 24-26 серия;
  • 6 января — The End Of Evangelion.

Уведомления о новых сериях мы публикуем на нашем канале в Telegram.

А теперь я подробнее расскажу про нейронную сеть, которую мы использовали, и приведу примеры кодеса с пояснениями что там и как.

Real-ESRGAN

Главный инструмент всего процесса — Real-ESRGAN (Real Enhanced Super-Resolution Generative Adversarial Network)[Paper, GitHub].

Задача GAN — генерировать ненастоящие данные, которые выглядят очень реалистично. Типовая архитектура GAN содержит две сети: генератор и дискриминатора.

Задача генератора создать ненастоящие данные, а дискриминатора — отличить, где настоящие, а где ненастоящие. Тем самым дискриминатор помогает генератору создавать более реалистичные данные.

Как мы Evangelion улучшали

В чем отличие Real-ESRGAN от просто ESRGAN? В том, что обучение происходит на чистых синтетических данных, а в качестве дискриминатора используется U-Net со спектральной нормализацией.

Синтетические данные

Как мы Evangelion улучшали

При создании обучающего набора используются всевозможные варианты размытия, методы сжатия JPG, изменения размера, шума.

Как мы Evangelion улучшали

После того, как собрали данные, сеть ERSGAN приступает обучаться на разных масштабах увеличения изображения (x1, x2, x4)

Использование U-net

Как мы Evangelion улучшали

U-Net со спектральной нормализацией необходима для стабилизации динамики обучения, также она помогает смягчать чрезмерно острые артефакты изображения, появившиеся при обучении. С помощью U-Net удалось найти баланс между улучшением локальных мест на изображении и подавлением артефактов.

Кодес (с пояснением)

Собственно, теория — это круто, но как добиться результатов на своих данных?

Первым делом надо клонировать репозиторий с Real-ESRGAN.

Откроем терминал, создадим виртуальное окружение, активируем его, поставим все пакеты, что требует репозиторий, и установим сам realesrgan:

git clone https://github.com/xinntao/Real-ESRGAN.git cd Real-ESRGAN virtualenv venv source venv/bin/activate pip install -r requirements.txt pip install tqdm python setup.py develop

Ещё для удобной работы стоит добавить и запустить Jupyter Notebook:

pip install jupyter notebook jupyter notebook

Создадим ipynb и начнём. Импортируем основные библиотеки:

import torch from basicsr.archs.rrdbnet_arch import RRDBNet from basicsr.utils.logger import AvgTimer from tqdm import tqdm from realesrgan import IOConsumer, PrefetchReader, RealESRGANer from realesrgan.archs.srvgg_arch import SRVGGNetCompact

Загрузим нужную нам обученную сеть, список можно найти тут:

!wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.3.0/RealESRGANv2-animevideo-xsx4.pth -P experiments/pretrained_models​

Далее указываем параметры для сети (данные параметры только для RealESRGANv2-animevideo-xsx4):

model_name = "RealESRGANv2-animevideo-xsx4" model_path = os.path.join('experiments/pretrained_models', model_name + '.pth') model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=16, upscale=4, act_type='prelu') netscale = 4 outscale=4 tile = 0 tile_pad = 10 pre_pad = 0 half= False upsampler = RealESRGANer( scale=netscale, model_path=model_path, model=model, tile=tile, tile_pad=tile_pad, pre_pad=pre_pad, half=half)

Мы указали параметры для сети, теперь необходимо указать видео. Укажите полный (или относительно папки в которую клонировали репозиторий) путь к файлу.

Поставим библиотеку для работы с видео:

!pip install scikit-video
import skvideo.io siries = "Evangelion.(10.serij.iz.26).1995-1996.x264.DVDRip.mkv"

Видео загрузили, теперь посмотрим что с его параметрами:

metadata = skvideo.io.ffprobe(f"./NeonEvangelion/{siries}") fps = float(metadata["video"]['@r_frame_rate'].split('/')[0])/1001 print("Частота кадров:", fps)

Вот тут может быть проблема, так как не во всех видео единый формат, тут пришлось поделить на 1001, так как указанная частота 23976/1001:

frame_width = int(metadata['video']["@width"]) frame_height = int(metadata['video']["@height"]) print("Разрешение видео:", frame_width, "x", frame_height)

Грузим наш видос:

videodata = skvideo.io.vread(f"./NeonEvangelion/{siries}") frame_count = videodata.shape[0] print('Количестов кадров:', frame_count) # float `frame_count` print('Длительность видео (сек):', frame_count/fps) # float `frame_count`

Смотрим как сильно апскейлится наше видео:

output, _ = upsampler.enhance(videodata[0], outscale=outscale) height = output.shape[0] width = output.shape[1] print("Выходное разрешение видео:", width, "x", height)

Создадим метод для записи видео:

crf = 17 writer = skvideo.io.FFmpegWriter('Magmadiver.mp4', inputdict={'-r': str(fps), '-s':'{}x{}'.format(width,height)}, outputdict={'-r': str(fps), '-c:v': 'libx264', '-crf': str(crf), '-preset': 'veryslow', '-pix_fmt': 'yuv444p'} )

И начнём покадрово обрабатывать и записывать видео:

for frame in tqdm(videodata): output, _ = upsampler.enhance(frame, outscale=outscale) writer.writeFrame(output) torch.cuda.synchronize() writer.close()

Теперь, если был звук в видео, надо его как-то вытащить. Поможет с этим ffmpeg. Сохраним его в отдельный mp3-файл:

!ffmpeg -i "./NeonEvangelion/Evangelion.(10.serij.iz.26).1995-1996.x264.DVDRip.mkv" "Magmadiver.mp3"

И потом возьмём созданное видео и добавим в него звук:

!ffmpeg -i "Magmadiver.mp4" -i "Magmadiver.mp3" -c copy -map 0:v:0 -map 1:a:0 "10.Magmadiver.mp4"

Всё! Спустя 1 час 30 минут очередная серия Evangelion обработана.

Colab

Ну, а если вам в падлу разбираться с кодом, и вы хотите просто посмотреть на качество улучшения, всегда можете воспользоваться Colab:

А ещё совсем недавно выложили portable-версии:

Играйтесь, улучшайте аниме и кидайте свои результаты в комментарии и подписывайтесь на наш Telegram-канал, там мы чаще делимся своими экспериментами и новостями.

618618
192 комментария

Обожаю современных ученых.
- Эй нам привезли суперкомпьютер
- Давай переведем Евангелион в 4к.

356
Ответить

полезай в ебаный компьютер

235
Ответить

Классика!

168
Ответить

Комментарий недоступен

1
Ответить

Это не современные учёные, а все учёные. А что учёные не люди что-ли? Так ещё и доступ к дорогому оборудованию имеют, так что...

3
Ответить

Комментарий недоступен

47
Ответить

Синдром утенка какой-то. Ламповость - понятие субъективное конечно, но сейчас, когда у многих 4к телевизоры или даже мониторы смотреть 480р больно. Если хочется Ламповость сохранить, то это надо на элт мониторе ещё и желательно с VHS кассеты смотреть

192
Ответить