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 化を進めるとアプリらしさが増します。

参考リンク


この記事の執筆にあたり、AI の支援を受けています。