こすたろーんエンジニアの試行錯誤部屋

作成物の備忘録を書いていきますー

【GAN】google colab上でRealESRGANを使って画像を高画質化する

スポンサーリンク

今回は高解像度化ができるRealESRGANをgoogle colab上で試してみました
この記事はRealESRGANを動作させるまでの備忘録になります

目次

スポンサーリンク

この記事でわかること

google colab上でRealESRGANを使って画像を高画質化する方法

1.実行環境

Google Colab
git:clone https://github.com/xinntao/Real-ESRGAN.git
model : RealESRGAN_x4plus

2.環境構築&コード記述

2.1 インストール&ダウンロード

以下コマンドでgitからcloneして必要モジュールをインストールします
またモデルで使用する重みもダウンロードします

!git clone https://github.com/xinntao/Real-ESRGAN.git
%cd Real-ESRGAN

!apt-get install ffmpeg
!pip install pydub
!pip install basicsr
!pip install facexlib
!pip install gfpgan
!pip install -r requirements.txt
!python setup.py develop

!wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P experiments/pretrained_models

2.2 モデル実行~結果保存

指定モデルや引数を読み込んで、高画質化して保存する処理を記述します

import cv2
import glob
import os
from basicsr.archs.rrdbnet_arch import RRDBNet
from realesrgan import RealESRGANer
import subprocess
from pydub import AudioSegment
from google.colab.patches import cv2_imshow

model_path = "experiments/pretrained_models/RealESRGAN_x4plus.pth" #@param {type:"string"}
path = 'path/to/image/'  #@param {type:"string"}

# variable
block = 23
netscale = 4
tile = 0
tile_pad = 10
pre_pad = 0
half = False
face_enhance = False
outscale = 8 #@param {type:"number"}
output_dir = '/path/to/output_dir' #@param {type:"string"}
resize_rate = 0.5
limit_img_size = 1000

if 'RealESRGAN_x4plus_anime_6B.pth' in model_path:
    block = 6
elif 'RealESRGAN_x2plus.pth' in model_path:
    netscale = 2

model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=block, num_grow_ch=32, scale=netscale)

upsampler = RealESRGANer(
    scale=netscale,
    model_path=model_path,
    model=model,
    tile=tile,
    tile_pad=tile_pad,
    pre_pad=pre_pad,
    half=half)

if face_enhance:
    from gfpgan import GFPGANer
    face_enhancer = GFPGANer(
        model_path='path/to/model',
        upscale=outscale,
        arch='clean',
        channel_multiplier=2,
        bg_upsampler=upsampler)
else:
  pass    

os.makedirs(output_dir, exist_ok=True)

img = cv2.imread(path)
height = img.shape[0]
width = img.shape[1]
print('original image:', height, width)
if height < width:
  long_size = width
else:
  long_size = height

# 入力画像のサイズが1000pixel以上だとメモリオーバーになるのでリサイズする  
if limit_img_size < long_size:
  resize_rate = limit_img_size/long_size
  in_img = cv2.resize(img , (int(width*resize_rate), int(height*resize_rate)))
  print('resize image', in_img.shape[0], in_img.shape[1])
else:
  in_img = img

if face_enhance:
    # _, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True)
    pass
else:
    output, _ = upsampler.enhance(in_img, outscale=outscale)

save_path = path/to/save
cv2.imwrite(save_path, output)
del output
del in_img
del img
del upsampler

3.結果

元画像

拡大して比較してみると
左:通常 / 右:高画質化後

高画質化後の画像のほうが肌や目元がきれいになりました
髪の毛は少し潰れてしまったので、調整が必要な感じです

参考

www.hamlet-engineer.com
github.com