超解像はここまで来た。細部を補完してくっきり画像にしてくれる SeeSR

# 細部まで補完
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/464e335e-8b9f-5832-31bf-516451dae3e9.jpeg width=600>

↑これが低解像度の画像だが、ポピュラーな超解像モデルRealESRGANでアップスケールすると
<img src= https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8d699cf4-3250-5156-593b-ee24bec2521c.png width=600>

↑このように細部がスムーシングされてしまう。
そこでDiffusionで細部を補完するSeeSRを使うと↓
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b950bdcc-2b6f-88db-5750-198b86890f59.png width=600>


今までの超解像は、画像サイズは大きくなって少しはっきりした画像になっても、細部にスムーシングがかかったようになってしまっていました。元々の画像にない細部はくっきりさせるのに限界がありました。
しかし、Diffusionモデルで細部を補完しつつ超解像することができるようになりました。
SeerSRはまず画像に何が写っているか解析し、そのテキストから補完を行うようです。

# セットアップ
自分はColabでやりました。ハイメモリにしないと足りなくなりました。

SeeSRのリポジトリをクローン

```shell
git clone https://github.com/cswry/SeeSR.git
cd SeeSR
```

requirements.txtを以下のように編集。（condaを使わないから）

```:requirements.txt
diffusers==0.21.0
torch==2.0.1
pytorch_lightning
accelerate
transformers==4.25.0
xformers    
loralib
fairscale
pydantic==1.10.11
gradio==3.24.0

accelerate==0.25.0
diffusers==0.21.0
torch==2.0.1
pytorch_lightning==2.1.3
transformers==4.25.0
xformers
loralib==0.1.2
fairscale==0.4.13
opencv-python==4.9.0.80
chardet==5.2.0
einops==0.7.0
scipy==1.10.1
timm==0.9.12
```

requirements.txtに記載されたライブラリをインストール

```shell
pip install -r requirements.txt
```

使用するモデルを配置するpreset/models ディレクトリを作ります。

```python
import os
os.makedirs(os.path.join("preset", "models"), exist_ok=True)
```

huggingfaceからstable diffusionをダウンロードして、preset/modelsに保存します。

```python
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch

model_id = "stabilityai/stable-diffusion-2-base"
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, torch_dtype=torch.float16)
save_directory = "preset/models/stable-diffusion-2-base"
pipe.save_pretrained(save_directory)
scheduler.save_pretrained(save_directory + "/scheduler")
```

HuggingFaceからram_swin_large_14m.pthをダウンロードしてpreset/modelsに配置します。

```shell
wget https://huggingface.co/spaces/xinyu1205/recognize-anything/resolve/main/ram_swin_large_14m.pth
```

リポジトリで提供されているGoogleDriveのリンクからSeeSRフォルダとDAPE.pthを手に入れます。Colabの場合は自分のドライブにショートカットを作ってアクセスしてもいいですし、ローカルならダウンロードしてもいいです。


# 実行

preset/datasets/test_datasetsに超解像したい画像を入れ、実行します。

```shell
!python test_seesr.py \
--pretrained_model_path preset/models/stable-diffusion-2-base \
--prompt '' \
--seesr_model_path /content/drive/MyDrive/pretrained\ models/seesr \
--ram_ft_path /content/drive/MyDrive/pretrained\ models/DAPE.pth \
--image_path preset/datasets/test_datasets \
--output_dir preset/datasets/output \
--start_point lr \
--num_inference_steps 50 \
--guidance_scale 5.5 \
--process_size 512
```

一応大きい画像は小さいタイルに分割するようになっていますが、大きすぎるとメモリオーバーになります。

ということでアップスケール時に細部が消える問題に悩んでいる方はぜひ。

Diffusionのステップで割と時間がかかるので、もっと高速なAddSRというモデルもあります。

https://github.com/NJU-PCALab/AddSR

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)