Anime Super Resolution to 4K & Interpolation to 120 fps
导言
对于一些百看不厌的剧集,由于IPAD屏幕是120Hz 2k屏幕。尝试超分和插帧
前期调研¶
- 超分辨率
- Bilibili Real-CUGAN
- Anime4K 17.4k star
- waifu2x 27k star
- GUI + Docker/Linux/Windows video2x 8.2k star
- 插帧 Interframe/interpolation
- Video frame interpolation algorithms: RIFE / CAIN / DAIN / IFRNet
- Flowframes - Windows GUI for Video Interpolation
- SmoothVideo Project
- staxrip video tool
- Both:
- Windows Waifu2x-Extension-GUI
- 4090 is very fast in this regard. It takes about 6 hours or so for a film that is 1.5 hours. 1
Real Cugan
AI Model since I found it yields the best results in terms of speed and quality.
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. 实验室的local Disk容量也有限。导致Waifu2x-Extension-GUI超分后的反而跑不了
- 极大的简化了工作流: 1. 视频源简化:Hanime的视频源不说是最高质量的,也是第一梯队的。免去了去BT找raw视频的过程 2. 免去字幕工作:Hanime视频源自带硬字幕 3. 免去了补帧和超分的脚本开发和维护
- 劣势:
- 需要用自己的电脑,可能影响工作时电脑的性能,并产生噪音。
- 高级版是和电脑绑定的,并不是终身制的。
先放大再插帧的策略¶
- 放大是比较耗时的,但是插帧较慢。先放大再插帧,可以减小放大的工作量,来实现总时间最短。
- 插帧是为了让视频更丝滑,所以应该是最后一步。因为最后放大可能导致帧之间的线条不连贯。
算法比较¶
超分辨率算法比较¶
算法 | 特点 | GUI | 平台 | 效果 | 速度 |
---|---|---|---|---|---|
Bilibili Real-CUGAN | 效果最好,特别是老番 | Win | Win/Py | Best | x2.2 |
Anime4K | 速度最快,1080P特化 | Win/Py | Good | x44 | |
Real-ESRGAN | 最锐化,配色都会变 | Strange | Baseline |
Waifu2x完全是Real-CUGAN的子集,速度差不多,但是效果没特色。
插帧算法比较¶
可以看到Y轴的效果还是比较接近的,但是IFRNet 和 RIFE速度很快。RIFE是DAIN速度的10-25倍
Windows :Anime4k 实时¶
通过对视频播放流程的配置,在对应平台播放视频时,会调用Anime4k的着色器来实现实时的UpScaling播放。 Anime4k默认是不支持也不建议转换成4k视频保存的(因为这并没有增加信息熵。)
No need to config on Screenless Linux Server
- Download and set
input.conf
mpv.conf
shaders
- Move the
input.conf
,mpv.conf
and theshaders
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
- jellyfin-mpv-shim和mpv安装好,设置登录信息,网页端就可以选择
投影到 jellyfin-mpv-shim
。之后的视频播放就被MPV接管。7 - 为了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 部署¶
- 如果是有GUI的linux,可以使用 REAL-Video-Enhancer
- Anime4K + Real-CUGAN 包含在 Docker/CLI video2x 里
- 先尝试 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
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
- Problem 1 : pip install realcugan_ncnn_vulkan_python FAILURE
- A100 不支持 Vulkan,realcugan_ncnn_vulkan_python无法安装使用。
- Problem 2 : AttributeError: module 'ffmpeg' has no attribute 'probe'
???: 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跑满了,估计也没瓶颈。