4 분 소요

 안녕하세요 마개입니다.
 AI로 만든 이미지에 대해서 품질을 향상하기 위해 시도해보고 있는 방법을 작성합니다.


Real-ESRGAN



현재의 상황

winter glove


 AI로 위와 같은 이미지를 생성해보았습니다. AI로 이미지 자체는 어느 정도 잘 만들어졌지만 사이즈도 작고 디테일한 부분에서 품질은 떨어져보여서 업스케일링을 진행했습니다.



이미지 업스케일링

 파이썬으로 이미지를 업스케일링하는 것은 몇 가지 방법이 있는데 저는 아래 두 가지 방법을 순차적으로 이용했습니다.

  • PIL의 resize 이용
  • Real-ESRGAN 이용


PIL의 resize 이용

 처음으로 PIL을 사용한 이유는 이미 AI로 만든 이미지를 PIL을 이용하여 Crop하고 파일 포맷을 Convert하고 있었기 때문입니다. 이미 사용중이었기 때문에 제공해주는 기능을 이용했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from PIL import Image

input_image = "수정할 이미지 파일명"

image = Image.open(input_image)

# resize하고 하는 가로 크기
target_width = 4000

# 기존 이미지의 비율을 그대로 이용
original_width, original_height = image.size

aspect_ratio = original_height / original_width
target_height = int(target_width * aspect_ratio)

# resize를 이용하여 이미지 사이즈 조정
resized_img = image.resize((target_width, target_height))

 위와 같이 작업하고 실행하면 이미지 사이즈가 커진 것을 확인하실 수 있습니다.


PIL resize
 다만 이미지를 확대해서 보면 이렇게 선명하지 않은 부분이 있다는 것을 확인할 수 있습니다. 그렇기에 이러한 부분을 더 선명하고 좋은 품질을 가질 수 있도록 하는 방법에 대해 알아보다가 알게 된 것이 Real-ESRGAN입니다.



Real-ESRGAN 이용

 Real-ESRGAN은 고품질 이미지 업스케일링과 복원에 사용되는 딥러닝 기반 모델입니다. 주로 저해상도 이미지나 품질이 낮은 이미지를 높은 해상도로 변환시키고 복원하는데 사용됩니다.


사용해보기

 Real-ESRGAN은 Windows, Linux, MacOS 3가지 OS에 대해서 모두 지원을 하며 윈도우의 exe와 같이 실행 파일을 같이 제공합니다. 하지만 저는 제가 만들고 있는 파이썬 프로젝트에서 이용할 것이라서 파이썬으로 실행해보도록 하겠습니다.
 그리고 해당 모델은 딥러닝 기반 모델이기 때문에 GPU를 요구합니다. GPU의 성능이 좋으면 좋을수록 빠르게 처리됩니다. 저의 경우 NVIDIA GeForce 4070 Ti를 사용 중이고 사전에 CUDA 설치를 완료했습니다. 이 부분은 생략합니다.

 위에서 제공하는 사이트에 접속하면 설치 방법과 실행 방법을 알려줍니다.

1
2
$ git clone https://github.com/xinntao/Real-ESRGAN.git
$ cd Real-ESRGAN

 먼저 해당 소스코드를 직접 다운로드(clone) 받고 해당 프로젝트로 이동합니다.


1
2
3
4
5
6
7
8
# Install basicsr - https://github.com/xinntao/BasicSR
# We use BasicSR for both training and inference
$ pip install basicsr
# facexlib and gfpgan are for face enhancement
$ pip install facexlib
$ pip install gfpgan
$ pip install -r requirements.txt
$ python setup.py develop

 그리고 해당 코드를 실행하기 위한 Dependencies를 설치합니다. 패키지는 본인이 이용하고 있는 파이썬에 설치합니다. 저의 경우 venv를 이용하여 프로젝트별로 패키지 관리를 하기 때문에 venv를 따로 만들고 설치하겠습니다.


1
2
3
4
5
# Download pre-trained models
$ wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P weights

# Execute
$ python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs --face_enhance

 실행을 하기 위해서 이미 훈련이 된 모델을 다운로드합니다. 모델의 경우 기본적으로는 2배, 4배가 있고 영상을 위한 모델도 있습니다. 이 페이지에서 확인하실 수 있습니다.
 다운로드 받은 모델을 이용해서 위 명령어로 실행할 수 있습니다. 여기에서 -n 파라미터는 모델명을, -i는 input 경로 또는 파일을, --face_enhanceGFPGAN을 사용할지 말지 정하는 파라미터입니다. 위의 예시에는 inputs라는 폴더 안에 있는 이미지들을 대상으로 업스케일링을 진행합니다. 그 외에 파라미터들은 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Usage: python inference_realesrgan.py -n RealESRGAN_x4plus -i infile -o outfile [options]...

A common command: python inference_realesrgan.py -n RealESRGAN_x4plus -i infile --outscale 3.5 --face_enhance

  -h                   show this help
  -i --input           Input image or folder. Default: inputs
  -o --output          Output folder. Default: results
  -n --model_name      Model name. Default: RealESRGAN_x4plus
  -s, --outscale       The final upsampling scale of the image. Default: 4
  --suffix             Suffix of the restored image. Default: out
  -t, --tile           Tile size, 0 for no tile during testing. Default: 0
  --face_enhance       Whether to use GFPGAN to enhance face. Default: False
  --fp32               Use fp32 precision during inference. Default: fp16 (half precision).
  --ext                Image extension. Options: auto | jpg | png, auto means using the same extension as inputs. Default: auto


결과

 해당 모델을 이용해서 위에서 봤던 장갑에 대해 실행해보고 결과를 출력해봤습니다. 결과는 results폴더에서 확인하실 수 있습니다.

image

 이미지에서 볼 수 있듯이 똑같이 확대를 했지만 위에서 봤던 이미지보다 더 선명한 이미지를 볼 수 있습니다.


TroubleShooting

 Real-ESRGAN을 설치하고 이용하는 과정에서 겪은 문제와 해결과정을 정리합니다.

ImportError: ……/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12
 우리가 설치한 파이썬 패키지 중에 nvidia 관련 패키지가 있는데 그것이 LD_LIBRARY_PATH에 등록되어 있지 않아서 발생한 에러입니다. 해당 환경변수는 공유 라이브러리의 경로를 지정하는데 사용되는 환경 변수로 CUDA환경에서는 CUDA 라이브러리와 종속성 라이브러리를 로드하는데 사용됩니다.
 이미 CUDA를 설치하면서 해당 환경변수에 설정을 했지만 파이썬 패키지도 같이 설정해줘야 합니다.

1
2
3
4
5
$ export LD_LIBRARY_PATH=$PWD/venv/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH

# 영구적으로 설정 (.bashrc 또는 .zshrc)
$ echo 'export LD_LIBRARY_PATH=$PWD/venv/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
$ source ~/.bashrc

 저의 경우 venv를 사용해서 파이썬 패키지를 설치했기에 위와 같이 했으니 각자의 위치에 맞게 설정해주시면 됩니다.


ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor’

1
2
3
4
5
6
7
8
...
...
...
  File "/home/.../venv/lib/python3.10/site-packages/basicsr/data/realesrgan_dataset.py", line 11, in <module>
    from basicsr.data.degradations import circular_lowpass_kernel, random_mixed_kernels
  File "/home/.../venv/lib/python3.10/site-packages/basicsr/data/degradations.py", line 8, in <module>
    from torchvision.transforms.functional_tensor import rgb_to_grayscale
ModuleNotFoundError: No module named 'torchvision.transforms.functional_tensor'

 다음으로 위와 같은 에러가 발생할 수 있는데 위에 보이는 degradations.py에서 해당 모듈을 찾을 수 없다는 에러입니다.


source code

 위와 같이 8번째 줄에 torchvision.transforms.functional_tensor 모듈이 들어가있는 것을 확인할 수 있습니다. 이를 다음과 같이 수정합니다.


1
from torchvision.transforms.functional import rgb_to_grayscale

source code

 위와 같이 코드를 변경하고 다시 실행하면 됩니다.


결론

 PIL로 단순하게 리사이즈 작업을 하는 것에는 품질이 떨어지는 딥러닝 모델인 Real-ESRGAN 모델을 이용하니까 한껏 선명해진 것을 알 수 있었습니다. 해당 모델을 이용했을 때 선명한 품질을 가져올 수 있지만 GPU가 필요하고 GPU의 성능에 따라 속도가 차이가 있다는 단점이 있습니다.