超解像GAN Real-ESRGAN を試してみる【Windows11】

AI
スポンサーリンク

スポンサーリンク

はじめに

今回は低解像度の画像を高解像度に変換する超解像に用いられるAIに関して、そのデモスクリプトをテストしていきます。

低解像度の映像を高解像度に変換することによって、防犯カメラの映像のAI認識精度を高めたり、逆に誤検知を減らしたり、様々な活用方法が考えられます。

今回使用するのは Real-ESRGAN というAIで、github はこちらにあります。

前提条件

前提条件は、以下の通りです。

  • Windows11 ( Windows11 のみでテストしています。
  • Python3.9
  • torch == 1.12.1+cu113

必要なライブラリのインストール

README に従って必要なものをインストールしていきます。

pip install basicsr
pip install facexlib
pip install gfpgan
git clone https://github.com/xinntao/Real-ESRGAN.git
cd Real-ESRGAN
python setup.py develop

これで完了です。

事前学習モデルのダウンロード

ページ中部よりダウンロードしてください。
下記画像の赤丸部分からダウンロードできます。

ダウンロードしたら Real-ESRGAN/weights へ保存してください。

超解像の実行

超解像は、以下のコマンドを使用します。

python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs

これだけで、inputs フォルダ内の画像に対して超解像を実行します。

結果の確認

result フォルダに保存されている結果を確認してみましょう。

元画像

超解像結果

木の枝の細部まで表現されています。
さらに、再現された木の枝を見ると、枝分かれまで表現されています。

デモ画像は他にもあるので、動かした後は確認してみてください。

その他のオプション

ベースとなる実行方法は以下の通りです。

python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs

-i オプション

-i は直接画像を指定するか、画像が保存されているフォルダ名を指定します。

-n オプション

-n は使用するモデルを指定します。

  • RealESRGAN_x4plus
  • RealESRNet_x4plus
  • RealESRGAN_x4plus_anime_6B
  • RealESRGAN_x2plus
  • realesr-animevideov3
  • realesr-general-x4v3

上記6種が使用できます。

-o オプション

-o フォルダ名 で出力先を指定します。デフォルトは results です。

-s オプション

拡大する倍率を指定します。デフォルトは 4 です。

–suffix オプション

出力するファイル名にサフィックスを付加します。

–fp32 オプション

デフォルトでは float16 で推論しますが、–fp32 を指定すると float32 で推論します。

–ext オプション

–ext jpg で jpg フォーマットで指定します。png も指定できます。

–face_enhance

–face_enhance で 顔の超解像を実行する GFPGAN を使用することができます。

これには、先ほどインストールした facexlib が必要となります。
また、グレースケールには対応していません。

グレースケールも適用させたい場合は
facexlib/utils/inference_realesrgan.py の 350 行目あたりを変更する必要があります。

if len(upsample_img.shape) == 3 and upsample_img.shape[2] == 4:  # alpha channel
    alpha = upsample_img[:, :, 3:]
    upsample_img = inv_soft_mask * pasted_face + (1 - inv_soft_mask) * upsample_img[:, :, 0:3]
    upsample_img = np.concatenate((upsample_img, alpha), axis=2)
else:
    upsample_img = inv_soft_mask * pasted_face + (1 - inv_soft_mask) * upsample_img

↓

if len(upsample_img.shape) != 3:
    upsample_img = upsample_img.reshape(1404, 2000, 1)
if len(upsample_img.shape) == 3 and upsample_img.shape[2] == 4:  # alpha channel
    alpha = upsample_img[:, :, 3:]
    upsample_img = inv_soft_mask * pasted_face + (1 - inv_soft_mask) * upsample_img[:, :, 0:3]
    upsample_img = np.concatenate((upsample_img, alpha), axis=2)
else:
    upsample_img = inv_soft_mask * pasted_face + (1 - inv_soft_mask) * upsample_img

上記のように変更すれば対応可能です。

おわりに

今回は Real-ESRGAN のデモプログラムを動かしました。

pip install したライブラリとの相性が少し悪くエラーが出るかもしれませんが、4倍に解像度を上げてもかなりきれいな画像を出力できています。

この技術はインスタンスセグメンテーション等でも使用できそうです。

次回は、引数を使用せずに推論を動かせるようにしていきます。

コメント

タイトルとURLをコピーしました