見出し画像

AIイラストを超解像(高画質)化する方法【Google colabからSwinIRを使用】

完成品

note自体で画質が下がってしまうのですが
←4倍サイズ(4096□) (1024□)元のサイズ→ 
同じくらいまで拡大すると超解像化後のデータは崩れていない。元画像からサイズアップしつつ間を補完してくれてありがたいです(*´艸`*)
超解像化前のデータは解像度が低いです。
ゲーミング黒髪ちゃんが少し可愛くなりました!

高画質化後のイラスト見比べ!

拡大前の元イラストはこんな感じ!

元イラスト 2023/5/22 のおはようイラストです。

はじめに(経緯と超解像の簡単な説明 読み飛ばしてOK!)

AIイラストを作成中に、ちょっとした企画を思いついて友人にイラストを送付した所「画質が悪くて編集がし辛い」という話を受け、どうにか同じ構図のまま高解像度化出来ないかを調べてみた結果の記事となります。
本当はPythonの勉強がてらローカル環境で生成しようと思っていたのですが、環境設定途中でふとPython経由であればGoogle Colabからでも行けるんじゃない?というかやってる人いるんじゃない?と思って調べてみた結果、記事を公開されている方がいましたので、そちらに倣ってやってみました。

超解像(Super-Resolution)とは、画像や動画の解像度を擬似的に上げる技術の事。解像度が低い画像の高周波成分を予測・復元して、解像度を高める。要は入力した画像データを高解像度化する(大きくする)技術。
元の画像を大きくする際に周囲を補完しながらサイズアップするため結果的に元イラストと同じ高解像度の画像が出来るという事。
SwinIRは2021年に発表された「Swin Transformer」に基づくモデル らしい
(あんまり良く理解はしてないw)

私がやった内容は1024×1024 の画像を4096×4096 の4倍サイズアップ変換。
状況によってVRAMが足りなくなる可能性がありました。
VRAM不足の場合は元画像のサイズをダウンするかA100を狙いに行く。
基本的にサイズがそれほど大きくなければ普通に無料版のT4とかでも大丈夫な気がします。
※ちなみに他にもやりたい事がある為有料プラン(Pro)加入しています。
以下Gooogle Colabプランです。

Gooogle Colabプラン

参考記事

下記記事を参照して作成。というかほぼ下記記事の内容のまま。
今回は下記記事の内容を私がやってみた という内容になります。
(3か月くらい前の記事だけど、めちゃくちゃ単純にソースコードだけ公開されてやりたい事だけをやっているので凄い読みやすいです。)

って事で早速やっていきまっしょー!(*´▽`*)
上から順番にコード実行するだけで簡単に出来るのだっ!

手順①Google Colabを起動

手順②ノートブックを新規作成

GPUの設定変更
A100を選択しています。

A100とりたいっ!

各スペックの詳細は下記で確認。
一応この記事の最後にもGPUスペックくらいは掲載しています。

手順③下記コードを実行する(1)

やっている内容は下記(環境設定してる所)
・realESRGANをクローン
・環境に必要パッケージをインストール
・BSRGANをクローン
・SwinIRをクローン
・モデルをダウンロード
【TAT=30s~60s程度】

#① Clone realESRGAN
!git clone https://github.com/xinntao/Real-ESRGAN.git
%cd Real-ESRGAN
# Set up the environment
!pip install basicsr
!pip install facexlib
!pip install gfpgan
!pip install -r requirements.txt
!python setup.py develop

# Clone BSRGAN
!git clone https://github.com/cszn/BSRGAN.git

!rm -r SwinIR
# Clone SwinIR
!git clone https://github.com/JingyunLiang/SwinIR.git
!pip install timm

# Download the pre-trained models
!wget https://github.com/cszn/KAIR/releases/download/v1.0/BSRGAN.pth -P BSRGAN/model_zoo
!wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P experiments/pretrained_models
!wget https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/003_realSR_BSRGAN_DFO_s64w8_SwinIR-M_x4_GAN.pth -P experiments/pretrained_models
!wget https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth -P experiments/pretrained_models

手順④下記コードを実行し(2)Upload(高画質化)したい画像を選択する。

やっている内容は下記
・画像をパッチに分割してSwinIRをテスト
・BSRGANとの互換性の調整
・画像をアップロード
【TAT=30s程度】
少し待つとどの画像をUploadするか確認されます。

#②File upload
import os
import glob
from google.colab import files
import shutil
print(' Note1: You can find an image on the web or download images from the RealSRSet (proposed in BSRGAN, ICCV2021) at https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/RealSRSet+5images.zip.\n Note2: You may need Chrome to enable file uploading!\n Note3: If out-of-memory, set test_patch_wise = True.\n')

# test SwinIR by partioning the image into patches
test_patch_wise = False

# to be compatible with BSRGAN
!rm -r BSRGAN/testsets/RealSRSet
upload_folder = 'BSRGAN/testsets/RealSRSet'
result_folder = 'results'

if os.path.isdir(upload_folder):
    shutil.rmtree(upload_folder)
if os.path.isdir(result_folder):
    shutil.rmtree(result_folder)
os.mkdir(upload_folder)
os.mkdir(result_folder)

# upload images
uploaded = files.upload()
for filename in uploaded.keys():
  dst_path = os.path.join(upload_folder, filename)
  print(f'move {filename} to {dst_path}')
  shutil.move(filename, dst_path)
ファイルを選択する

Upload完了まで少し時間がかかるので待つ。

手順⑤下記コードを実行する(3)

やっている内容は下記(各高画質化を実行している)
・BSRGAN
・realESRGAN
・SwinIR
・SwinIR-Large
【TAT=30s程度】
※それぞれノイズ除去の方法が微妙に違っていて超解像化後のイラスト良く見比べると色合い等が微妙に変わっています。どの方法がどういう風になるかを全部検証するのはしんどいので、イラストを高画質化するだけであれば4つともかけて結果的に良い物を選びましょう!くらいで良いかなぁと思います。

#③ BSRGAN
!rm -r results
if not test_patch_wise:
  %cd BSRGAN
  !python main_test_bsrgan.py
  %cd ..
  shutil.move('BSRGAN/testsets/RealSRSet_results_x4', 'results/BSRGAN')

# realESRGAN
if test_patch_wise:
  !python inference_realesrgan.py -n RealESRGAN_x4plus --input BSRGAN/testsets/RealSRSet -s 4 --output results/realESRGAN --tile 800
else:
  !python inference_realesrgan.py -n RealESRGAN_x4plus --input BSRGAN/testsets/RealSRSet -s 4 --output results/realESRGAN

# SwinIR
if test_patch_wise:
  !python SwinIR/main_test_swinir.py --task real_sr --model_path experiments/pretrained_models/003_realSR_BSRGAN_DFO_s64w8_SwinIR-M_x4_GAN.pth --folder_lq BSRGAN/testsets/RealSRSet --scale 4 --tile 800
else:
  !python SwinIR/main_test_swinir.py --task real_sr --model_path experiments/pretrained_models/003_realSR_BSRGAN_DFO_s64w8_SwinIR-M_x4_GAN.pth --folder_lq BSRGAN/testsets/RealSRSet --scale 4
shutil.move('results/swinir_real_sr_x4', 'results/SwinIR')

# SwinIR-Large
if test_patch_wise:
  !python SwinIR/main_test_swinir.py --task real_sr --model_path experiments/pretrained_models/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth --folder_lq BSRGAN/testsets/RealSRSet --scale 4 --large_model --tile 640
else:
  !python SwinIR/main_test_swinir.py --task real_sr --model_path experiments/pretrained_models/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth --folder_lq BSRGAN/testsets/RealSRSet --scale 4 --large_model
shutil.move('results/swinir_real_sr_x4_large', 'results/SwinIR_large')
for path in sorted(glob.glob(os.path.join('results/SwinIR_large', '*.png'))):
  os.rename(path, path.replace('SwinIR.png', 'SwinIR_large.png')) # here is a bug in Colab file downloading: no same-name files

手順⑥下記コードを実行する(4)

やっている内容は各画像の視覚化
【TAT=60s程度】
※ココでエラーが出て失敗する場合はコードの下へ

#④ utils for visualization
import cv2
import matplotlib.pyplot as plt
def display(img1, img2):
  total_figs = 5
  fig = plt.figure(figsize=(total_figs*12, 14))
  ax1 = fig.add_subplot(1, total_figs, 1) 
  plt.title('Input image', fontsize=30)
  ax1.axis('off')
  ax2 = fig.add_subplot(1, total_figs, 2)
  plt.title('BSRGAN (ICCV2021) output', fontsize=30)
  ax2.axis('off')
  ax3 = fig.add_subplot(1, total_figs, 3)
  plt.title('Real-ESRGAN output', fontsize=30)
  ax3.axis('off')
  ax4 = fig.add_subplot(1, total_figs, 4)
  plt.title('SwinIR (ours) output', fontsize=30)
  ax4.axis('off')
  ax5 = fig.add_subplot(1, total_figs, 5)
  plt.title('SwinIR-Large (ours) output', fontsize=30)
  ax5.axis('off')
  ax1.imshow(img1)
  ax2.imshow(img2['BSRGAN'])
  ax3.imshow(img2['realESRGAN'])
  ax4.imshow(img2['SwinIR'])
  ax5.imshow(img2['SwinIR-L'])

def imread(img_path):
  img = cv2.imread(img_path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  return img

# display each image in the upload folder
print('Note: BSRGAN may be better at face restoration, but worse at building restoration because it uses different datasets in training.')
if test_patch_wise:
  print('BSRGAN does not support "test_patch_wise" mode for now. Set test_patch_wise = False to see its results.\n')
else:
  print('\n')
input_folder = upload_folder
result_folder = 'results/SwinIR'
input_list = sorted(glob.glob(os.path.join(input_folder, '*')))
output_list = sorted(glob.glob(os.path.join(result_folder, '*')))
for input_path, output_path in zip(input_list, output_list):
  img_input = imread(input_path)
  img_output = {}
  img_output['SwinIR'] = imread(output_path)
  img_output['SwinIR-L'] = imread(output_path.replace('SwinIR/', 'SwinIR_large/').replace('SwinIR.png', 'SwinIR_large.png'))
  if test_patch_wise:
    img_output['BSRGAN'] = img_output['SwinIR']*0+255
  else:
    img_output['BSRGAN'] = imread(output_path.replace('SwinIR', 'BSRGAN'))
  path = output_path.replace('/SwinIR/', '/realESRGAN/').replace('_SwinIR.png','_out{}'.format(os.path.splitext(input_path)[1]))
  if os.path.exists(path):
    shutil.move(path, path.replace('_out.', '_realESRGAN.'))
  img_output['realESRGAN'] = imread(path.replace('_out.', '_realESRGAN.'))

  display(img_input, img_output)

※失敗する場合

下記メッセージ「cvtcolor」の箇所でひっかかって失敗する場合は直前の手順(手順の⑤、コードの3)でメモリが足りずに画像生成が出来ていない為、img自体の受け渡しが出来ていない状態です。
解決方法は画像の本体のサイズを小さくするか、PROに変え(課金し)てメモリサイズをUPする必要があります。

エラー出そうな箇所

上手く行けば結果として下記のように入力画像 BSRGAN realESRGAN SwinIR SwinIR-Large の順に出力画像が返ってきます。

超解像化後の結果

手順⑦下記コードを実行する(5)画像のダウンロード

【実行TAT=3s程度】
※何故か?異常にダウンロードに時間がかかる時があります。
(いずれ調査するかも?)
この設定だと SwinIR_result.zip というファイルがDLされます。

# Download the results
zip_filename = 'SwinIR_result.zip'
if os.path.exists(zip_filename):
  os.remove(zip_filename)
os.system(f"zip -r -j {zip_filename} results/*")
files.download(zip_filename)

解凍すると4倍サイズになった画像が確認出来ます。

超解像化後のフォルダ
(後ろに変なのがいる(*´艸`*))

プロパティを確認してみます。
←超解像化後のプロパティ   入力画像のプロパティ→
イメージの大きさが1024➡4096(4倍に)
サイズが1.15MB➡16.6MBへ

プロパティ

おまけ

ちょっと気になるGoogle ColabのGPUのスペック調べてみました(*´▽`*)
VRAM的には下記データを見るとA100>V100>T4という事で頑張ってA100をとるのだっ!
12時間ルールや90分ルールは他の記事みて頂く方がいいかもです。(PROは条件違うらしい事とこの記事内容だけだと5-10分くらいで完了し長時間ランする事もないためルールは聞いた事がありますが特に調べてないです。)

確認と言ってもCPU変えて下記コマンドをポチポチ打っていくだけ('ω')
※ほぼ自分用です。

!nvidia-smi

【T4】

T4のスペック

【V100】

V100のスペック

【A100】

A100のスペック

普通にTwitterにUPするくらいであれば1024□でも十分な気がするけれど今回はPythonの勉強(ほぼコピーなのであんまり出来ていないけどw)と高画質な画像が必要になった為とりあえず手順通りにやってみました!
こういうのは徐々に進めて行けばいつかとんでもない所にたどり着いてるハズ!
という事で今回の記事はここまでっ!皆さんのイラストの子達が可愛くなる事を願いつつ、また他の記事でお会いしましょう!

最近暑いので水着にYシャツで、またねぇ!(*´▽`*)


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?