跳转至

Anime Super Resolution to 4K & Interpolation to 120 fps

导言

对于一些百看不厌的剧集,由于IPAD屏幕是120Hz 2k屏幕。尝试超分和插帧

前期调研

Windows: Waifu2x-Extension-GUI

以15s为间隔,插帧与放大交替进行。

测试(免费版+付费版)

设备 原视频参数时长 模式 插帧与放大时间/15s 预估时间
RTX3070 1080p 60fps 16mins (977s) 默认放大补帧 - 超级质量档 (Real-CUGAN+RIFE) 14h
RTX3070 1080p 60fps 16mins (977s) 默认放大补帧 - 质量档 (Waifu2x+RIFE) 1min+3min 4h 46min
RTX3070 1080p 60fps 16mins (977s) 默认放大补帧 - 快速档 (Anime4K+RIFE) 1min+1min 2h 29min
RTX3070 1080p 60fps 16mins (977s) 默认仅插帧(RIFE) 1min 54min
RTX3070 720p 24fps 17mins 200MB 默认仅放大( x2 ) - 快速档 (Anime4K) 14min
RTX3070 720p 24fps 17mins 200MB (高级版)仅放大补帧(1440p 120fps) - 快速档 1h 50min
RTX3070 1080p 24fps 23mins 300MB (高级版)仅放大补帧(1440p 120fps) - 快速档 5h 30min (可能是程序竞争导致的)
RTX3070 1080p 30fps 19mins 360MB (高级版)仅放大补帧(1440p 120fps) - 快速档 3h 20min
RTX3070 1080p 60fps 29mins 522MB (高级版)仅放大补帧(1440p 120fps) - 快速档 3h 40min
RTX3070 540p 30fps 34mins 312MB (3D) (高级版)仅放大补帧(1440p 120fps) - 快速档 16h 10min (3D确实慢)

推荐:付费高级版

  1. 优势:
    1. 毕业后就无法白嫖实验室机器了,白嫖公司的机器是十分危险的行为。 1. 实验室的local Disk容量也有限。导致Waifu2x-Extension-GUI超分后的反而跑不了
    2. 极大的简化了工作流: 1. 视频源简化:Hanime的视频源不说是最高质量的,也是第一梯队的。免去了去BT找raw视频的过程 2. 免去字幕工作:Hanime视频源自带硬字幕 3. 免去了补帧和超分的脚本开发和维护
  2. 劣势:
    1. 需要用自己的电脑,可能影响工作时电脑的性能,并产生噪音。
    2. 高级版是和电脑绑定的,并不是终身制的。

先放大再插帧的策略

  1. 放大是比较耗时的,但是插帧较慢。先放大再插帧,可以减小放大的工作量,来实现总时间最短。
  2. 插帧是为了让视频更丝滑,所以应该是最后一步。因为最后放大可能导致帧之间的线条不连贯。

算法比较

超分辨率算法比较

算法 特点 GUI 平台 效果 速度
Bilibili Real-CUGAN 效果最好,特别是老番 Win Win/Py Best x2.2
Anime4K 速度最快,1080P特化 Win/Py Good x44
Real-ESRGAN 最锐化,配色都会变 Strange Baseline

Waifu2x完全是Real-CUGAN的子集,速度差不多,但是效果没特色。

插帧算法比较

2

可以看到Y轴的效果还是比较接近的,但是IFRNet 和 RIFE速度很快。RIFE是DAIN速度的10-25倍

Windows :Anime4k 实时

通过对视频播放流程的配置,在对应平台播放视频时,会调用Anime4k的着色器来实现实时的UpScaling播放。 Anime4k默认是不支持也不建议转换成4k视频保存的(因为这并没有增加信息熵。)

No need to config on Screenless Linux Server
  1. Download and set input.conf mpv.conf shaders
  2. Move the input.conf, mpv.conf and the shaders folder into the into the %LOCALAPPDATA%\Plex
    sudo apt install mpv
    git clone https://github.com/bloc97/Anime4K.git
    cd Anime4K
    mkdir -p ~/.config/mpv
    cp md/Template/GLSL_Mac_Linux_High-end/input.conf ~/.config/mpv/input.conf
    cp md/Template/GLSL_Mac_Linux_High-end/mpv.conf ~/.config/mpv/mpv.conf
    cd  ~/.config/mpv
    wget https://github.com/Tama47/Anime4K/releases/download/v4.0.1/GLSL_Mac_Linux_High-end.zip
    unzip GLSL_Mac_Linux_High-end.zip
    

对于Windows,Anime4k提供了mpv跨平台视频播放器 和 Plex播放器 的教程,但是并没有jellyfin6 和 Plex Media Server 相关的支持。

但是如何你是用PC在网页端播放jelly分,可以使用jellyfin-mpv-shim来接入Anime4K

  1. jellyfin-mpv-shim和mpv安装好,设置登录信息,网页端就可以选择投影到 jellyfin-mpv-shim。之后的视频播放就被MPV接管。7
  2. 为了MPV支持Anime4K, 还是需要按照Anime4K配置, 移动到C:\Users\Administrator\AppData\Roaming\jellyfin-mpv-shim目录下,但是mpv里按快捷键Ctrl+1报错
2024-01-26 22:58:11,698 [ WARNING] mpv: vo/gpu: User-specified FBO format 'rgba16f' failed to initialize! (exists=0, renderable=0, linear_filter=0, fbo_test_result=0)

2024-01-26 22:58:11,698 [ WARNING] mpv: vo/gpu: High bit depth FBOs unsupported. Enabling dumb mode.

2024-01-26 22:58:11,698 [ WARNING] mpv: vo/gpu: Most extended features will be disabled.

Movie drag to MPV

根据资料, Shift+i next 2 确实看见Anime4k在渲染。这似乎验证这生效了。 但是视频的分辨率并没有Upscale*2, 还是1080p

Linux 部署

  1. 如果是有GUI的linux,可以使用 REAL-Video-Enhancer
  2. Anime4K + Real-CUGAN 包含在 Docker/CLI video2x
  3. 先尝试 Anime4K + ifrnet-ncnn-vulkan 的命令行实现。

Install Vulkan SDK

wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo tee /etc/apt/trusted.gpg.d/lunarg.asc
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.3.275-jammy.list https://packages.lunarg.com/vulkan/1.3.275/lunarg-vulkan-1.3.275-jammy.list
sudo apt update
sudo apt install vulkan-sdk

4

Shit: video2x CLI
# Install ffmpeg
sudo apt-get install ffmpeg
# Install video2x
git clone https://github.com/k4yt3x/video2x.git
cd video2x
conda create --name video2x python=3.9
conda activate video2x
pip install .
# Left Modules
pip install anime4k_python

阅读代码,可见如下选项

video2x/__main__.py
# algorithms available for upscaling tasks
UPSCALING_ALGORITHMS = ["waifu2x", "srmd", "realsr", "realcugan", "anime4k"]

# algorithms available for frame interpolation tasks
INTERPOLATION_ALGORITHMS = ["rife"]
  • 进程10个,超分辨率算法anime4k
  • IPAD 1668 x 2388
  • 2K resolution 2560 x 1440
python -m video2x -i input.mp4 -o output.mp4 -p10 upscale -h 1440 -a anime4k -n3
  • Problem 1 : pip install realcugan_ncnn_vulkan_python FAILURE
    • A100 不支持 Vulkan,realcugan_ncnn_vulkan_python无法安装使用。
  • Problem 2 : AttributeError: module 'ffmpeg' has no attribute 'probe'
python -m video2x -i input.mp4 -o output.mp4 -p10 interpolate -a rife

???: AttributeError: module 'ffmpeg' has no attribute 'probe'

插帧:ifrnet-ncnn-vulkan

# extract audio: 1s for origin 16mins mp4
ffmpeg -i input.mp4 -vn -acodec copy audio.m4a

mkdir input_frames

# decode all frames: 3min30s for origin 16mins mp4
ffmpeg -i input.mp4 input_frames/frame_%08d.png

# You should install vulkan SDK : 70pic/2s, Total 57min27s for origin 16mins mp4
./ifrnet-ncnn-vulkan -i ../input_frames -o output_frames -g -1,-1,0,1 -j 8:4,4,2,2:8

# encode interpolated frames in 120fps with audio, can not use A100 but using 15 CPU threads. Total 15min13s for origin 16mins mp4
ffmpeg -framerate 120 -i output_frames/%08d.png -i audio.m4a -c:a copy -crf 18 -c:v libx264 -pix_fmt yuv420p output.mp4
  • load:proc:save = 8:4,4,2,2:8意味着中间proc 4、4、2、2分别在两个CPU和GPU0,GPU1上。这样能100%利用A100.
  • 速度: 两块A100比一块3070还慢。Total 75mins
  • 空间:没有实现分段处理,对Disk压力非常大。
作品 视频初始参数 耗时(decode+插帧+encode) 临时空间(没有实现分段生成和删除)
黑兽4 (A100*2) 1080p 24fps 2GB 977s + 15125s + 2329s = 5.11h 610GB
黑兽4 (4090*2) 1080p 24fps 2GB 1092s + 8797s + 2962s = 3.57h 610GB
牝性 (A100*2) 1080p 24fps 265MB 82s + 10350s + 1266s = 3.25h 286GB

在这里 4090 的速度是 A100 的 15125/8797=1.72

mp4 脚本
allInOne.sh
#!/bin/bash

# Input MP4 file
input_mp4="$1"

# Extract filename without extension for the directory name
filename=$(basename "$input_mp4" .mp4)

# Create a timestamped directory including the filename
timestamp="${filename}_$(date +%Y%m%d%H%M%S)"
mkdir -p "$timestamp"
cd "$timestamp"

# Record start time
start_time=$(date +%s)

# Extract audio
echo "Extracting audio..."
ffmpeg -i "../$input_mp4" -vn -acodec copy audio.m4a

# Log time taken
end_time=$(date +%s)
echo "Extract audio: $((end_time - start_time)) seconds" >> times.log

# Decode all frames
echo "Decoding frames..."
start_time=$(date +%s)
mkdir input_frames
ffmpeg -i "../$input_mp4" input_frames/frame_%08d.png

# Log time taken
end_time=$(date +%s)
echo "Decode frames: $((end_time - start_time)) seconds" >> times.log

# Get original frame rate
fps=$(ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "../$input_mp4" | bc)

# Count the number of decoded frames
frame_count=$(ls input_frames | wc -l)

# Calculate the number of frames needed for 120fps based on the original frame rate
num_frames_needed=$((frame_count * 120 / fps))

# Run ifrnet-ncnn-vulkan with calculated frame number
echo "Running ifrnet-ncnn-vulkan..."
start_time=$(date +%s)
mkdir output_frames
./ifrnet-ncnn-vulkan -i input_frames -o output_frames -g -1,-1,0,1 -j 8:4,4,2,2:8 -n "$num_frames_needed"

# Log time taken
end_time=$(date +%s)
echo "ifrnet-ncnn-vulkan: $((end_time - start_time)) seconds" >> times.log

# Encode interpolated frames
echo "Encoding video..."
start_time=$(date +%s)
ffmpeg -framerate 120 -i output_frames/%08d.png -i audio.m4a -c:a copy -crf 18 -c:v libx264 -pix_fmt yuv420p output.mp4

# Log time taken
end_time=$(date +%s)
echo "Encode video: $((end_time - start_time)) seconds" >> times.log

# Return to the original directory
cd ..

echo "All operations completed. Time log is in the $timestamp/times.log file."
mkv 脚本

Please read code

# check during time
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 output.mp4
980.736000
# check fps
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 output.mp4
120/1

超分:realcugan-ncnn-vulkan

time realcugan-ncnn-vulkan.exe -i input_frames -o output_frames -s 2 -n 1 -x -g -1,-1,0,1 -j 8:4,4,2,2:8
  • CPU decode异常慢, 导致A100大部分时间在等待。奇怪的是增大decode的线程,htop里观察并不会提升CPU的使用率。5
  • 整个程序的瓶颈在单核CPU的睿频。

速度

  • 1080p 一分钟才8帧。16mins 60fps 58000fps需要120h, 也就是5天。难以接受
  • 720p 大约一秒2帧。16mins 24fps 23000fps需要3.2h 远远比不上 Waifu2x-Extension-GUI 的14min

Speedup: 挂载内存盘加速

服务器是大内存,但是机械盘。我自己电脑是固态。但是GPU跑满了,估计也没瓶颈。

参考文献

评论