以前、Upscayl
というアプリを使用して低解像度の画像を超解像化を試してみました。結果がわかりやすくすごい技術だったのですが、それだけで終わったらちょっともったいないなあと思い、今回はプログラミング的な感覚(比較的自動化しやすい)ものについて調べてみました。基本的な超解像化ロジックに関してはUpscay
lにも使用されていますが、今回はコマンドラインツールとして使用できる点が違いになります。
【参考】
超解像の恩恵を処理化したい
超解像は解像度の低い画像を画質をあげて拡大するといったものです。前述したUpscayl
はほぼ完成したアプリとして成立しているのですが、その他の処理と組み合わせて使用してみたいと思うとアプリでは連携がしにくい場面もあります。
そこで今回はReal-ESRGAN
を使用して、コマンドラインでも同様な処理を行えるようにしてみたいと思います。
Real-ESRGAN
にはコマンドラインで実行できるプログラムで、超解像化するアルゴリズムも複数含まれています。
WindowsでReal-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を搭載したものを使いましょう。
動画の超解像化処理もやってみる
これで終わってしまってもよいのですが、折角なので、超解像を拡張する処理を
コマンドラインツールの紹介としてこれで終わってもいいのですが、折角なのでこれを使用して動画の超解像化を試してみようと思います。
考え方は簡単で以下のような処理を行います。
動画の処理に関してはffmpegを使用します。以下のリンクからダウンロードできるのでこちらを使用します。こちらもportableバージョン
になっているので展開だけで使用できます。
改めてパスを通してもいいですし、パスの通ったフォルダにコピーしてもいいと思います。
処理の最初にフォルダを作成していますが、これは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倍)
超解像処理は比較的動きの少ない動画のほうが向いてはずなので、モデルも含めていろいろ試してみるのがいいのかなと感じます。
おわりに
このジャンルはまだまだ進歩の余地があるかなと思いますので、これからもどうなっていくのか楽しみな分野です。 もし古い映像が手元残っているようであればこのような形で超解像化を試してみてはどうでしょうか。