AI를 활용한 서비스를 개발하다 보면 공개된 모델이나 외부 API를 사용하는 경우가 많습니다. 하지만 이번에는 직접 모델을 학습하고 모바일 기기에 탑재하는 프로젝트를 진행해 보려고 합니다.
제가 만들려는 서비스는 여행 사진을 분석하고, 사진 속 장소의 특징을 추출해 간결한 일러스트로 변환하는 AI 애플리케이션입니다.
여행지에서 촬영한 여러 장의 사진을 하나의 포스터로 구성하고, 인스타그램과 같은 SNS에 공유하는 것이 최종 목표입니다.
이번 글에서는 AI 모델을 학습하기에 앞서 NVIDIA RTX 5070 Ti 환경에서 Conda와 PyTorch를 설정하고, Python으로 첫 번째 여행 사진을 전처리하는 과정까지 정리해 보겠습니다.
1. 여행 사진 추상화 AI 프로젝트
프로젝트에서 구현하려는 기능은 단순한 이미지 필터와는 조금 다릅니다.
예를 들어 전통 정자를 촬영한 사진이 있다면 AI가 기와지붕의 곡선, 기둥의 배치, 주변 풍경과 같은 특징을 추출하는 것입니다.
그다음 불필요한 질감과 복잡한 배경을 제거하고, 핵심 형태만 남긴 일러스트로 변환하려고 합니다.
최종적으로는 다음과 같은 흐름을 생각하고 있습니다.
여행 사진 선택
↓
이미지 특징 분석
↓
주요 피사체 추출
↓
이미지 추상화
↓
여행 포스터 생성
↓
Android 앱에서 SNS 공유
개발 방향은 다음과 같이 결정했습니다.
| 구분 | 개발 방향 |
| 첫 출시 플랫폼 | Android |
| 개발 및 학습 환경 | Ubuntu + RTX 5070 Ti |
| AI 프레임워크 | PyTorch |
| 가상환경 | Conda |
| 우선순위 | 이미지 품질 |
| 최종 목표 | Android 온디바이스 AI |
모델을 처음부터 학습하는 것도 가능하겠지만, 우선 공개된 AI 모델을 활용해 원하는 결과물을 구현할 수 있는지 확인하려고 합니다.
필요하다면 추후 LoRA 등의 기술을 활용해 파인튜닝하는 방향으로 진행할 예정입니다.
2. RTX 5070 Ti GPU 환경 확인
딥러닝 모델을 학습하려면 GPU 환경부터 확인해야 합니다.
현재 사용 중인 개발 PC에는 NVIDIA GeForce RTX 5070 Ti가 장착되어 있습니다.
Ubuntu 터미널에서 다음 명령어를 실행합니다.
nvidia-smi
실행 결과 주요 정보는 다음과 같습니다.
NVIDIA-SMI 595.99.02
Driver Version: 595.99.02
CUDA Version: 13.2
GPU: NVIDIA GeForce RTX 5070 Ti
Memory: 16303 MiB
GPU는 정상적으로 인식되었고, 약 16GB의 VRAM을 사용할 수 있는 것을 확인했습니다.
여기서 한 가지 궁금했던 점은 CUDA 버전입니다.
CUDA 13.2인데 PyTorch는 CUDA 12.8을 사용해도 될까?
nvidia-smi에 표시되는 CUDA 버전은 NVIDIA 드라이버가 지원하는 CUDA 버전입니다.
반면 PyTorch 패키지에서 사용하는 CUDA 버전은 해당 패키지가 빌드된 CUDA 환경을 의미합니다.
일반적으로 최신 NVIDIA 드라이버는 이전 CUDA 버전으로 빌드된 프로그램도 실행할 수 있습니다.
따라서 현재 환경에서는 CUDA 12.8 기반 PyTorch 패키지로 시작하기로 했습니다.
다만 드라이버가 GPU를 인식하는 것과 PyTorch가 실제 GPU 연산을 수행하는 것은 별개의 문제이므로 설치 후 확인이 필요합니다.
3. Conda 가상환경 생성
Python으로 AI 프로젝트를 진행할 때 가상환경을 사용하는 이유는 프로젝트마다 필요한 라이브러리와 버전이 다르기 때문입니다.
특히 PyTorch, CUDA 관련 패키지는 버전 호환성이 중요합니다.
이번 프로젝트에서는 Python 3.11을 사용했습니다.
먼저 Conda가 설치되어 있는지 확인합니다.
conda --version
Conda가 설치되어 있다면 프로젝트 전용 가상환경을 생성합니다.
conda create -n travel-ai python=3.11 -y
가상환경을 활성화합니다.
conda activate travel-ai
정상적으로 활성화되면 터미널에 다음과 같이 표시됩니다.
(travel-ai) user@ubuntu:~$
Python 버전도 확인합니다.
python --version
Python 3.11.x
마지막으로 pip을 업데이트합니다.
python -m pip install --upgrade pip
이렇게 하면 AI 프로젝트에 사용할 독립적인 Python 환경이 준비됩니다.
4. PyTorch 설치
PyTorch는 딥러닝 모델을 개발하고 학습할 때 사용하는 오픈소스 프레임워크입니다.
텐서 연산과 자동 미분 기능을 제공하며, CUDA를 활용해 GPU에서 연산을 수행할 수 있습니다.
이번 프로젝트에서는 CUDA 12.8 기반 PyTorch 패키지를 사용합니다.
python -m pip install \
torch==2.10.0 \
torchvision==0.25.0 \
--index-url https://download.pytorch.org/whl/cu128
설치가 완료되면 다음 코드로 확인할 수 있습니다.
import torch
print("PyTorch:", torch.__version__)
print("CUDA:", torch.version.cuda)
print("GPU 사용 가능:", torch.cuda.is_available())
torch.cuda.is_available()가 True를 반환하면 PyTorch가 CUDA 장치를 사용할 수 있다는 의미입니다.
GPU 이름도 확인할 수 있습니다.
print(torch.cuda.get_device_name(0))
예상 결과는 다음과 같습니다.
NVIDIA GeForce RTX 5070 Ti
GPU에서 실제 연산이 수행되는지도 확인할 수 있습니다.
a = torch.rand(1024, 1024, device="cuda")
b = torch.rand(1024, 1024, device="cuda")
c = torch.matmul(a, b)
torch.cuda.synchronize()
print(c.shape)
print(c.device)
이 코드는 GPU 메모리에 두 개의 행렬을 생성한 뒤 행렬 곱셈을 수행합니다.
연산이 정상적으로 완료되고 cuda:0이 출력되면 GPU 연산이 정상적으로 실행된 것입니다.
참고: 이 GPU 연산 테스트는 환경 검증용 코드입니다. 실제 테스트 결과를 블로그에 기록할 때는 실행한 PC에서 확인한 출력값을 사용하는 것이 좋겠습니다.
5. 이미지 처리 라이브러리 설치
모델 학습에 앞서 여행 사진을 불러오고 전처리할 수 있어야 합니다.
이번에는 다음 라이브러리를 설치했습니다.
python -m pip install \
opencv-python \
pillow \
numpy \
matplotlib
각 라이브러리는 다음과 같은 용도로 사용합니다.
| 라이브러리 | 용도 |
| OpenCV | 이미지 처리 및 특징 분석 |
| Pillow | 이미지 파일 읽기 및 저장 |
| NumPy | 이미지 배열 연산 |
| Matplotlib | 이미지 및 분석 결과 시각화 |
아직 AI 모델을 학습하는 단계가 아니므로 이번에는 Pillow를 이용한 기본 이미지 전처리부터 구현했습니다.
6. AI 프로젝트 디렉터리 구성
프로젝트 이름은 travel-illustration-ai로 정했습니다.
앞으로 모델 학습, 이미지 처리, 추론, Android 모델 변환 등을 진행할 예정이므로 기능별로 디렉터리를 구분했습니다.
travel-illustration-ai/
│
├── datasets/
│ ├── raw/
│ ├── processed/
│ └── targets/
│
├── outputs/
│ ├── preprocessing/
│ └── illustrations/
│
├── models/
│
├── src/
│ ├── preprocessing/
│ ├── inference/
│ └── training/
│
├── configs/
│
└── docs/
datasets/raw에는 원본 사진을 보관하고, datasets/processed에는 전처리된 이미지를 저장합니다.
datasets/targets는 향후 모델 학습에 사용할 목표 일러스트 이미지를 관리하기 위한 디렉터리입니다.
src에는 Python 코드를 기능별로 구분해 작성할 예정입니다.
초기 프로젝트이므로 지나치게 복잡하게 구성하지 않고, 개발하면서 필요한 구조를 추가하려고 합니다.
7. Python으로 여행 사진 전처리하기
이제 실제 사진을 처리해 보겠습니다.
이번에 사용할 사진은 여행 중 촬영한 전통 정자 사진입니다.
원본 이미지 파일은 다음 위치에 저장했습니다.
원본 이미지 경로
datasets/raw/DSC05133.JPG
이미지 전처리 과정에서는 다음 작업을 수행합니다.
- 원본 이미지 불러오기
- EXIF 방향 정보 적용
- RGB 색상 형식으로 변환
- 이미지 비율을 유지하면서 크기 조정
- PNG 파일로 저장
이미지 전처리 코드
파일 위치: src/preprocessing/prepare_image.py
from pathlib import Path
from PIL import Image, ImageOps
PROJECT_ROOT = Path(__file__).resolve().parents[2]
INPUT_PATH = (
PROJECT_ROOT
/ "datasets/raw/DSC05133.JPG"
)
OUTPUT_PATH = (
PROJECT_ROOT
/ "datasets/processed/DSC05133.png"
)
MAX_SIZE = 1024
def prepare_image():
if not INPUT_PATH.exists():
raise FileNotFoundError(
f"원본 이미지가 없습니다: {INPUT_PATH}"
)
with Image.open(INPUT_PATH) as source:
image = ImageOps.exif_transpose(source)
image = image.convert("RGB")
print("원본 이미지 크기:", image.size)
image.thumbnail(
(MAX_SIZE, MAX_SIZE),
Image.Resampling.LANCZOS
)
print("변환 이미지 크기:", image.size)
OUTPUT_PATH.parent.mkdir(
parents=True,
exist_ok=True
)
image.save(OUTPUT_PATH)
print("전처리 완료")
print("저장 위치:", OUTPUT_PATH)
if __name__ == "__main__":
prepare_image()
이미지 전처리에서 고려한 부분
첫 번째는 이미지 방향입니다.
스마트폰이나 카메라로 촬영한 사진에는 EXIF 회전 정보가 포함될 수 있습니다.
ImageOps.exif_transpose()를 사용하면 해당 방향 정보를 적용할 수 있습니다.
두 번째는 이미지 크기입니다.
원본 사진을 그대로 모델에 입력하면 이미지 크기가 커서 메모리 사용량과 처리 시간이 증가할 수 있습니다.
따라서 이번에는 긴 변이 최대 1024픽셀이 되도록 설정했습니다.
image.thumbnail(
(MAX_SIZE, MAX_SIZE),
Image.Resampling.LANCZOS
)
thumbnail()은 가로세로 비율을 유지하면서 이미지 크기를 조정합니다.
또한 원본이 이미 지정한 크기보다 작다면 불필요하게 확대하지 않습니다.
세 번째는 색상 형식입니다.
이미지를 RGB로 변환해 이후 모델 입력 과정에서 색상 형식 차이로 발생할 수 있는 문제를 줄였습니다.
마지막으로 PNG 형식으로 저장했습니다.
PNG는 무손실 압축을 지원하므로 이번 전처리 과정에서 추가적인 JPEG 압축 손실을 피할 수 있습니다.
다만 크기 조정 자체로 인한 세부 정보 손실까지 없어지는 것은 아닙니다.
8. 이미지 전처리 실행 결과
프로젝트 루트 디렉터리에서 Python 파일을 실행합니다.
python src/preprocessing/prepare_image.py
실행 과정에서 처음에는 다음 오류가 발생했습니다.
[Errno 2] No such file or directory
이 오류는 Python 실행 파일이나 참조하는 이미지 경로가 일치하지 않을 때 발생할 수 있습니다.
따라서 현재 작업 디렉터리와 파일 경로를 확인했습니다.
pwd
ls -l src/preprocessing/
ls -l datasets/raw/
현재 작업 위치와 파일 경로를 확인한 후 다시 실행했고, 이미지가 정상적으로 처리되는 것을 확인했습니다.
결과 파일은 다음 경로에 생성됩니다.
datasets/processed/DSC05133.png
이번 전처리에서는 이미지 방향과 비율을 유지하면서 크기와 색상 형식을 정규화했습니다.
아직 AI가 사진의 특징을 추출하거나 일러스트로 변환한 것은 아닙니다.
하지만 이후 모델을 적용하기 위한 첫 번째 이미지 처리 환경을 구축했다는 점에 의미를 두고 싶습니다.
9. 첫 번째 개발 단계를 마치며
이번 작업에서는 AI 모델을 학습하기 위한 개발 환경을 구성하고, 실제 여행 사진을 Python으로 처리했습니다.
현재까지 진행한 작업은 다음과 같습니다.
- NVIDIA RTX 5070 Ti 및 CUDA 환경 확인
- Conda 가상환경 구성
- PyTorch 개발 환경 준비
- OpenCV, Pillow 등 이미지 처리 라이브러리 설치
- AI 프로젝트 디렉터리 구성
- Python 이미지 전처리 구현 및 실행
모델을 직접 학습한다는 것이 처음에는 어렵게 느껴졌지만, 우선 개발 환경을 준비하고 작은 기능부터 구현하는 방식으로 진행하고 있습니다.
앞으로 중요한 것은 단순히 이미지를 변환하는 것이 아니라 사진 속 장소의 특징을 얼마나 잘 보존하면서 단순한 일러스트로 표현할 수 있는가입니다.
다음 단계에서는 공개 이미지 분할 모델인 SAM 2를 활용해 사진에서 주요 피사체를 추출해 볼 예정입니다.
전통 정자 사진에서 지붕과 기둥을 포함한 건축물 영역을 분리하고, 추출한 결과를 바탕으로 이미지 추상화 과정을 발전시켜 보겠습니다.
최종적으로는 직접 학습하거나 최적화한 모델을 Android 기기에 탑재하는 것까지 진행할 계획입니다.
참고 자료
'개발 & IT > 머신러닝 & 딥러닝' 카테고리의 다른 글
| AI 코딩 에이전트가 CUDA를 10시간 만에 대체했다? 실제 성과와 과장된 해석 (0) | 2026.08.06 |
|---|---|
| Kimi K3 내 컴퓨터에서 돌릴 수 있을까? 현실적인 사용 방법 (0) | 2026.07.29 |
| Jetson Orin Nano 가장 쉽게 시작하는 법: 점퍼·USB 없이 SD카드 하나로 끝내는 설치법 (0) | 2026.01.16 |
| “AI 모델을 만든다”는 말, 도대체 무슨 뜻일까? (1) | 2025.12.31 |
| ChromaDB란? (벡터DB, RAG 실험에 딱 좋은 로컬 서버) (0) | 2025.12.30 |





















































