【Python】Real-ESRGANの環境構築

【Python】Real-ESRGAN環境構築

本記事はアフィリエイト広告(PR)を含みます

今回は画像アップスケーラー「Real-ESRGAN」の環境構築についてまとめました。
Stable Diffusionなどで生成した画像を4Kなどに拡大する場合、Resizeのみではディテールの復元はできません。

Real-ESRGANはAIで画像のディテールを補完、復元するため高画質な拡大が可能になります。

※動作環境

  • OS : Windows 11 Home
  • GPU : NVIDIA GeForce RTX 5070 Ti
  • Python:3.12 (venv)

1. リポジトリのクローン

まずは任意のフォルダで以下のコマンドを実行し、Real-ESRGANのリポジトリをクローンします。

git clone https://github.com/xinntao/BasicSR

作成されたフォルダに移動します。

cd BasicSR

Real-ESRGANはBasicSRを基盤ライブラリとして利用しています。
本記事ではRRDBNetを直接使用するためBasicSRをクローンします。

スポンサーリンク

2. 仮想環境構築

以下のコマンドで仮想環境を作成し、アクティベートします。(Python3.12の場合)。

py -3.12 -m venv .venv
.venv\Scripts\activate
スポンサーリンク

3. ライブラリのインストール

3.1. PyTorchのインストール

以下のコマンドでPyTorchをインストールします。

python -m pip install torch==2.10.0 torchvision==0.25.0 --index-url https://download.pytorch.org/whl/cu130

3.2. Real-ESRGANのインストール

以下のコマンドでReal-ESRGANをインストールします。

python -m pip install realesrgan

3.3. setup.py実行

最後に以下のコマンドでsetup.pyを実行します。

python setup.py develop

setup.pyはBasicSRを依存関係やバージョン、拡張モジュール込みで正常にインストールするためのスクリプトです。

スポンサーリンク

4. サンプルコード

今回はStable Diffusion XL 1.0で生成したこちらの1024×1024の画像を4倍(4096×4096)にアップスケールしてみたいと思います。

アップスケールにはモデルが必要なので、Real-ESRGAN用の4倍アップスケールモデル「RealESRGAN_x4plus.pth」をこちらからダウンロードして使用します。

ソースコードはこちらです。

import os
import cv2
import torch
import time
from urllib.request import urlretrieve

from realesrgan import RealESRGANer
from basicsr.archs.rrdbnet_arch import RRDBNet

# ----------------------
# 設定
# ----------------------
model_name = "RealESRGAN_x4plus.pth"
model_url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth"
scale = 4

input_image_path = "sdxl.png"
output_image_path = "sdxl_x4.png"

# ----------------------
# デバイス
# ----------------------
device = "cuda" if torch.cuda.is_available() else "cpu"
print("device:", device)

# ----------------------
# モデルダウンロード
# ----------------------
if not os.path.exists(model_name):
    print("downloading model...")
    urlretrieve(model_url, model_name)
    print("downloaded:", model_name)

# ----------------------
# ネットワーク定義 (x4)
# ----------------------
model = RRDBNet(
    num_in_ch=3,
    num_out_ch=3,
    num_feat=64,
    num_block=23,
    num_grow_ch=32,
    scale=scale
)

# ----------------------
# アップサンプラー
# ----------------------
upsampler = RealESRGANer(
    scale=scale,
    model_path=model_name,
    model=model,
    tile=0,
    tile_pad=10,
    pre_pad=0,
    half=(device == "cuda"),
    device=device,
)

# ----------------------
# 画像読み込み
# ----------------------
img = cv2.imread(input_image_path, cv2.IMREAD_COLOR)
if img is None:
    raise ValueError(f"failed to read image: {input_image_path}")

print("input:", img.shape[1], "x", img.shape[0])

# ----------------------
# アップスケール処理(時間計測)
# ----------------------
start_time = time.time()

output, _ = upsampler.enhance(img, outscale=scale)

# CUDAは非同期なので正確な時間計測用
if device == "cuda":
    torch.cuda.synchronize()

elapsed = time.time() - start_time

print("output:", output.shape[1], "x", output.shape[0])

# ----------------------
# 保存
# ----------------------
cv2.imwrite(output_image_path, output)
print("saved:", output_image_path)
print(f"time: {elapsed:.2f} sec")

① ネットワーク定義

model = RRDBNet(
    num_in_ch=3,
    num_out_ch=3,
    num_feat=64,
    num_block=23,
    num_grow_ch=32,
    scale=scale
)
引数意味
num_in_ch 入力チャンネル
num_out_ch 出力チャンネル
num_feat 特徴量の基本チャネル数
num_block RRDBブロック数
num_grow_ch ブロック内で増えるチャネル
scale 拡大倍率

設定する数値は使用するモデルに合わせる必要があります。

② 推論用アップサンプラー

upsampler = RealESRGANer(
    scale=scale,
    model_path=model_name,
    model=model,
    tile=0,
    tile_pad=10,
    pre_pad=0,
    half=(device == "cuda"),
    device=device,
)
引数意味
scale拡大倍率
model_pathモデルファイル
modelネットワーク(RRDBNet)
tileタイル分割数
0なら一括処理
※高解像度画像やVRAM不足環境では tile=256〜512の設定が有効です。
tile_padタイル分割した場合の境界線のパディング設定
tile=0なら無効、tile > 0ならパディングして分割した境界線を目立たなくさせる
pre_pad画像全体の外周のパディング設定
half半精度(FP16)で高速化、VRAM節約
deviceCPU/CUDA設定

③ 画像読み込み

img = cv2.imread(input_image_path, cv2.IMREAD_COLOR)
if img is None:
    raise ValueError(...)
print("input:", img.shape[1], "x", img.shape[0])

④ アップスケール処理

start_time = time.time()
output, _ = upsampler.enhance(img, outscale=scale)
if device == "cuda":
    torch.cuda.synchronize()
elapsed = time.time() - start_time

GPU処理が非同期なので、deviceがCUDAの時のみ「torch.cuda.synchronize()」で同期をとります。
ついでに処理時間も計測します。

⑤ 画像保存

cv2.imwrite(output_image_path, output)
print("saved:", output_image_path)
print(f"time: {elapsed:.2f} sec")
スポンサーリンク

5. 動作確認

実行結果はこちらです。

device: cuda
input: 1024 x 1024
output: 4096 x 4096
saved: sdxl_x4.png
time: 1.85 sec

元画像と比較してみます。

元画像
Real-ESRGANアップスケール画像

高画質な画像の拡大に成功していそうです。

今回は以上です。

6. 参考サイト

・Real-ESRGAN – GitHub
https://github.com/xinntao/Real-ESRGAN

・Real-ESRGAN:AIで画像を高品質にアップスケールする方法
https://www.toolify.ai/ja/ai-news-jp/realesrganai%E7%94%BB%E5%83%8F%E9%AB%98%E5%93%81%E8%B3%AA%E6%96%B9%E6%B3%95-3464438

・RealESRGANを使うとNo module named ‘torchvision.transforms.functional_tensor’とエラーが出る件について
https://qiita.com/macaronkunkun/items/eca54e34f0334d601db3

7. 関連書籍

スポンサーリンク

コメント

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