4K UHD Denoising mit FFT3DGPU,FFT3DFilter,neo_fft3d (Performance,Bugs,VapourSynth-Umsetzung,...)

  • Schade, wie gesagt es mangelt an performanten temporal GPU denoisern. Der etwas schnellere mode 2 in FFT3DGPU funktioniert mit 4K gar nicht, da bleibt immer ein Teil des Bildes schwarz... Und mode 0 neigt ja zur Artefaktbildung.

    Warum in VapourSynth laden, wenn man's direkt mit AviSynth nutzen kann?

    Laut deren linzenrechtlicher Bestimmungen ist der Filter für Privatgebrauch free, aber ich muss zugeben, dass ich von Lizenzrecht keine große Ahnung habe.

  • Vielleicht lohnt es sich ja doch fft3dgpu in VapourSynth einzubinden und der etwas schnellere aber qualitativ gute mode 2 läuft stabil @4K?!?

    Unter Avisynth bleiben da wie gesagt immer Teile des Frames schwarz. Vermutlich ist es ja nicht allzu aufwändig das zu bauen, wenn's bei Avisynth schon umgesetzt ist.

    Hätte auch den Vorteil, dass man fft3dgpu mit z.B. SSIMDownscaler kombinieren kann, der im Vergleich su Spline16/Lanczos zusätzlich Bitrate spart ohne an Schärfe einzubüßen wie gauss.

    Die ganzen superkomplexen und langsamen GPU noise Filter sind ja schön und gut um nervige Artefakte zu entfernen, aber wenn man damit in 1. Linie die Komprimierbarkeit verbessern will um 10-25% Bitrate zu sparen macht das keinen rechten Sinn. Wenn man dann nämlich die 2-3fache Zeit braucht oder eine 300W Grafikkarte voll auslasten muss (da braucht mein System beim encoding mit GPU insgesamt kaum mehr) ist das nicht besonders zielführend und man kann auch gleich statt x264 x265 verwenden oder irgendwelche getunten x264 veryslow presets nehmen um bitrate einzusparen.

    Edited once, last by mogobime (April 27, 2022 at 7:19 PM).

  • Weiß nicht, ob das jemandem was nutzen wird, aber bevor ich es wieder vergesse, schreib ich jetzt mal die bugs auf, die ich bei fft3dgpu mit 4K input mit Hilfe von Hybrid eingegrenzt habe:

    mode 0-2: precision >= 1 nötig, sonst Bildfehler

    mode 2: bw/bh < 64 grundsätzlich Bildfehler

    mode 0+2: bw/bh 256 benötigt precision = 2, sonst Bildfehler

    mode 0+2: bw/bh 512 grundsätzlich Bildfehler

    mode 1: bw/bh 512 benötigt precision = 2, sonst Bildfehler

    Wenn man in AviSynth+ SetMemoryMax nicht setzt, sieht man bei den defekten Einstellungen immer, dass mehr als 2048 MB RAM durch AVSPreview belegt wird, bei den funktionierenden settings ist das nie der Fall. Leider lässt sich der Fehler durch setzen von SetMemoryMax auf verschiedene Werte zwischen 768 und 2048 MB nicht beheben.

    Das legt zumindest den Verdacht nahe, dass es (auch) mit der manchmal problematischen Speicherverwaltung von AviSynth(+) einen Zusammenhang gibt.

    Eine Portierung nach Vapoursynth wäre damit wirklich nicht schlecht. Man könnte zusätzlich hoffen, dass das verbesserte Multithreading von VapourSynth zu besserer Performance bei 4K führen.

    LigH: Vielleicht motiviert es pinterf ja das durchzuziehen, wenn du ihm auch noch diesen bugreport postest. Falls du das für richtig und wichtig hältst natürlich.

  • Ich weiß jetzt nicht in wiefern man klar die "Schuld" zuweisen kann, wenn GPU-Funktionen betroffen sind. Zumindest kenne ich den Bedarf an VRAM für FFT3dGPU nicht. Aber wenn es nötig ist, Videoframes erst mal in den Grafikspeicher hochzuladen, dann hilft eine Erhöhung des Zugriffs auf normalen Arbeitsspeicher vielleicht wenig, wenn deine Grafikkarte zu wenig Grafikspeicher hat, um mehrere UHD-Videoframes aufzubewahren, die der Filter vielleicht von dort her verarbeitet.

  • Quote

    mogobime: Nur um sicher zu sein: Du verwendest auch 64bit Avisynth, oder?

    Ansonsten wäre das mit den 2GB nicht verwunderlich.

    Ja, ich verwende 64bit AviSynth und der Fehler lässt sich durch SetMemoryMax(3000), SetMemoryMax(2048) und SetMemoryMax(768) nicht beheben.

    Quote

    Ich weiß jetzt nicht in wiefern man klar die "Schuld" zuweisen kann, wenn GPU-Funktionen betroffen sind. Zumindest kenne ich den Bedarf an VRAM für FFT3dGPU nicht. Aber wenn es nötig ist, Videoframes erst mal in den Grafikspeicher hochzuladen, dann hilft eine Erhöhung des Zugriffs auf normalen Arbeitsspeicher vielleicht wenig, wenn deine Grafikkarte zu wenig Grafikspeicher hat, um mehrere UHD-Videoframes aufzubewahren, die der Filter vielleicht von dort her verarbeitet.

    Ich vermute das Problem liegt wenn dann (auch) in der Verwaltung des normalen RAMs, da sind mir Probleme bei AviSynth schon seit Ewigkeiten bekannt.

    Definitiv werden Probleme bei verschiedenen Konstellationen durch eine zu niedrige precision ausgelöst (16 bit floats statt 32bit).

    Die 4GB GDDR5 VRAM sind nach meinem dafürhalten ausreichend, ich überwache die Auslastung immer mit GPU-Z.

    Bei den mode / bw/hw Konstellationen die nicht buggy sind liegt die meistens unter 2GB.

    Mit einer Ausnahme. Hab mal einen Screenshot mit monitoring tools von der extremsten Einstellung FFT3DGPU(bw=512,bh=512,plane=4,mode=1,precision=2) gemacht, die ohne diese extreme Artefaktbildung im Bild (schwarze Streifen oder Raster, unteres Drittel des Bildes schwarz, Bildung von riesigen farbigen Klötzchen, manchmal scheint auch ein Teil der Farbinformationen komplett oder in einem Teil des Bildes komplett zu fehlen) funktioniert.

    Den höchsten Ausschlag, den ich da beim VRAM gesehen hab waren 3700 MB und das funktioniert wie gesagt ohne Artefaktbildung.

    Der zweite Screenshot zeigt die buggy Einstellung FFT3DGPU(bw=32,bh=32,plane=4,mode=2,bordersize=0,precision=1). VRAM Auslastung ist niedrig und trotzdem enstehen Bildfehler.

    Der dritte Screenshot zeigt FFT3DGPU(bw=512,bh=512,plane=4,mode=2,bordersize=0,precision=2), was ebenfalls buggy ist. VRAM Auslastung knapp über 2GB.

    Die explodierende Auslastung des normalen RAM bei buggy Einstellungen zeigt ffmpeg seltsamerweise nicht so konsequent wie avspreview, da sieht man immer sofort dass die RAM Auslastung explodiert, wenn was faul ist, bis hin zum Crash von AVSpreview...

  • Die GPU Version war glaube ich auch nie wirklich schneller, aber kenne auch nur die alte Version (die nicht pinterf version).

    Wenn ich nicht gerade mit 4K das AviSynth Multithreading und meine GPU ans Limit bringe und "nur" FullHD filtere, merke ich deutliche Unterschiede zwischen der GPU + CPU version.

    Die CPU Versionen lasten bei dem gewählten x264 preset die CPU zu ~40% aus, die GPU Version zu 6-7%. Bei einem schnelleren x264 preset würde der Unterschied wohl noch deutlicher ausfallen (verwende ein gemoddetes medium preset).

    FFT3DGPU(bw=64,bh=64,plane=4,mode=2,bordersize=1,precision=2)

    Code
    x264 [info]: SSIM Mean Y:0.9938238 (22.093db)
    x264 [info]: PSNR Mean Y:48.697 U:53.289 V:53.538 Avg:49.755 Global:49.209 kb/s:6038.39
    encoded 7737 frames, 14.20 fps, 6038.39 kb/s

    FFT3DGPU(bw=64,bh=64,plane=4,mode=1,precision=1)

    Code
    x264 [info]: SSIM Mean Y:0.9948006 (22.840db)
    x264 [info]: PSNR Mean Y:49.244 U:53.896 V:54.124 Avg:50.307 Global:49.717 kb/s:5819.58
    encoded 7737 frames, 14.25 fps, 5819.58 kb/s

    neo_fft3d.FFT3D(clip=clip, bw=64, bh=64)

    Code
    x264 [info]: SSIM Mean Y:0.9943188 (22.456db)
    x264 [info]: PSNR Mean Y:48.945 U:53.399 V:53.748 Avg:49.988 Global:49.409 kb/s:6099.00
    encoded 7737 frames, 10.08 fps, 6099.00 kb/s

    -> -29%

    FFT3DFilter(bw=64,bh=64,plane=4,interlaced=false) (AviSynth)

    Code
    x264 [info]: SSIM Mean Y:0.9943189 (22.456db)
    x264 [info]: PSNR Mean Y:48.946 U:53.399 V:53.748 Avg:49.988 Global:49.408 kb/s:6092.55
    encoded 7737 frames, 8.69 fps, 6092.55 kb/s

    -> -39%

    Deswegen wäre eine VapourSynth fft3dgpu Variante ja so ne feine Sache. Nehme an, dass die durch verbessertes Multithreading bei 4K meine GPU sauberer auslasten könnte und ebenfalls Vorteile brächte. Bei einer besseren GPU auf jeden Fall...

    Edited 3 times, last by mogobime (May 3, 2022 at 2:55 PM).

  • Gerade mal ein paar Tests gemacht mit QTGMC(Preset="Slower") -> kein wirklicher Unterschied zwischen FFT3DFilter und NEO_FFT3DFilter.

    Sprich FFT3DFilter ist einiges flotter geworden, aber seine Skripte muss man deshalb noch nicht anpassen. :)

    Cu Selur

    Ich hoffe du hast dran gedacht EZDenoise zu verwenden, sonst wird nämlich fft3dfilter gar nicht eingesetzt, wie ich durch mein untenstehendes Gemurkse rausgefunden habe.

    Wenn du Hybrid dazu gebracht hast bei QTGMC statt neo_fft3dfilter fft3dfilter zu verwenden, sollte es doch eigentlich möglich sein bei der AviSynth Variante auch fft3dgpu als denoiser zu verwenden, da die Syntax ja fast gleich ist.

    Das wäre mal ein Mod, der Hybrid einzigartig machen würde, ein getunetes QTGMC :)

    Plumpes ersetzen der fft3dfilter.dll durch fft3dgpu.dll im Hybrid Ordner hat nicht funktioniert, obwohl ich per "before color matrx" custom script die fehlenden dlls zusätzlich geladen habe. Weiter oben bekomme ich den custom part nicht eingefügt. Möglicherweise hab ich dadurch irgendwas vermurkst.

    Eigentlich hab ich nur diese zwei Zeilen bei "before colormatrix" eingefügt:

    LoadPlugin("C:\PROGRA~1\Hybrid\64bit\Avisynth\avisynthPlugins\LoadDll.dll")

    LoadDLL("C:\Program Files\Hybrid\64bit\Avisynth\avisynthPlugins\d3dx9_30.dll")

    Komischerweise hat Hybrid dann aber die zwei Zeilen

    Import("C:\Program Files\Hybrid\64bit\Avisynth\avisynthPlugins\QTGMC.avsi")

    Import("C:\Program Files\Hybrid\64bit\Avisynth\avisynthPlugins\Zs_RF_Shared.avsi")

    mit in den Custom Teil verschoben...

    Ohne den custom mod sieht's so aus:

  • Folgender Aufruf in der Kommandozeile hat leider auch mit einem unkommentiertem Abbruch von x264 geendet:

    Code
    ffmpeg -y -loglevel fatal -noautorotate -nostdin -threads 8 -i "C:\Users\Anonymous\AppData\Local\Temp\encodingTempSynthSkript_2022-04-29@21_44_30_3410.avs" -an -sn -vf  scale=in_range=tv:out_range=tv -pix_fmt yuv420p10le -strict -1 -vsync 0 -f rawvideo - | x264 --crf 19.00 --profile high10 --level 5.2 --ref 3 --keyint 500 --min-keyint 0 --scenecut 40 --bframes 3 --b-bias 0 --b-pyramid normal --direct auto --b-adapt 2 --sync-lookahead 16 --cplxblur 20.0 --qcomp 0.60 --qblur 0.50 --mbtree --rc-lookahead 40 --ipratio 1.40 --pbratio 1.30 --chroma-qp-offset 0 --qpmin 0 --qpmax 69 --qpstep 4 --partitions i4x4,i8x8,p8x8,b8x8 --8x8dct --me hex --merange 16 --mvrange -1 --subme 7 --cabac --trellis 2 --psy-rd 1.00:0.00 --weightp 2 --aq-mode 2 --aq-strength 1.00 --vbv-maxrate 240000 --vbv-bufsize 720000 --nr 0 --deadzone-inter 21 --deadzone-intra 11 --cqm flat --threads 16 --sar 1:1 --deblock 0:0 --psnr --ssim --non-deterministic --range tv --colormatrix bt709 --demuxer raw --input-res 1920x1080 --input-csp i420 --input-range tv --input-depth 10 --fps 30000/1001 --output-csp i420 --output-depth 10 --output "C:\Users\Anonymous\AppData\Local\Temp\2022-04-29@21_44_30_3410_03.264" -

    Hab das script im Temp folder editiert, so das es folgendermaßen aussieht:

    Mit der original fft3dfilter.dll läuft der Aufruf, ersetzte ich im Hybrid Ordner die fft3dfilter.dll mit der fft3dgpu.dll bricht's ab.

    ->Hat wohl nix mit dem custom script Gemurkse zu tun, sondern mit der Art wie QTGMC fft3dfilter aufruft...

  • Mit FFT3DFilter

    -> ~47fps

    mit NEO_FFT3DFilter:

    Code
    core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/DenoiseFilter/NEO_FFT3DFilter/neo-fft3d.dll")
    #core.std.LoadPlugin(path="i:/Hybrid/64bit/vsfilters/DenoiseFilter/FFT3Dfilter/fft3dfilter.dll")

    -> 47fps

    Wenn ich DGDecNV anstatt d2Source verwendet:

    mit NEO_FFT3DFilter: 48,5fps

    mit FFT3DFilter: 48,5 fps

    DGDecNV + 'Very Slow' preset:

    mit NEO_FFT3DFilter: 46fps

    mit FFT3DFilter: 46fps

    -> tut sich bei mir nix,....

    --------------------------

    zu fft3dgpu und QTGMC in Avisynth: da müsstes das QTGMC Skript geändert werden.

    In der

    Zeile:

    Code
    noiseWindow.sneo_FFT3D( u=ChromaNoise ? 3 : 2,v=ChromaNoise ? 3 : 2, sigma=Sigma, bt=noiseTD, ncpu=FftThreads )

    müsste ein FFT3dGPU aufruf rein

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!