AI 지브리?? 화풍으로 변환








사진 앱의 일반 필터 방식과 AI 모델의 처리 방식이 어떻게 다른지 AnimeGAN2를 활용해 간단한 지브리 화풍 변환기를 구현해 봤습니다.
완벽하진 않지만 AI가 이미지 맥락을 어떻게 해석하고 재구성하는지 이미지 결과를 통해 확인해 보세요.
일반 필터와 AI 필터의 차이
일반 사진 앱 필터: 피사체가 사람인지 하늘인지 전혀 모릅니다. 그냥 픽셀 색을 바꾸고 테두리만 검게 칠해서, 인물 얼굴이 기괴하게 뭉개지기 일수입니다.
AI 맥락 인식 (AnimeGAN2): "아, 이건 사람 눈동자구나", "이건 하늘의 뭉게구름이구나"를 스스로 알아채서, 지브리 특유의 수채화 톤과 부드러운 붓터치로 바탕부터 다시 그려냅니다.
4가지 확인 사항
1. 4K 사진 넣었다가 서버 터질 때 (VRAM 과부하) 4K 원본 사진을 AI 모델에 그대로 던지면 비디오 메모리가 폭발해서 서버가 바로 다운됩니다. 원본 비율을 유지하면서 768px 크기로 줄이면 눈으로 보는 화질 차이는 없으면서 메모리 사용량은 80% 이상 뚝 떨어집니다.
Python
# 1. 768px 다운사이징 전처리 (원본 비율 유지)
max_size = 768
w, h = input_image.size
if max(w, h) > max_size:
ratio = max_size / max(w, h)
w, h = int(w * ratio), int(h * ratio)
input_image = input_image.resize((w, h), Image.Resampling.LANCZOS)
# 2. CNN 연산 규격(8의 배수) 조정
img_resized = input_image.resize((w - w % 8, h - h % 8))2. 변환 끝나고 메모리 안 뱉는 문제 (자원 해제) AI 연산이 끝나도 GPU 메모리가 그대로 잡혀있으면 다음 사용자가 쓸 때 서버가 뻗습니다. 전체 로직을 try - finally 구문으로 감싸고, 작업이 끝나면 torch.cuda.empty_cache()와 gc.collect()를 강제로 실행해 자원을 깨끗이 비워줬습니다.
Python
try:
# 이미지 변환 및 AI 모델 추론 로직
...
finally:
# GPU 비디오 메모리 및 호스트 자원 해제
if torch.cuda.is_available():
torch.cuda.empty_cache()
gc.collect()3. 버튼 누르면 0바이트 에러가 나는 이유 (Streamlit 파일 포인터) Streamlit 환경에서는 화면이 재실행될 때 업로드된 파일 객체의 커서가 맨 끝으로 가버려서 파일 읽기 에러가 납니다. 이미지 로딩 직전 seek(0) 구문을 호출해 파일 커서를 맨 앞으로 돌려주는 코드로 바로 해결했습니다.
Python
if uploaded_file is not None:
uploaded_file.seek(0) # 파일 포인터 초기화
...
if st.button("화풍 변환하기"):
try:
uploaded_file.seek(0) # 이미지 로딩 직전 파일 포인터 재초기화
input_image = Image.open(uploaded_file).convert("RGB")4. 옆으로 누워버리는 핸드폰 사진 (EXIF 회전) 스마트폰 세로 사진을 그냥 불러오면 회전 메타데이터가 무시되어 90도 누워버립니다. 이미지 오픈 직후 ImageOps.exif_transpose를 걸어주면 자동으로 똑바로 서게 됩니다.
Python
from PIL import Image, ImageOps
# 이미지 오픈 직후 EXIF 메타데이터 기반 회전 보정 적용
input_image = Image.open(uploaded_file).convert("RGB")
input_image = ImageOps.exif_transpose(input_image)직접 체험해보기 & 소스코드
웹에서 바로 사용해 보시거나 코랩, 유튜브 영상으로도 확인하실 수 있습니다!
유튜브 영상: https://youtu.be/Pd84sgTmay8
웹 실시간 체험: https://ghibliconverter-kktqsb3uvhcnl5t3keqtmp.streamlit.app/
구글 코랩 테스트: https://colab.research.google.com/drive/1zu0l7Tebm-Dh5JlMecASi4r-MJqosaEg?hl=ko#
GitHub 저장소: https://github.com/gohard-lab/ghibli_converter
블로그 (워드프레스): https://gohard.pe.kr/
가볍게 갖고 놀아보시고 궁금하신 점이나 피드백은 편하게 댓글 남겨주세요!