Super Resolution
超解像では、補間では復元できない細部を予測することで、低解像度画像から高解像度画像を再構成します。モデルとコードについて解説します。
超解像(SR)は、低解像度の入力から高解像度の画像や動画を再構成するコンピュータービジョン技術の総称です。バイキュービック補間などの従来のアップスケーリングでは、既存のピクセルをより大きなグリッドに引き延ばすだけなので、エッジがぼやけ、細かなテクスチャが不鮮明になります。学習済みのSRモデルは、低解像度画像と高解像度画像のペアから学習したパターンをもとに、シャープなエッジ、文字の線、布地や葉のテクスチャなどの欠落した高周波のディテールを予測します。単一画像超解像(SISR)は1枚の画像を対象とし、動画超解像は同じシーンの異なる情報を少しずつ捉えた隣接フレームも利用します。
超解像の仕組み#
超解像は不良設定問題です。異なる多くの高解像度画像が同じ低解像度画像に縮小されるため、モデルは自然画像について学習した知識を使って、最も妥当な結果を選ぶ必要があります。学習用ペアは、高解像度画像にぼかし、2×や4×などの倍率でのダウンサンプリング、ノイズ、圧縮を適用して作成します。この劣化モデルによって、ネットワークが実際に処理できる入力が決まります。Real-ESRGANは劣化処理をランダムに連鎖させて学習するため、きれいにダウンサンプリングされた画像だけでなく、実際の写真や動画も復元できます。
アーキテクチャは、ディープラーニングの他の分野とともに進化してきました。SRCNNは2014年に、3層の畳み込みニューラルネットワーク(CNN)が従来手法を上回ることを示しました。ESPCNは畳み込みを低解像度で実行し、最後にサブピクセル畳み込みでアップスケールします。この手法ではチャンネルを並べ替えて大きな画像を生成するため、リアルタイム1080p動画に十分な速度を実現できます。EDSRは多数の残差ブロックを積み重ね、SwinIRはシフトウィンドウ方式のビジョントランスフォーマーブロックでモデルを構築し、拡散モデルは反復的なノイズ除去によってディテールを生成します。
損失関数によって、「より良い」の定義が決まります。L1や平均二乗誤差などのピクセル単位の損失は元画像への忠実度を最大化しますが、可能な結果を平均化するため、出力は滑らかになります。SRGANは、深い特徴に対する知覚損失と敵対的生成ネットワーク(GAN)による敵対的損失を加え、シャープでリアルなテクスチャを生成します。ただし、実際のシーンとピクセル単位で一致しない場合があります。これは医療画像や法医学画像でリスクとなり、生成されたディテールが証拠と誤認されるおそれがあります。
超解像の評価#
忠実度は、平均二乗誤差をデシベル単位の対数スケールで測るピーク信号対雑音比(PSNR)や、構造類似度指数(SSIM)で評価します。LPIPSなどの知覚指標は深い特徴を比較し、リアルさに関する人間の判断をよりよく反映します。以下の比較では、画像を4分の1のサイズに縮小した後、バイキュービック補間と、OpenCVの事前学習済みESPCNモデルを使って再構成します。
import urllib.request
import cv2 # cv2.dnn_superres requires: pip install opencv-contrib-python
# Download a pretrained 4x ESPCN model and a test image cropped to a multiple of 4
urllib.request.urlretrieve("https://github.com/fannymonori/TF-ESPCN/raw/master/export/ESPCN_x4.pb", "ESPCN_x4.pb")
urllib.request.urlretrieve("https://ultralytics.com/images/bus.jpg", "bus.jpg")
original = cv2.imread("bus.jpg")[:1080, :808]
# Simulate a low-resolution capture by shrinking the image 4x
low_res = cv2.resize(original, (202, 270), interpolation=cv2.INTER_CUBIC)
# Upscale 4x with bicubic interpolation and with the learned ESPCN model
bicubic = cv2.resize(low_res, (808, 1080), interpolation=cv2.INTER_CUBIC)
sr = cv2.dnn_superres.DnnSuperResImpl_create()
sr.readModel("ESPCN_x4.pb")
sr.setModel("espcn", 4)
espcn = sr.upsample(low_res)
# Higher PSNR means the reconstruction is closer to the original image
print(f"Bicubic: {cv2.PSNR(original, bicubic):.2f} dB, ESPCN: {cv2.PSNR(original, espcn):.2f} dB")Bicubic: 19.51 dB, ESPCN: 20.52 dB が出力されます。1 dBの向上は、約100 KBのモデルファイルで平均二乗誤差が約21%低下することに相当します。
超解像と関連用語の比較#
- 画像復元: 劣化した画像からきれいな画像を復元する、より広範な分野です。ノイズ除去、ぼけ除去、圧縮アーティファクトの除去などが含まれます。超解像はピクセル数も増加させる画像復元タスクであり、最新のモデルは複数の劣化に同時に対処することもあります。
- 画像インペインティング: 欠落した領域やマスクされた領域を補完します。一方、超解像は、全体が存在するものの粗い画像のあらゆる場所にディテールを追加します。
- フレーム補間: 既存のフレームの間にフレームを合成して時間解像度を高めるもので、空間超解像の時間軸版に相当します。
- 生成AI: テキストから画像を生成するモデルは、プロンプトから画像を作成します。超解像は入力画像を条件とし、その内容に忠実である必要があります。また、多くの画像生成モデルは最終段階で拡散アップスケーラーを使用します。
実際のアプリケーション#
- ゲーム: NVIDIA DLSSは低解像度でフレームをレンダリングし、ニューラルネットワークでアップスケールすることで、同程度の画質を保ちながらフレームレートを向上させます。
- 動画ストリーミングとアーカイブ: 放送局やフィルム修復の専門家は、標準解像度の映像やアーカイブ映像をHDや4Kディスプレイ向けにアップスケールします。
- 衛星画像解析: アナリストは、より低コストの画像を鮮明化して建物、道路、車両をマッピングします。
- 医療画像解析: 研究用システムは、より高速で低解像度の撮像から高解像度のMRIを再構成し、患者がスキャナー内で過ごす時間を短縮します。
超解像は、低解像度の画像ソースから小さな物体を検出するための前処理ステップとしても利用されます。Ultralytics YOLO26は、すべての入力を imgsz(デフォルトでは640ピクセル)にバイリニア補間でリサイズするため、320×240のカメラフレームは検出前に2倍に拡大されます。この補間の代わりに2倍の超解像モデルを使うと、小さく遠方にある顔やナンバープレート、空撮映像内の車両などについて、再構成されたエッジを検出器に渡せます。










