rlaphoenix / VSGAN

PyTorch-based Super-Resolution and Restoration Image Processing Module for VapourSynth
https://vsgan.phoeniix.dev
MIT License
190 stars 13 forks source link

Interpolated models via chaiNNer fail in VSGAN #35

Closed Selur closed 1 year ago

Selur commented 1 year ago

Interpolating two models that are compatible with VSGAN:

rlaphoenix commented 1 year ago

Those are SRVGGNetCompact models that are not currently supported in VSGAN. These are not ESRGAN models. SRVGGNetCompact aka just Compact are RealESRGAN (v2) models. While the ESRGAN class supports RealESRGAN models, it only supports RealESRGAN v1 models, not v2 models. v1 models use RRDBNet while v2 models use SRVGGNetCompact.

The issue you're having is effectively an early panic when trying to use the model during loading. The use of interpolation wouldn't have caused this. However, the fact you stated that as-is, without interpolation, that they are compatible is quite strange.

Selur commented 1 year ago

Yes, both models: 2x_Futsuu_Anime_Compact_130k_net_g.zip work fine in VSGAN. (which is why I hoped that the 'mixed' model would work too ;))

rlaphoenix commented 1 year ago

Hi, bit of an update. I misread and misremembered my own codebase... lol. RealESRGAN v1 and v2 models are in fact supported, hence why it does not fail when using them individually.

Why the interpolated model is failing is likely because the params/params_ema nest key is not actually used when saving from chaiNNer. I made a potential fix in the latest commit. If you could give it a try that would be great.

Selur commented 1 year ago

I replaced the Vapoursynth\Lib\site-packages\vsgan in my setup with latest code: Loading the combi model works now! :) Thanks!

Selur commented 1 year ago

Using this version, combi models work fine, but some other models now produce wrong colors.

# Imports
import vapoursynth as vs
import os
import sys
# getting Vapoursynth core
core = vs.core
# Import scripts folder
scriptPath = 'i:/Hybrid/64bit/vsscripts'
sys.path.insert(0, os.path.abspath(scriptPath))
# Loading Plugins
core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/Support/fmtconv.dll")
core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/SourceFilter/LSmashSource/vslsmashsource.dll")
# Import scripts
import mvsfunc
# source: 'G:\TestClips&Co\test.avi'
# current color space: YUV420P8, bit depth: 8, resolution: 640x352, fps: 25, color matrix: 470bg, yuv luminance scale: limited, scanorder: progressive
# Loading G:\TestClips&Co\test.avi using LWLibavSource
clip = core.lsmas.LWLibavSource(source="G:/TestClips&Co/test.avi", format="YUV420P8", stream_index=0, cache=0, prefer_hw=0)
# Setting detected color matrix (470bg).
clip = core.std.SetFrameProps(clip, _Matrix=5)
# Setting color transfer info (470bg), when it is not set
clip = clip if not core.text.FrameProps(clip,'_Transfer') else core.std.SetFrameProps(clip, _Transfer=5)
# Setting color primaries info (), when it is not set
clip = clip if not core.text.FrameProps(clip,'_Primaries') else core.std.SetFrameProps(clip, _Primaries=5)
# Setting color range to TV (limited) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=1)
# making sure frame rate is set to 25
clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1)
clip = core.std.SetFrameProp(clip=clip, prop="_FieldBased", intval=0) # progressive
# changing range from limited to full range
clip = core.resize.Bicubic(clip, range_in_s="limited", range_s="full")
# Setting color range to PC (full) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=0)
# adjusting color space from YUV420P8 to RGBH for vsVSGAN
clip = core.resize.Bicubic(clip=clip, format=vs.RGBH, matrix_in_s="470bg", range_s="full")
# resizing using VSGAN
from vsgan import ESRGAN
vsgan = ESRGAN(clip=clip,device="cuda")
model = "I:/Hybrid/64bit/vsgan_models/4x_BSRGAN.pth"
vsgan.load(model)
vsgan.apply() # 2560x1408
clip = vsgan.clip
# resizing 2560x1408 to 1280x704
# changing range from full to limited range
clip = core.resize.Bicubic(clip, range_in_s="full", range_s="limited")
# Setting color range to TV (limited) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=1)
# adjusting resizing
clip = core.resize.Bicubic(clip=clip, format=vs.RGBS, range_s="limited")
clip = core.fmtc.resample(clip=clip, w=1280, h=704, kernel="lanczos", interlaced=False, interlacedd=False)
# adjusting output color from: RGBS to YUV420P10 for NVEncModel
clip = core.resize.Bicubic(clip=clip, format=vs.YUV420P10, matrix_s="470bg", range_s="limited", dither_type="error_diffusion")
# set output frame rate to 25fps (progressive)
clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1)
# Output
clip.set_output()

using the same model with the old version worked fine. uploaded the model to GoogleDrive

Selur commented 1 year ago

Okay, seems like something was still stuck in vram, after a reboot it's working this morning. Sorry, for the trouble, and thanks again for the fix.

Selur commented 1 year ago

Sorry, still broken, I just forgot that I did reset the vsgan files yesterday before going to bed.

rlaphoenix commented 1 year ago

So with the same exact code, apart from the version of VS, the colors change? Could I see? This isn't really something that could be caused by VSGAN, but could be caused by the model during training. I.e., LR as bt601 and HR as bt709, causing it to convert colors, even if your new LR is bt709, it will still map the colors the same way.

Selur commented 1 year ago

Yes, using:

# Imports
import vapoursynth as vs
import os
import sys
# getting Vapoursynth core
core = vs.core
# Import scripts folder
scriptPath = 'i:/Hybrid/64bit/vsscripts'
sys.path.insert(0, os.path.abspath(scriptPath))
# Loading Plugins
core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/Support/fmtconv.dll")
core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/SourceFilter/LSmashSource/vslsmashsource.dll")
# Import scripts
import mvsfunc
# source: 'G:\TestClips&Co\test.avi'
# current color space: YUV420P8, bit depth: 8, resolution: 640x352, fps: 25, color matrix: 470bg, yuv luminance scale: limited, scanorder: progressive
# Loading G:\TestClips&Co\test.avi using LWLibavSource
clip = core.lsmas.LWLibavSource(source="G:/TestClips&Co/test.avi", format="YUV420P8", stream_index=0, cache=0, prefer_hw=0)
# Setting detected color matrix (470bg).
clip = core.std.SetFrameProps(clip, _Matrix=5)
# Setting color transfer info (470bg), when it is not set
clip = clip if not core.text.FrameProps(clip,'_Transfer') else core.std.SetFrameProps(clip, _Transfer=5)
# Setting color primaries info (), when it is not set
clip = clip if not core.text.FrameProps(clip,'_Primaries') else core.std.SetFrameProps(clip, _Primaries=5)
# Setting color range to TV (limited) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=1)
# making sure frame rate is set to 25
clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1)
clip = core.std.SetFrameProp(clip=clip, prop="_FieldBased", intval=0) # progressive
# changing range from limited to full range
clip = core.resize.Bicubic(clip, range_in_s="limited", range_s="full")
# Setting color range to PC (full) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=0)
# adjusting color space from YUV420P8 to RGBS for vsVSGAN
clip = core.resize.Bicubic(clip=clip, format=vs.RGBS, matrix_in_s="470bg", range_s="full")
# resizing using VSGAN
from vsgan import ESRGAN
vsgan = ESRGAN(clip=clip,device="cuda")
model = "I:/Hybrid/64bit/vsgan_models/4x_BSRGAN.pth"
vsgan.load(model)
vsgan.apply() # 2560x1408
clip = vsgan.clip
# resizing 2560x1408 to 640x352
# changing range from full to limited range
clip = core.resize.Bicubic(clip, range_in_s="full", range_s="limited")
# Setting color range to TV (limited) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=1)
# adjusting resizing
clip = core.fmtc.resample(clip=clip, w=640, h=352, kernel="lanczos", interlaced=False, interlacedd=False)
# adjusting output color from: RGBS to YUV420P10 for NVEncModel
clip = core.resize.Bicubic(clip=clip, format=vs.YUV420P10, matrix_s="470bg", range_s="limited", dither_type="error_diffusion")
# set output frame rate to 25fps (progressive)
clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1)
# Output
clip.set_output()

I get: new exchanging the vsgan folder with the old version, I get: old

Selur commented 1 year ago

When using 1x_DIV2K-Lite_450k.zip: old: old2 new: new2

These are not bt601 vs bt709 issues. There are a few other models which now have this issue.

rlaphoenix commented 1 year ago

Ok yeah that's definitely not right. When you say "old", how far back did you go? The latest stable release? I will look into this myself very soon and test with that exact model and see what happens.

Selur commented 1 year ago

Yes, the last stable version (vsgan-1.6.4.dist-info). test.zip is the source file I used for testing.

rlaphoenix commented 1 year ago

Very strangely the issue is caused from changing the casing of variables in the RRDB block definition... I have no idea why.

image

Selur commented 1 year ago

Okay,.. that is strange.

Selur commented 1 year ago

I can confirm, after changing those lines, it works here too.

rlaphoenix commented 1 year ago

I'm gonna close this issue since we have it fixed (but don't know for what reason) but the color issue was also unrelated in the end anyway. Feel free to open another issue if needed.