セーブポイント

特にジャンルの決まってない雑記です。

超解像 秘伝のタレ

この画像を壁紙にしたいんだけど、1920x1080サイズなんだよなあ。モニターは4Kなんだけど…。っていうとき、ありませんか?

そんなときに役立つのが、超解像(Super Resolution)技術です。

もともとこういうのとかこういうのとかが存在していたんですが、今回紹介するのはこちら、Real-ESRGANです。

github.com

ESRGANというやつの進化系で、名前の通りGANによって高品質な画像の拡大を実現するモデルです。現在超解像したいならとりあえずこれ使え、と言えるくらいには最強です。(最近また新しくDiffusion modelを利用した上位互換品みたいなのが出てるっぽいですが)

機械学習的な要素があるのでNVIDIA製のグラボとかが必要なのでは、と思ってしまいますが、必須ではありません
公式の説明によれば、Intel製・AMD製・NVIDIA製いずれのGPUでも動作するとされています。(が、実際にオンボGPUとかで動かしてみてはないので、各自確認をお願いします)
追記:手元にあるRyzen 7 5825Uで動かしてみたのですが、めちゃくちゃ遅いです!やっぱり必須ではないとはいえdGPUは欲しいかも。

また、ただ超解像を試してみるだけなら以下のサイトで試すことができます。
(このサイト、てっきりサーバー側で処理してくれてるものだと今まで思ってたんですけど、ローカルで動作してるっぽいですね?ノートPCでやったらCUDA out of memoryで怒られました……)

replicate.com

ただ、やっぱり動かすなら手元で動いてくれると嬉しいよね、ということでローカルでReal-ESRGANをいつでも使えるようにしましょう。

導入(Windowsの場合)

Real-ESRGANですが、ありがたいことにPyTorchなどの導入をする必要が無いポータブル版が公式からリリースされています。今回はこちらを利用します。

先程紹介したGitHubのページに飛び、少し下にスクロールするとダウンロードリンクがあるので自分の環境に合うものをダウンロードします。

READMEの上部にダウンロードリンクがあります

インストールは不要なので、ダウンロードしたファイルを解凍すれば導入は完了です。

使い方

使い方についてなのですが、realesrgan-ncnn-vulkan.exeをクリックするとGUIが開く、、、というわけではなくてこれはコマンドから利用するタイプのアプリケーションです。
先ほど見たReadmeを読んでいくと、ガイドがあります。

GitHub - xinntao/Real-ESRGAN: Real-ESRGAN aims at developing Practical Algorithms for General Image/Video Restoration.

基本的な使い方は、以下のような感じ。

./realesrgan-ncnn-vulkan.exe -i input.jpg -o output.png -n realesrgan-x4plus

上のように、入力ファイル名と出力先、使用するモデル名を最低限指定しておけばよいでしょう。他の引数については、公式のリファレンスを参照。

使用するモデル名とはなんぞや、という話なのですがReal-ESRGANにはアニメ調のイラスト用に最適化されたモデルも用意されています。以下のようにモデル名の指定を変更してあげると、これを使うことができます。

./realesrgan-ncnn-vulkan.exe -i input.jpg -o output.png -n realesrgan-x4plus-anime

ただ、使ってみた感じなんかめっちゃ平滑化がかかったのっぺりした感じになっちゃうことが多いように感じたので、標準のモデルの方でいい気がします。自分は最近アニメ用の方使ってない……。

注意点

Real-ESRGANはデフォルトで入力画像を4倍に拡大する設定になっています。この何倍に引き伸ばすかのスケール値は引数から設定可能なのですが、モデルが4倍用のやつなので4倍以外にすると出力がバグります

まあ画像がデカくて困ることはそんなに無いかな、と思うのでスケールは触らない方が吉です。どうしても縦横のサイズがデカすぎるという場合には画像編集ソフトとかで後から普通に縮小にしてあげればいいと思います。

毎回コマンド叩くのめんどくさい

見出しの通りです。ローカルで画像の超解像ができるようになったはいいけど、毎回コマンド打つのめんどい問題があります。最初はバッチファイルにコマンドを書いておくようにしておいたのですが、そもそもReal-ESRGANのディレクトリを開くのがめんどくさい。ということで自分の場合はPythonのパッケージ化しました。

EXE_PATH = "realesrgan-ncnn-vulkan.exeの絶対パス"

def run(args):
    model_name = "realesrgan-x4plus"
    print("Choose model to use:")
    print("1: realesrgan-x4plus (default)")
    print("2: realesrgan-x4plus-anime")
    model_num = input()
    try:
        model_num = int(model_num)
    except ValueError:
        model_num = 1
    
    if model_num == 2:
        model_name = "realesrgan-x4plus-anime"
    
    scale_fac = "4"
    
    file_basename = os.path.basename(args.input_path)
    root, ext = os.path.splitext(file_basename)
    
    output_filename = root + "_x" + scale_fac + ext
    
    cp = subprocess.run([EXE_PATH, "-i", args.input_path, "-o", output_filename, "-s", scale_fac, "-n", model_name])

Setuptools便利ね。