画像系の機械学習の分野の1つである「超解像」について紹介します。
今回はSwinIRの公式チュートリアルに沿って実装する方法を紹介します。
実際に解像度の低い画像を高解像度化してみましょう。
Google colabを使用して簡単に実装することができますので、ぜひ最後までご覧ください。
Google Colabの使い方はこちら
今回の目標
・超解像の概要を学ぶ
・SwinIRの実装方法を学ぶ
・オリジナル画像を高解像度化してみる
超解像とは
超解像(Super-Resolution)とは、画像や動画の解像度を擬似的に上げる技術のことです。
解像度が低い画像の高周波成分を予測・復元して、解像度を高めています。
まずは以下の画像の例をご覧ください。


解像度の低い画像が擬似的に高解像度の画像になっていることがわかります。
超解像の技術
超解像技術は、単一フレーム超解像と複数フレーム超解像に大別できます。
単一フレーム超解像は周辺画素などから補完を行い、機械学習やデータベースを利用して予測することで、1枚の低解像度画像から解像度を高める手法です。
複数フレーム超解像は互いに位置が異なる複数枚の低解像度画像を位置合わせして、再構成することで解像度を高める技術です。
他には時間の異なる複数の画像を組み合わせたり、異なる装置から複数の画像を取得して、そこから解像度を上げる技術などもあります。
SwinIRとは
今回紹介するSwinIRは2021年に発表された「Swin Transformer」に基づくモデルです。
SwinIR は、浅い特徴抽出、深い特徴抽出、高品質の画像再構成の 3 つの部分で構成されています。
深層特徴抽出モジュールは、いくつかの残余の Swin Transformer ブロック (RSTB) で構成されており、それぞれのブロックには残余の接続と共にいくつかの Swin Transformer レイヤーがあります。

詳細はリンク先を参照してください。
SwinIRの導入
それでは早速、SwinIRを使用するための準備をしていきましょう。
ここからはGoogle colabを使用して実装していきます。
なお、以下のボタンからコードをコピーして使用していただくことも可能です。
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/JingyunLiang/SwinIR
%cd SwinIR
次に必要なライブラリをインストールします。
!pip install timm
次に学習済モデルを用意します。
!wget https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth -P experiments/pretrained_models
以上で準備が完了しました。
SwinIRによる超解像
それでは早速チュートリアルを実行してみましょう。
先ほどダウンロードしたモデルを指定して、超解像を実装します。
以下の例では、「scale 4」とすることで、4倍の超解像となります。
# サンプル画像の超解像
!python main_test_swinir.py \
--task real_sr \
--model_path experiments/pretrained_models/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth \
--folder_lq testsets/RealSRSet+5images \
--scale 4 \
--large_model
#サンプル画像は「testsets/RealSRSet+5images」にあります
#画像の出力は「results/swinir_real_sr_x4_large」に保存されます
コードを実行すると、結果が「results/swinir_real_sr_x4_large」に保存されています。
いくつかの画像を紹介してみます。

引用:https://github.com/JingyunLiang/SwinIR/tree/main/testsets/RealSRSet%2B5images


引用:https://github.com/JingyunLiang/SwinIR/tree/main/testsets/RealSRSet%2B5images

簡単に超解像を実装することができました。
オリジナル画像で超解像
次はオリジナル画像で超解像を試していきましょう。
まずは「testsets/sample」というフォルダを作成して、画像をアップしましょう。
※フォルダ名は変えても問題ありません。
画像をアップしたら、先ほどと同様に以下のコードを実行します。
# オリジナル画像の超解像
!python main_test_swinir.py \
--task real_sr \
--model_path experiments/pretrained_models/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth \
--folder_lq testsets/sample \
--scale 4 \
--large_model
サンプル画像の時と同様に、結果が「results/swinir_real_sr_x4_large」に保存されました。




オリジナル画像で超解像を実装することができました。
4Kサイズのオリジナル画像で超解像
最後に4Kサイズの画像に超解像を試してみましょう。
ここではこの画像を使用します。
※ブログ掲載の都合上、実際の画像を圧縮しています。

超解像をすることで、出力は16Kサイズの画像となります。
!python main_test_swinir.py \
--task real_sr \
--model_path experiments/pretrained_models/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth \
--folder_lq testsets/sample_4k \
--scale 4 \
--large_model \
--tile 400
結果が「results/swinir_real_sr_x4_large」に保存されました。
4Kサイズのような大きなサイズの画像でも簡単に超解像ができました。
参考に画像の一部分で比較すると、16K画像は細かい箇所までハッキリ見えてますね。


まとめ
最後までご覧いただきありがとうございました。
今回はSwinIRによる超解像技術を紹介しました。
超解像技術によって、昔撮った解像度の低い画像も高解像度にすることができるようになります。
このブログでは、画像処理に関する他の技術についても紹介していますので、ぜひ合わせてご覧ください。