Python과 Real-ESRGAN을 활용한 AI 이미지 업스케일러 구축하기
요약
Python과 Real-ESRGAN을 사용하여 로컬 환경에서 실행 가능한 AI 이미지 업스케일러를 구축하는 튜토리얼입니다. API 의존성 없이 압축 아티팩트와 노이즈를 제거하며, 일괄 처리 및 얼굴 개선 기술까지 포함합니다.
핵심 포인트
- Real-ESRGAN을 활용한 오프라인 초해상도 모델 구축
- 디렉토리 내 이미지 일괄 처리(Batch Processing) 구현 방법
- GPU 메모리 절약을 위한 타일링(Tiling) 기법 적용
- GFPGAN을 결합한 고품질 얼굴 복원 기술 활용
저해상도 이미지는 압축된 썸네일, 오래된 스크린샷, 또는 절실하게 재사용해야 하는 비디오 프레임처럼 우리 일상에서 흔히 접하는 문제입니다. 개발자로서 월간 제한이 있는 클라우드 API에 의존하고 싶지는 않을 것입니다. 여러분은 직접 제어할 수 있고, 로컬에서 실행되며, 파이프라인(pipeline)에 스크립트로 포함할 수 있는 무언가를 원할 것입니다.
이 튜토리얼에서는 Python과 Real-ESRGAN을 사용하여 자신만의 AI 이미지 업스케일러(upscaler)를 구축하는 방법을 보여드리겠습니다. Real-ESRGAN은 완전히 오프라인으로 실행되는 최첨단 초해상도(super-resolution) 모델입니다.
왜 Real-ESRGAN인가?
Real-ESRGAN (Enhanced Super-Resolution Generative Adversarial Network)은 사용 가능한 최고의 오픈 소스 업스케일링 모델 중 하나입니다:
- 로컬 실행 — API 키가 필요 없고, 월간 제한이 없으며, 개인정보 보호 문제가 없습니다.
- 실제 이미지를 잘 처리함 — 단순히 합성된 이미지를 깨끗하게 만드는 것이 아니라, 압축 아티팩트(compression artifacts), 흐림(blur), 노이즈를 수정하도록 학습되었습니다.
- 다양한 배율(scale factors) — 2x, 4x 및 사용자 정의 업스케일링을 지원합니다.
- 활발한 커뮤니티 — 모델이 지속적으로 개선되고 있으며, 얼굴과 애니메이션을 위한 특화된 변형 모델들도 존재합니다.
사전 요구 사항
# Python 3.8 이상 권장
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # GPU
# 또는 CPU 전용:
...
참고: Mac (MPS) 또는 CPU 전용 머신을 사용하는 경우에도 동일한 코드가 작동하지만, 속도는 더 느릴 수 있습니다. 1MP 이미지를 4K로 업스케일링하는 데 CPU에서는 대략 30~60초가 소요됩니다.
1단계: 핵심 업스케일러
다음은 일반적인 케이스를 처리하는 최소한의 의존성을 가진 버전입니다:
import argparse
import time
from pathlib import Path
...
실행 방법:
python upscaler.py input.jpg --output result.png --scale 4
2단계: 디렉토리 일괄 처리 (Batch Processing)
단일 이미지는 편리하지만, 실제 워크플로우에는 일괄 처리가 필요합니다. 디렉토리 지원 기능을 추가해 보겠습니다:
def upscale_directory(upscaler, in_dir, out_dir, extensions=(".jpg", ".jpeg", ".png", ".webp")):
in_dir = Path(in_dir)
out_dir = Path(out_dir)
...
대규모 디렉토리의 경우, GPU 메모리 부족을 방지하기 위해 타일링(tiling)을 추가하세요:
upscaler = RealESRGANer(scale=4, model_path=weights, model=model, tile=400, tile_pad=10, pre_pad=0, half=False, device=device)
타일링 (Tiling)은 아주 약간의 이음새 품질을 희생하는 대신 엄청난 메모리 절약 효과를 제공합니다. 이는 8K 이상의 이미지를 업스케일링하거나 노트북 GPU에서 실행할 때 필수적입니다.
Step 3: 얼굴 개선 (GFPGAN)
Real-ESRGAN만으로는 얼굴을 처리하는 데 어려움이 있습니다. 얼굴이 밀랍 인형처럼 보이거나 왜곡될 수 있기 때문입니다. GFPGAN 모델이 이를 해결해 줍니다:
from gfpgan import GFPGANer
def build_face_upscaler(device="cpu"):
...
이는 오래된 가족 사진이나 저해상도 프로필 사진을 복원할 때 혁신적인 변화를 가져다줍니다.
Step 4: 초소형 웹 API (FastAPI)
작성한 업스케일러를 서비스 형태로 노출하고 싶으신가요? 여기 최소한의 FastAPI 엔드포인트가 있습니다:
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import Response
import numpy as np
...
다음 명령어로 실행하세요:
uvicorn api:app --host 0.0.0.0 --port 8000
테스트 방법:
curl -X POST -F "file=@photo.jpg" http://localhost:8000/upscale -o result.png
벤치마크 (간략한 수치)
중급형 RTX 3060 (12GB) 기준 대략적인 소요 시간:
| 입력 크기 | 배율 (Scale) | 시간 | VRAM |
|---|---|---|---|
| 512x512 | 4x | ~1.2s | ~1.5GB |
| ... |
일반적인 문제점 (Common Pitfalls)
-
검은색 출력 이미지 — 대개 데이터 타입 (dtype) 또는 범위 (range) 문제입니다. 입력값이 uint8인지, 그리고 cv2.imwrite가 유효한 배열을 받는지 확인하세요. 만약
half=True를 사용했을 때 NaN이 발생한다면, 사용 중인 GPU가 FP16을 제대로 지원하지 않을 수 있습니다. 이 경우half=False로 설정하세요. -
큰 이미지 처리 시 메모리 부족 (Out of memory) —
tile=400과tile_pad=10을 사용하세요. 소비자용 GPU에서 타일링 없이 8K 이미지를 업스케일링하지 마세요. -
신규 설치 시 CUDA 오류 — 드라이버와 일치하는 올바른 CUDA 인덱스 URL (cu118, cu121 등)을 사용하여 PyTorch를 설치하세요.
-
모델 자동 다운로드 실패 —
model_path를 로컬 파일로 설정하거나, wget을 사용하여 수동으로 미리 다운로드하세요.
전체 리포지토리 구조
upscaler/
├── upscaler.py # 핵심 로직 + CLI
├── batch.py # 디렉토리 처리
...
마치며
이제 여러분은 완전히 로컬에서 실행 가능하며 스크립트로 제어할 수 있는 AI 이미지 업스케일러를 갖게 되었습니다. API 키도 필요 없고, 이미지당 비용도 발생하지 않으며, 데이터가 기기 외부로 유출되지도 않습니다. 단일 이미지, 배치(batch) 처리, 얼굴(face) 복원을 처리할 수 있으며, 심지어 작은 웹 서비스로도 실행할 수 있습니다.
작게 시작해 보세요. 먼저 --scale 2 옵션으로 몇 장의 테스트 이미지를 업스케일링하여 품질을 가늠해 본 다음, 결과물이 마음에 드는 이미지들에 대해 4배(4x) 업스케일링을 시도해 보세요. 이 모델은 압축된 JPEG 이미지를 다시 깨끗하게 만드는 데 놀라울 정도로 뛰어난 성능을 보여줍니다.
이 내용이 유용했다면, AIXHDD의 원문 기사를 방문하여 더 많은 AI 도구 분석과 창의적인 워크플로우(workflow)를 확인해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기