블로그

Go Hard

AI 애니메이션 변환 필터

1. 단순 필터(LUT/Edge) vs AI 맥락 인식(AnimeGAN2)• 단순 필터 방식 (Color LUT & Edge Detection)작동 원리: 전체 픽셀의 색상값을 매핑해 바꾸거나, Canny/Sobel 알고리즘으로 경계선만 검은 테두리로 추출합니다.한계점: 피사체가 사람인지 배경인지 구분하지 못하므로 이목구비가 왜곡되거나 배경 질감이 뭉개지는 현상이 발생합니다.• AI 맥락 인식 방식 (AnimeGAN2 Generator)작동 원리: 신경망이 이미지의 특징 맵(Feature Map)을 추출하여 피사체와 배경 구도를 파악합니다.장점: 단순 덮어씌우기가 아닌, 인물의 눈동자, 피부 음영, 하늘의 구름 등을 지브리 애니메이션 특유의 수채화 톤과 부드러운 선 처리로 재구성합니다.────────────────────────────────────────2. 실무적 문제 해결 및 자원 관리• VRAM 과부하 방지 (768px 다운사이징)4K 고해상도 이미지를 모델에 그대로 입력하면 비디오 메모리가 부족해져 서버가 다운될 위험이 있습니다.원본 비율을 유지하며 최대 변 길이를 768px로 제어하고, CNN 연산 규격에 맞춰 가로/세로 길이를 8의 배수로 조율하는 전처리를 적용했습니다. 체감 화질 손실 없이 메모리 점유율을 약 80% 이상 절감했습니다.• 메모리 자원 강제 해제 (try-finally)연산 종료 후 비디오 메모리가 잔여물로 남는 현상을 방지하기 위해 전체 추론 과정을 try-finally 구문으로 감싸고, 작업 직후 torch.cuda.empty_cache()와 gc.collect()를 호출해 자원을 확실히 반환하도록 설계했습니다.• Streamlit 파일 포인터 초기화 (seek(0))Streamlit 환경에서는 화면이 재실행될 때 업로드된 파일 객체의 커서가 맨 끝으로 가면서 0바이트 읽기 에러가 발생합니다. 이미지 로딩 직전 seek(0)을 호출해 파일 커서를 맨 앞으로 돌려두어 에러를 방지했습니다.• EXIF 회전 보정 (ImageOps.exif_transpose)스마트폰 세로 촬영 사진의 회전 메타데이터가 무시되어 이미지가 눕는 현상은 로드 직후 ImageOps.exif_transpose를 적용해 정방향으로 보정했습니다.────────────────────────────────────────3. 주요 프로젝트 링크본 프로젝트에 사용된 소스코드는 안전성이 검증된 로직으로 구동되며, 아래 링크에서 확인하실 수 있습니다.• 웹 실시간 체험: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://youtu.be/Pd84sgTmay8• 뉴스 워드프레서:https://gohard.pe.kr/

AI 실무 활용AI화풍변환지브리화풍StreamlitVRAM이미지처리파이썬

Go Hard

[기술 아티클] Streamlit과 Librosa로 구축하는 AI 음성 주파수 적발 시스템

안녕하세요, 인프런 수강생 및 개발자 여러분.딥페이크 음성 및 AI 목소리 생성 기술이 보편화됨에 따라, 이를 판별하기 위한 기술적 접근법에 대한 관심이 높아지고 있습니다. AI가 만든 오디오 데이터는 음성 인코딩 및 학습 모델 특성상 특정 고주파 대역이 잘려 나가는 상한 제한(High-Frequency Cut-off) 패턴을 보입니다.본 글에서는 파이썬 오디오 처리 모듈인 Librosa와 Streamlit 대시보드를 연동하여 이를 시각적으로 판별하는 애플리케이션 구축 사례를 공유하고, 음성 데이터 처리 시 발생하기 쉬운 웹 서버 블로킹, 메모리 누수 대처 방안을 정리합니다.1. 실전 시스템 백엔드 핵심 코드가독성을 위해 핵심 흐름만 요약했으며, 전체 예외 처리 및 상세 코드는 깃허브를 참고해 주세요.Pythonimport os import tempfile import threading import numpy as np import matplotlib.pyplot as plt import librosa import librosa.display import streamlit as st # 외부 연동 및 트래킹 백그라운드 처리 함수 def track_usage_async(app_name, action, details=None): try: # 데이터베이스 통신 수행 pass except Exception: pass # 메인 스레드 영향 차단 예외 우회 def analyze_voice_spectrum(human_audio_file, ai_audio_file): # 재실행 안정성: 파일 커서 위치 초기화 human_audio_file.seek(0) ai_audio_file.seek(0) # 물리 임시 파일 생성을 통한 디코딩 데드락 예방 human_ext = os.path.splitext(human_audio_file.name)[1] or ".mp3" ai_ext = os.path.splitext(ai_audio_file.name)[1] or ".mp3" with tempfile.NamedTemporaryFile(delete=False, suffix=human_ext) as tmp_human: tmp_human.write(human_audio_file.getvalue()) human_temp_path = tmp_human.name with tempfile.NamedTemporaryFile(delete=False, suffix=ai_ext) as tmp_ai: tmp_ai.write(ai_audio_file.getvalue()) ai_temp_path = tmp_ai.name fig, axes = plt.subplots(1, 2, figsize=(14, 5)) try: y_human, sr_human = librosa.load(human_temp_path, sr=None) y_ai, sr_ai = librosa.load(ai_temp_path, sr=None) # 푸리에 변환 및 dB 변환 db_human = librosa.amplitude_to_db(np.abs(librosa.stft(y_human)), ref=np.max) db_ai = librosa.amplitude_to_db(np.abs(librosa.stft(y_ai)), ref=np.max) # 서브플롯 렌더링 librosa.display.specshow(db_human, sr=sr_human, x_axis='time', y_axis='hz', ax=axes[0]) axes[0].set_title('Real Human Voice') librosa.display.specshow(db_ai, sr=sr_ai, x_axis='time', y_axis='hz', ax=axes[1]) axes[1].set_title('AI Voice (High-Frequency Cut-off)') st.pyplot(fig) finally: # 메모리 누수 방지: 자원 해제 및 임시 파일 삭제 plt.close(fig) if os.path.exists(human_temp_path): os.remove(human_temp_path) if os.path.exists(ai_temp_path): os.remove(ai_temp_path) 2. 음성 데이터 처리 시 실무 고려 메커니즘메인 UI 스레드 블로킹 방지 외부 데이터베이스 통신이나 통계 적재 로직을 분석 버튼 핸들러 내부에서 동기 방식으로 처리할 경우, 렌더링 스레드가 멈추는 지연 현상이 발생합니다. 이를 방지하기 위해 threading.Thread(..., daemon=True) 구조로 백그라운드 스레드로 격리하여 네트워크 통신 실패 시에도 분석 화면이 멈추지 않도록 구성해야 합니다.서버 자원 해제 (Resource Cleanup) Matplotlib 시각화 그래프 객체 및 디스크 물리 파일은 누적될 경우 서버 RAM을 지속적으로 오염시킵니다. 전체 처리 로직을 try-finally로 감싸 연산 성공 여부와 관계없이 plt.close(fig) 및 os.remove()가 강제 구동되도록 제어해야 합니다.3. 소스코드 및 구현 시연 안내해당 알고리즘 및 웹 대시보드가 실제 구동되는 꿀잼 시연 영상은 유튜브 콘텐츠를 참고해 주세요.🎬 유튜브 시연 영상: https://youtu.be/cThE0wH4EAY/📦 GitHub 소스코드: https://github.com/gohard-lab/voice_frequency_analyzer🚀 웹 앱 직접 실행해보기: https://voicefrequencyanalyzer-67zfryfptjxwdjofkymjyw.streamlit.app/📺 워드프레스: https://gohard.pe.kr/📺 잡학다식 개발자 유튜브 채널: https://www.youtube.com/@PolymathDev_KR

AI 실무 활용파이썬OpenCVTkinter이미지복원인페인팅메모리최적화이미지처리

채널톡 아이콘