1. はじめに
Real-ESRGAN は、実写画像の劣化を考慮した超解像モデルです。公式リポジトリと論文が公開されており、写真の拡大を試す OSS として扱いやすいです。サービス選定の全体像は AI 超解像サービス比較:Replicate・Real-ESRGAN・セルフホストの選び方【2026年版】 も参考になります。
この記事では、写真向けモデルを使い、Gradio で最小のサンプルアプリを作る手順に絞って説明します。
2. Real-ESRGAN を選ぶ理由
2.1 写真向けの OSS として始めやすい
Real-ESRGAN の公式実装は BSD-3-Clause です。商用検討時も比較的扱いやすく、Python から組み込みやすいです。
2.2 モデルの選び分けが明確
| モデル | 向いている画像 | メモ |
|---|---|---|
| RealESRGAN_x4plus | 写真・一般画像 | まずはこれで検証しやすい |
| RealESRGAN_x4plus_anime_6B | アニメ・イラスト | 写真用途には通常は使わない |
2.3 実運用で使う注意点が公式にそろっている
- VRAM が厳しい場合は
--tileが有効です - 顔補正は GFPGAN と組み合わせられます
- 公式コードでは GPU が使えない場合に CPU 実行へ切り替える流れがあります
3. 環境構築
最小構成では Python 仮想環境を作り、公式リポジトリ準拠の依存関係を入れます。
python -m venv .venv
source .venv/bin/activate
git clone https://github.com/xinntao/Real-ESRGAN.git
cd Real-ESRGAN
pip install -U pip
pip install torch torchvision basicsr facexlib gfpgan pillow opencv-python gradio
pip install -e .
次に、公式リリースから重みを取得して weights/ に置きます。
RealESRGAN_x4plus.pth- 必要なら
RealESRGAN_x4plus_anime_6B.pth
4. サンプルアプリの最小構成
4.1 ディレクトリ構成
Real-ESRGAN/
├ app.py
└ weights/
├ RealESRGAN_x4plus.pth
└ RealESRGAN_x4plus_anime_6B.pth
4.2 Gradio アプリのコード
import gradio as gr
import numpy as np
import torch
from functools import lru_cache
from basicsr.archs.rrdbnet_arch import RRDBNet
from gfpgan import GFPGANer
from PIL import Image
from realesrgan import RealESRGANer
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
@lru_cache(maxsize=8)
def build_upsampler(model_name: str, tile: int):
if model_name == "RealESRGAN_x4plus_anime_6B":
model = RRDBNet(
num_in_ch=3, num_out_ch=3, num_feat=64,
num_block=6, num_grow_ch=32, scale=4
)
else:
model = RRDBNet(
num_in_ch=3, num_out_ch=3, num_feat=64,
num_block=23, num_grow_ch=32, scale=4
)
return RealESRGANer(
scale=4,
model_path=f"weights/{model_name}.pth",
model=model,
tile=tile,
pre_pad=0,
half=(DEVICE == "cuda"),
gpu_id=0 if DEVICE == "cuda" else None,
)
@lru_cache(maxsize=8)
def build_face_enhancer(model_name: str, tile: int):
return GFPGANer(
model_path="https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth",
upscale=4,
arch="clean",
channel_multiplier=2,
bg_upsampler=build_upsampler(model_name, tile),
)
def upscale(image: Image.Image, model_name: str, face_enhance: bool, tile: int):
upsampler = build_upsampler(model_name, tile)
img = np.array(image.convert("RGB"))[:, :, ::-1]
if face_enhance:
face_enhancer = build_face_enhancer(model_name, tile)
_, _, output = face_enhancer.enhance(
img, has_aligned=False, only_center_face=False, paste_back=True
)
else:
output, _ = upsampler.enhance(img, outscale=4)
return Image.fromarray(output[:, :, ::-1])
demo = gr.Interface(
fn=upscale,
inputs=[
gr.Image(type="pil", label="入力画像"),
gr.Dropdown(
["RealESRGAN_x4plus", "RealESRGAN_x4plus_anime_6B"],
value="RealESRGAN_x4plus",
label="モデル",
),
gr.Checkbox(label="顔補正を有効化 (GFPGAN)", value=False),
gr.Slider(0, 512, value=0, step=32, label="tile"),
],
outputs=gr.Image(type="pil", label="出力画像"),
title="Real-ESRGAN Sample App",
)
demo.launch()
この例では lru_cache を使い、起動後のプロセス内でモデル生成を再利用します。Gradio のリクエストごとに重みを再読込しないため、初回以降の待ち時間を減らしやすいです。また、PIL は RGB、Real-ESRGAN / GFPGAN は OpenCV 系の BGR 配列を前提にするため、推論の前後でチャンネル順を明示的に変換します。
5. 実行方法
python app.py
ブラウザで表示された Gradio UI から画像を選びます。写真なら RealESRGAN_x4plus を選び、顔が主題なら GFPGAN を有効化します。メモリ不足が気になる場合は tile を 128 や 256 から試します。
6. ハマりやすいポイント
6.1 写真にアニメ向けモデルを使わない
RealESRGAN_x4plus_anime_6B はアニメ向けです。写真では RealESRGAN_x4plus を優先します。
6.2 GPU がなくても動くが遅くなりやすい
公式実装は GPU 前提で使われることが多いですが、CUDA が使えない環境では CPU 実行に切り替える構成を取りやすいです。検証用途では便利ですが、処理時間は環境依存で伸びやすいです。
6.3 OOM 対策は tile が基本
大きな画像でメモリ不足が出る場合は、まず tile を使って分割推論を試します。画質と速度のバランスを見ながら調整します。
6.4 顔補正は万能ではない
GFPGAN は Apache-2.0 で公開されており、人物写真では有効です。ただし、顔以外の細部改善が主目的なら、常時有効にせず比較して使う方が安全です。
6.5 ライセンス確認は先に行う
Real-ESRGAN は BSD-3-Clause、GFPGAN は Apache-2.0 です。配布形態や同梱物が増える前に、利用条件を確認しておくと後戻りが少なくなります。
まとめ
Real-ESRGAN を使ったサンプルアプリは、公式実装に近い Python 構成と Gradio を組み合わせると、少ないコードで試せます。まずは写真向けの RealESRGAN_x4plus で始め、必要に応じて tile、CPU フォールバック、GFPGAN を追加する流れが実践的です。次の一歩としては、複数画像の一括処理、保存先の外部化、API 化を進めるとアプリらしさが増します。
参考リンク
- Real-ESRGAN 公式リポジトリ
- Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data
- GFPGAN 公式リポジトリ
この記事の執筆にあたり、AI の支援を受けています。






