Dneska se budu věnovat upscalování anime videa, pomocí waifu2x-caffe. Nástroj umí velice dobře upscalovat obrázky (nejen) ve stylu anime a odstraňovat šum. GUI podporuje češtinu. Jako druhý nástroj budeme potřebovat FFmpeg a to konkrétně ffmpeg a ffprobe. Základy FFmpegu jsem probíral v předchozím článku. Jako poslední bude potřeba nějaký testovací video soubor. Jo a taky docela dost volného místa 😉
Po stáhnutí obou nástrojů si je vyextrahujeme na libovolné místo. Vytvoříme nový soubor např. upscaleAnimeWaifu2x.bat, ideálně v nové složce, a otevřeme ho v poznámkovém bloku, VCS nebo jiném editoru. Otevřeme si taky CMD, jak jsem psal v minulém článku, v té samé složce.
Začínáme
V okně CMD si vyzkoušíme že waifu2x i ffmpeg fungují:
c:\Users\Keiiko\Downloads\waifu2x-caffe\waifu2x-caffe-cui.exe c:\Users\Keiiko\Downloads\ffmpeg\bin\ffmpeg.exe
Pokud náhodou CMD vypíše jeden z nich že není názvem spustitelného programu, podívejte se, že je cesta správná a že soubory jsou ve složce z které se dá spouštět z CMD. Já sem si uložil ffmpeg do PATHu, nadále tedy nebudu uvádět celou cestu.
Teď si vyzkoušíme, že funguje i bat soubor. Napíšeme do něj:
@echo off echo bat soubor funguje
a spustíme zadáním jména do příkazového řádku. Stačí v okně CMD zmáčknout tabulátor nebo napsat první písmeno nebo pár prvních a pak zmáčknout tab. Šipkama nahoru a dolů pak můžeme procházet historii.
Sestavení scriptu
Protože waifu2x umí pracovat jen s obrázky je třeba video uložit po jednotlivých framech do obrázků, nejlépe png. Smažeme tedy echo a přidáme:
md "video-png" ffmpeg -y -i "video.mkv" -map 0:v:0 -c:v png "video-png\frame%%06d.png"
Můj video soubor se jmenuje video.mkv pro jednoduchost. Příkaz md vytvoří složku video-png. FFmpeg pak překonvertuje video do té složky pod názvem frame000001.png, frame000002.png, frame000003.png, atd. Pokud jste do teď nepřečetli minulý článek tak se na něj mrkněte, je to tam vše vysvětlené.
Teď by bylo dobré ještě uložit informaci o fps videa do stejné složky. Taky je to ideální způsob jak uložit výstup programu do proměnné v CMD.
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "video.mkv" > video-png\fps.info set /p fps=<fps.info
V tomto případě se vybere první video stopa a zobrazí se pouze hodnota fps. Výstup se pak přesměruje pomocí > do souboru fps.info v naší složce. Příkaz set pak nastaví první řádek souboru fps.info do proměnné fps. Tady bacha na mezery, ty se po = taky počítají.
Teď máme už png soubory ve složce, taky informaci o fps a je třeba se pustit do upscalování. Tady je dobré se pozastavit nad tím jestli počítač disponuje nVidia gpu nebo ne. Pokud ano, bude to trvat pár desítek minut, jinak je to na hodiny až dny. Taky je potřeba si vytvořit výstupní složku. Přidáme do baťáku tedy:
md "video-png-waifu2x" c:\Users\Keiiko\Downloads\waifu2x-caffe\waifu2x-caffe-cui.exe -i "video-png" -p gpu -m noise_scale -n 2 -s 2 -l png -e png -o "video-png-waifu2x"
Paramerty waifu2x jsou
-i vstupní soubor nebo složka
-p způsob upscalování gpu (rychlé, je potřeba nvidia) nebo cpu (pomalé)
-m zpracování obrazu, noise_scale umožní zvětšení a čištění šumu
-n síla čištění šumu (0-3)
-s násobek zvětšení (2x)
-l přípona vstupních souborů
-e přípona výstupních souborů
-o výstupní soubor nebo složka
Poslední krok je poskládat video nazpět.
ffmpeg -y -i "video.mkv" -f image2 -r %fps% -i "video-png-waifu2x\frame%%06d.png" -map 0 -map -0:v -map 1 -c copy -c:v libx264 -crf 15 video-waifu2x.mkv"
-y potvrzuje přepsání souboru pokud už existuje
-i vstupní soubor, v našem případě č.0 a č.1
-f typ souboru
-r fps videa
-map mapování či vybírání stop vstupních souborů na výstup. map 0 namapuje celý souboru č.0, -0:v odebere video z prvního souboru na výstupu.
-c kodek obecně, copy je kopie původních
-c:v kodek videa
-crf index stálé kavlity kodeku h264, 15 je dobrý poměr kvalita/velikost, pokud chcete bezztrátovou kvalitu, tak 0, ale ukládá se to do yuv444, což nemusí vše přehrát a je to nechutně veliké pak ten soubor.
Automatizace
Teď už nám to pěkně všechno dohromady upscaluje video, ale chtělo by to udělat více obecně aby bylo možné to aplikovat na každý soubor. Podle návodu z minulého článku uděláme tedy tyto změny:
@echo off rem Created by Keiiko 2022 set ffmpegPath=ffmpeg set ffprobePath=ffprobe set waifu2xCaffeePath=c:\Users\Keiiko\Downloads\waifu2x-caffe\waifu2x-caffe-cui.exe :again set pngFolder=%~p1%~n1-png set pngWaifuFolder=%~p1%~n1-png-waifu2x :: dotazat se ke smazni pokud existuje slozka s png souborama a vytvorit ji pokud ji smazeme if exist "%pngFolder%" rd /s "%pngFolder%" if exist "%pngFolder%" goto:shift md "%pngFolder%" :: dotazat se ke smazni pokud existuje slozka s upscalovanyma png souborama a vytvorit ji pokud ji smazeme if exist "%pngWaifuFolder%" rd /s "%pngWaifuFolder%" if exist "%pngWaifuFolder%" goto:shift md "%pngWaifuFolder%" :: vytvorit png soubory "%ffmpegPath%" -y -i "%~1" -map 0:v:0 -c:v png "%pngFolder%\frame%%06d.png" :: ulozit a nacist fps "%ffprobePath%" -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "%~1" > fps.info set /p fps=<fps.info :: upscalovat framy echo waifu2x pracuje... "%waifu2xCaffeePath%" -i "%pngFolder%" -p gpu -m noise_scale -n 2 -s 2 -l png -e png -o "%pngWaifuFolder%" :: vytvorit video z png souboru "%ffmpegPath%" -y -i "%~1" -f image2 -r %fps% -i "%pngWaifuFolder%\frame%%06d.png" -map 0 -map -0:v -map 1 -c copy -c:v libx264 -crf 0 "%~p1%~n1-waifu2x.mkv" :shift shift if "%~1" == "" goto:eof goto:again
Takto upravený baťák pak můžeme volat s více soubory, např.: upscaleAnimeWaifu2x.bat video1.mkv video2.mkv video3.mkv, alternativně ještě použít drag’n’drop, tedy přetáhnout soubory na baťák.
Použití Waifu2x GUI
Pokud bychom chtěli raději použít waifu2x GUI, pak je třeba vytvořit bat pro generování png souborů:
@echo off rem Created by Keiiko 2022 set ffmpegPath=ffmpeg set ffprobePath=ffprobe :again set pngFolder=%~p1%~n1-png :: dotazat se ke smazni pokud existuje slozka s png souborama a vytvorit ji pokud ji smazeme if exist "%pngFolder%" rd /s "%pngFolder%" if exist "%pngFolder%" goto:shift md "%pngFolder%" :: vytvorit png soubory "%ffmpegPath%" -y -i "%~1" -map 0:v:0 -c:v png "%pngFolder%\frame%%06d.png" :: ulozit a nacist fps "%ffprobePath%" -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "%~1" > "%pngFolder%\fps.info" set /p fps=<"%pngFolder%\fps.info" :shift shift if "%~1" == "" goto:eof goto:again
a pak ještě bat pro vytvoření mkv souboru ze zvětšených png, který jsme vytvořili přes GUI a to takto:
@echo off rem Created by Keiiko 2022 set ffmpegPath=ffmpeg set ffprobePath=ffprobe set pngWaifuFolder=%~p2%~n2 :: zjisti jestli existuje slozka s waifu2x upscalem if not exist "%pngWaifuFolder%" goto:eof :: ulozit a nacist fps if not exist "%pngWaifuFolder%\fps.info" "%ffprobePath%" -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "%~1" > "%pngWaifuFolder%\fps.info" set /p fps=<"%pngWaifuFolder%\fps.info" :: vytvorit video z png souboru "%ffmpegPath%" -y -i "%~1" -f image2 -r %fps% -i "%pngWaifuFolder%\frame%%06d.png" -map 0 -map -0:v -map 1 -c copy -c:v libx264 -crf 0 "%~p1%~n1-waifu2x.mkv"
Tady to už nejde moc dobře pro více souborů naráz (vč. drag’n’drop), protože první parametr je cesta k původnímu souboru a druhý je cesta ke složce s upscalovanými png soubory. Použití by bylo: png2mkv.bat video.mkv mojeSlozka/
Další CMD příkazy příklady se dají najít na ss64.com
V některém z příštích článků se podíváme na možnosti hardsubování videa, pipeování a použití h264 pro aplikace které umí jen vfw avi.