elsa in mac

이미지 화질개선 도구 - image upscaler (CLI) 본문

Terminal(CLI,TUI)

이미지 화질개선 도구 - image upscaler (CLI)

elsa in mac 2025. 12. 20. 11:51

 

본 포스트는 Fedora Linux를 기준으로 작성되었습니다. 

이번 포스트에서는 Vulkan API를 기반으로 local 환경에서 AI model을 사용하여 Image의 해상도를 높이고 화질을 개선하는 Image Upscaing 도구인 waifu2x ncnn VulkanReal-ESRGAN에 대해 알아보겠습니다. 

Waifu2x ncnn Vulkan

waifu2x ncnn Vulkan 은 이름에서 알 수 있듯이 Vulkan API 기반의 ncnn을 이용한 Upscaler입니다. 

ncnn은 중국의 텐센트(Tencent)에서 개발한 모비일 및 임베디드 기기에 최적화된 고성능 신경망 추론 프레임워크로, nihui convolution neural network의 약자이며 우리말로 하면, "개발자 nihui가 만든 합성곱 신경망 네트워크"라는 의미가 됩니다. 

기본 설계 단계부터 모바일 기기에서 사용할 목적으로 구현되었기 때문에 여타 다른 라이브러리에 의존하지 않고, 크로스 플렛폼을 지원하며, CPU 혹은 GPU를 선택적으로 사용할 수 있습니다.  덕분에 Processing Power가 높지 않은 일반 데스크 탑 수준에서도 image Processing을 비교적 빠르고 효과적으로 처리할 수 있습니다. 

우선, 어느 정도 수준의 결과물을 뽑아낼 수 있는지 결과를 보도록 하겠습니다. 

원본 이미지
upscale 결과 (2x)

위의 스샷을 보면, 원본 대비 2배로 업스케일된 결과물을 비교할 수 있습니다. 사진의 원본은 700x1000의 jpg 이미지이며, mac mini (2021) 에서 변환 시 대략 2초 정도가 걸립니다.  

2배로 업스케일링을 한 결과이므로 이를 다시 원본 이미지 사이즈로 변경하면, pixel의 가독성이 높아지고, 노이즈가 제거되는 화질 개선 효과 때문에 보다 깨끗한 이미지를 얻을 수 있습니다.  

좌측) 원본, 우측) 업스케일링 결과

 

 

Real-ESRGAN

Real-ESRGAN은 Upscaling과 함께, 열화된 이미지를 복원하는데 특화된 딥러닝 모델입니다.  ESRGAN(Enhanced Super-Resolution GAN)이 특정 수학적 공식으로 만들어진 데이터 셋에서만 잘 작동하는 것과 달리 Real-ESRGAN은 현실 세계의 보다 불특정 한 이미지를 깨끗하게 복원하는 것을 목표로 구현된 모델입니다. 즉, 사진 등에 포함된 노이즈, 블러, 이미지 압축에 따른 노이즈등이 복합적으로 섞여 있는 것들을 High-Order Degration Model을 도입하여 매우 현실적인 수준에서 복원하는 것입니다. 

특히, REal-ESRGAN에서 사용되는 animation video 모델은 에니메이션 이미지 복원에 특화되어 있습니다. 따라서, ncnn 보다 좀 더 깨끗하고 선명한 upscaling 결과를 보여 주는 것을 확인할 수 있습니다. 확대를 해 보면, 아래와 같습니다. 

좌측) ncnn , 우측) Real-ESRGAN

아래는 다른 예시 입니다. 

위로부터 아래로, 원본 -> ncnn -> real-esrgan

깨끗하긴 하지만, 일부분 음영이나 자연스러운 붓터치가 단순화되고 어느정도 왜곡되어 있다는 것을 알 수 있습니다. 대신 노이즈나 저수준의 해상도가 깔끔히 사라진 것을 알 수 있습니다. 

대신, Model이 에니메이션 이미지에 특화되어 있기 때문에 일반 사진을 대상으로 upscaling을 했을 경우에도 결과가 애니메이션 같은 결과를 내어 줍니다. 

굉장히 깔끔한 결과를 보여 주지만, 사진이라는 느낌은 많이 사라지고, 마치 사람이 그린 그림 같다는 느낌을 줍니다.  하지만, 이런 효과를 의도한 것이라면 결과는 만족스러울 것입니다. 

원본 이미지의 상태가 좋을수록 결과물의 품질도 비례합니다. 

 

빌드 방법

Real-ESRGAN은 ncnn 을 기반으로 만들었기 때문에, 빌드 방법은 동일합니다. 

ncnn부터 보면, 

git clone https://github.com/nihui/waifu2x-ncnn-vulkan.git
cd waifu2x-ncnn-vulkan
git submodule update --init --recursive

mkdir build
cd build

# macOS에서 Vulkan API를 사용하기 위해 MoltenVK 라이브러가 필요하며. 
# 프로그램 실행 시, 의존성을 실행 파일내에 내장. 
cmake -DUSE_STATIC_MOLTENVK=ON ../src

# macOS가 아닌 경우 
cmake ../src

# 빌드
cmake --build . -j 4

맨 마지막 build에서 -j 는 빌드할 core 수 이므로, 자신의 컴퓨터의 core 수에 맞게 조정하거나 그냥 4로 빌드하면 됩니다. 

Real-ESRGAN은 절차는 동일하지만, git clone의 소스만 아래와 같이 변경하면 됩니다. 

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

빌드가 성공적으로 완료되면, build 디렉터리 내에 waifu2x-ncnn-vulkan 실행파일이 생성됩니다. 파일이름이 길기 때문에 upscaler 같이 다른 이름으로 바꿔 쓰는 게 좋습니다.  그리고, 실행 파일도 PATH 디렉터리로 복사해서 어디서든 실행할 수 있도록 해 줍니다. 

 

사용 방법

upscaler를 사용하려면, model 파일이 필요 합니다. 

source 디렉터리애 model 이라는 디렉터리가 있는데, 이 디렉터리를 ~/.local/share/upscaler 와 같이 적당히 참조하기 쉬운 위치로 복사를 해 줍니다. 

원본 image가 test.png 이고 이 파일을 upscaling 하고자 한다면, 다음과 같이 명령을 하면 됩니다. 

# 원시파일         : test.png 
# 결과파일         : test_upscaled.png 
# scale           : 2배 
# 노이즈 감쇠      : level 2
# 적용할 모델 path : ~/.local/share/upscaler/models-cunet
upscaler -i test.png -o test_upscaled.png -s 2 -n 2 -m ~/.local/share/upscaler/models-cunet

필자의 경우에는 yazi file manager를 사용하고 있는데, yazi에 설정을 추가하면 보다 쉽게 사용할 수 있습니다. 아래는 yazi에 적용했을 경우의 사용 예시입니다. 

yazi에서 image preview도 확인할 수 있기 때문에 사용하기 좋습니다. yazi에 적용하기 위해서는 아래와 같이 ~/.config/yazi.toml 설정파일을 수정합니다. 

open-image = [
	{ run = 'simg %s1',         desc = "Open(simg)",               for = "linux" },
	{ run = 'run-swaybg %s1',   desc = "change background(awww)",  for = "linux" },
	{ run = 'upscaler_cmd %s1', desc = "upscaling(2x)",            for = "linux" },  # <---
]

위의 예시를 보면, upsclaer_cmd %s1 이 부분을 추가하면 됩니다.  그러면, yazi 실행 후 해당 이미지 선택상태에서 o(알파벳 O) 키를 누르면, 위의 예에서와 같이 어떤 옵션으로 image 파일을 열지 선택하는 contextual menu가 뜨게 됩니다. 거기서 upscaling(2x)를 선택하면 내부적으로 upscaler_cmd [이미지 path] 가 실행되게 됩니다. 

upsclaer_cmd는 bash shell script로 아래와 같습니다. 

#!/bin/bash

# 인자가 없는지 확인
if [ -z "$1" ]; then
  echo "사용법: $0 <입력파일>"
  exit 1
fi

# 입력 파일명과 확장자 분리
input_file="$1"
filename="${input_file%.*}"
extension="${input_file##*.}"

# 출력 파일명 생성 (예: test_upscaled.png)
output_file="${filename}_upscaled.${extension}"

# 모델 경로 설정
model_path="$HOME/.local/share/upscaler/models-upconv_7_anime_style_art_rgb"

# 명령 실행
upscaler -i "$input_file" -o "$output_file" -s 2 -n 2 -m "$model_path"

 

다음은 Real-ESRGAN의 사용방법에 대해 알아 봅니다. Real-ESRGAN도 빌드를 하면, build 디렉터리에 realesrgan-ncnn-vulkan 이라는 실행파일이 생성됩니다. 역시 이름을 적당히 수정하여 PATH 디렉터리에 복사해 주면 됩니다.   real-esrgan 도 모델이 있어야 사용할 수 있는데, Github page에 가보면, 아래와 같이 portalble file를 다운로드할 수 있는 링크가 있습니다. 

 windows / Linux / macOS 이렇게 각 OS에 대한 링크가 있지요 ? 여기서 해당되는 링크를 클릭하면 다운로드를 합니다. 

.zip 압축파일을 해제하면, 내부에 models 라는 폴더가 보입니다.  해당 model 디렉터리 자체를 역시 ~/.local/share/upscaler 디렉터리 밑으로 복사합니다. 

필자의 경우에는 upscaler-realesrgan 이라고 실행 파일명을 변경했습니다. 

옵션을 보면, ncnn 과 살짝 다릅니다. -n 옵션이 denoise가 아니고, model-name 입니다.  esrgan의 경우에는 models라는 하나의 폴더 내에 여러 model이 다 포함되어 있기 때문에, 어떤 모델인지를 식별하는 식별자가 필요합니다. 사용 예는 그래서 다음과 같습니다.  

# 원시파일         : test.png 
# 결과파일         : test_upscaled.png 
# scale           : 2배 
# 적용할 모델 path : ~/.local/share/upscaler/models-cunet
# model name      : realesr-animevideov3
upscaler-realesrgan -i test.png -o test_upscaled.png -s 2 -m ~/.local/share/upscaler/models-cunet -n realesr-animevideov3

역시, yazi에 넣고, shell scipt를 만들면 쉽게 사용할 수 있습니다. 

 

- - - - - - - -

이번 포스트에서는 Chat-GPT나 Gemini 같은 AI 를 사용하지 않고, local 환경에서 작고 가벼운 그러나 image upscaliong에 특화된 AI model을 직접 사용하여 간단하게 image의 화질을 개선하면서 upscaling 하는 두 도구에 대해서 알아 봤습니다. 

해당 도구들은 최신도구는 아니지만, 여전히 기능과 성능면에서 유효합니다. upscaling 관련해서는 무료로 사용할 수 있는 site들도 굉장히 많이 있습니다만, 해당 server로 이미지를 upload 해야 한다는 부담감이 있지요. local 환경에서 비교적 빠르게 원하는 만큼 반복해서 사용할 수 있다는 정점이 있고, 자주 쓰지 않는 기능인데 Photoshop 같은 무거운 유료 이미지 tool을 구매하거나 설치하고 배워야 하는 부담감도 없다는 것 또한 정점 입니다. 

공유하기 링크
Comments