【便利】コマンドラインツールで超解像処理!静止画も動画も高画質に

以前、Upscaylというアプリを使用して低解像度の画像を超解像化を試してみました。結果がわかりやすくすごい技術だったのですが、それだけで終わったらちょっともったいないなあと思い、今回はプログラミング的な感覚(比較的自動化しやすい)ものについて調べてみました。基本的な超解像化ロジックに関してはUpscaylにも使用されていますが、今回はコマンドラインツールとして使用できる点が違いになります。

【参考】

note.com

www.upscayl.org

超解像の恩恵を処理化したい

超解像は解像度の低い画像を画質をあげて拡大するといったものです。前述したUpscaylはほぼ完成したアプリとして成立しているのですが、その他の処理と組み合わせて使用してみたいと思うとアプリでは連携がしにくい場面もあります。

そこで今回はReal-ESRGANを使用して、コマンドラインでも同様な処理を行えるようにしてみたいと思います。

github.com

Real-ESRGANにはコマンドラインで実行できるプログラムで、超解像化するアルゴリズムも複数含まれています。

WindowsReal-ESRGANを使用する

先ほどのGitHubのページから以下のリンクをクリックしてダウンロードを行います。ダウンロードしたファイルを展開すればすぐに使用できるようになっています。(portableバージョンなのでインストール作業は不要)

GitHubのページで以下をクリックしても同じファイルをダウンロードできます。

ダウンロードしたzipファイルを展開すると以下のような構成になっています。

展開後のフォルダ中のrealesrgan-ncnn-vulkan.exeが実行できる形式のファイルです。また同フォルダにはmodelsフォルダがあり、これが超解像アルゴリズムのモデルになっています。このモデルをオプションとして指定して超解像処理を行っていきます。

ターミナル(cmdまたはPowerShell)で先ほどのプログラムを以下のように実行するとoutput.pngという超解像化された画像が作成されます。また、GPUがあれば(使用するGPUを指定可能)それを使用することもできます。今回はGPUを搭載したPCはを使用しています。

PS> cd realesrgan-ncnn-vulkan-20220424-windows
PS realesrgan-ncnn-vulkan-20220424-windows> ./realesrgan-ncnn-vulkan.exe -i input.jpg -o output.png -n realesrgan-x4plus

[0 NVIDIA GeForce RTX 4070 Ti]  queueC=2[8]  queueG=0[16]  queueT=1[2]
[0 NVIDIA GeForce RTX 4070 Ti]  bugsbn1=0  bugbilz=0  bugcopc=0  bugihfa=0
[0 NVIDIA GeForce RTX 4070 Ti]  fp16-p/s/a=1/1/1  int8-p/s/a=1/1/1
[0 NVIDIA GeForce RTX 4070 Ti]  subgroup=32  basic=1  vote=1  ballot=1  shuffle=1
0.00%
25.00%
50.00%
75.00%

これで超解像処理を行った画像output.pngが生成されました。

ほぼ同サイズに拡大すると画質の違いは明らかだと思います。

なお、プログラムのオプションは以下の用になっています。画像形式にwebpが使えるのがいいですね。

オプション 説明
-h ヘルプを表示
-i input-path 入力画像のパス(jpg/png/webp)またはディレクト
-o output-path 出力画像のパス(jpg/png/webp)またはディレクト
-s scale アップスケール比率(2、3、4のいずれか、デフォルト=4
-t tile-size タイルサイズ(>=32/0=自動、デフォルト=0
-m model-path 事前訓練モデルへのフォルダパス(デフォルト=models
-n model-name モデル名
-g gpu-id 使用するGPUバイスデフォルト=auto、複数GPUの場合は0、1、2など)
-j load:proc:save load/proc/saveのスレッド数(デフォルト=1:2:2、複数GPUの場合は 1:2、2、2:2:2など)
-x TTAモードを有効にする
-f format 出力画像の形式(jpg/png/webp、デフォルト=ext/png
-v 詳細な出力を表示

デフォルトでは縦横各2倍の4倍へ超解像化しています。

また、入力画像の種類によってモデルの向き不向きがあるので、アニメ調なのか、写真調なのかを試しておくと良いでしょう。 modelフォルダに入っているモデルにanimeがついていないものは写真向きのようです。

今回使用しているPCではRTX 4070Tiが搭載されているため1画像当たり数秒で完了しましたが、GPU未搭載のPCでは1画像当たり数十秒~1分程度掛かると思います。できれば、GPUを搭載したものを使いましょう。

動画の超解像化処理もやってみる

これで終わってしまってもよいのですが、折角なので、超解像を拡張する処理を

コマンドラインツールの紹介としてこれで終わってもいいのですが、折角なのでこれを使用して動画の超解像化を試してみようと思います。

考え方は簡単で以下のような処理を行います。

  1. 動画をフレーム単位に分割する
  2. 分割されたそれぞれのフレームを超解像処理する
  3. 超解像処理を行ったフレーム画像を動画化する(音声は元動画のものを使用する)

動画の処理に関してはffmpegを使用します。以下のリンクからダウンロードできるのでこちらを使用します。こちらもportableバージョンになっているので展開だけで使用できます。 改めてパスを通してもいいですし、パスの通ったフォルダにコピーしてもいいと思います。

github.com

処理の最初にフォルダを作成していますが、これはrealesrgan-ncnn-vulkan.exeがオプション設定でフォルダの指定をしても作成を行ってくれないためです。 処理を行う動画ファイル名は640×480_サンプル動画.mp4として、imgフォルダにフレーム分割した画像をいれ、超解像化した画像はhiresフォルダに格納しています。 最後のコマンドでは-iが2つありますが、前者は映像のフレーム、後者は音声の入力を元動画のものを使用するという指定です。

PS> mkdir img
PS> mkdir hires
PS> .\ffmpeg.exe -i .\640×480_サンプル動画.mp4 -q:v 1 .\img\%06d.png
PS> .\realesrgan-ncnn-vulkan.exe -i img -o hires -n realesrgan-x4plus
PS> .\ffmpeg.exe -i .\hires\%06d.png -i .\640×480_サンプル動画.mp4 .\output.mp4

今回、加工した映像は単に町並みの風景がとなるので、動きがかなり少ないものです。超解像処理後の動画をみるとかなりくっきりした映像になっていることがわかります。大げさにいうと味付けされた感じはあるでしょうか。また、看板などの文字に関してはかなり強調がされていて、違う模様のようにも見えます。

パート1(オリジナル拡大率2倍)

パート1(超解像処理後拡大率1/2倍)

パート2(オリジナル拡大率2倍)

パート2(超解像処理後拡大率1/2倍)

超解像処理は比較的動きの少ない動画のほうが向いてはずなので、モデルも含めていろいろ試してみるのがいいのかなと感じます。

おわりに

このジャンルはまだまだ進歩の余地があるかなと思いますので、これからもどうなっていくのか楽しみな分野です。 もし古い映像が手元残っているようであればこのような形で超解像化を試してみてはどうでしょうか。

/* -----codeの行番号----- */