本記事はアフィリエイト広告(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節約 |
| device | CPU/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

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


高画質な画像の拡大に成功していそうです。
今回は以上です。
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





コメント