AI 전처리 난이도 — 텍스트, 이미지, 오디오, 비디오, 3D 순서로 어려워진다
model(input)은 한 줄이지만, input을 만드는 전처리는 분야마다 완전히 다르다
AI 추론은 전부 이 구조다:
processed_input = preprocess(raw_data) # ← 여기가 분야마다 다름
output = model(processed_input) # ← 여기는 항상 같음
result = postprocess(output) # ← 여기도 분야마다 다름
model(input)은 PyTorch 텐서를 받아서 텐서를 뱉는 것뿐이다. 문제는 raw 데이터를 텐서로 바꾸는 전처리. 이게 분야마다 완전히 다르고, 난이도 차이가 크다.
1단계: 텍스트 — 토큰화 (난이도: ★☆☆☆☆)
가장 쉽다. AI 공부를 시작하려면 여기부터.
전처리가 뭔가: 문자열을 숫자 배열로 바꾸는 것. 그게 전부다.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# 전처리: 문자열 → 숫자 배열
tokens = tokenizer("안녕하세요")
print(tokens["input_ids"])
# → [31495, 230, 75265] (토큰 3개)
토크나이저는 사전(vocabulary)에서 단어/서브워드를 찾아 ID를 매기는 룩업 테이블이다. 신경망이 아니고, 학습도 없고, GPU도 필요 없다.
"안녕하세요" → ["안녕", "하", "세요"] → [31495, 230, 75265]
서브워드 분할 사전에서 ID 조회
왜 쉬운가:
차원이 1개 (시퀀스). 시간 축만 있다
값이 이산적 (정수 ID). 연속값이 아니다
변환이 결정적. 같은 문자열은 항상 같은 토큰
데이터 크기가 작다. 문장 하나 = 수십 개 정수
이 전처리로 할 수 있는 것:
텍스트 생성 (GPT, LLaMA)
번역 (MarianMT)
감정 분석 (BERT)
질의응답 (T5)
2단계: 정형 데이터 — 테이블 (난이도: ★★☆☆☆)
엑셀/CSV를 그대로 텐서로.
import torch
import pandas as pd
df = pd.read_csv("house_prices.csv")
# 전처리: 수치 정규화 + 범주형 인코딩
features = torch.tensor(df[["area", "rooms", "age"]].values, dtype=torch.float32)
# 정규화: (값 - 평균) / 표준편차
features = (features - features.mean(0)) / features.std(0)
# model(input) → output
price = model(features) # → 예측 가격
왜 비교적 쉬운가:
이미 숫자다 (대부분)
정규화(스케일 맞추기)가 전처리의 대부분
범주형 데이터만 원핫 인코딩 필요
3단계: 이미지 — 리사이즈 + 정규화 (난이도: ★★☆☆☆)
텍스트 다음으로 쉽다.
from torchvision import transforms
from PIL import Image
# 전처리 파이프라인
preprocess = transforms.Compose([
transforms.Resize(224), # 크기 통일
transforms.CenterCrop(224), # 정사각형 크롭
transforms.ToTensor(), # [0,255] → [0,1] 실수
transforms.Normalize( # ImageNet 평균/표준편차로 정규화
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
image = Image.open("cat.jpg")
tensor = preprocess(image) # [3, 224, 224] — 3채널(RGB), 224×224
# model(input) → output
output = model(tensor.unsqueeze(0)) # → 1000개 클래스 확률
전처리가 하는 일:
cat.jpg (1920×1080, uint8)
↓ Resize + CenterCrop
[224, 224, 3] (크기 통일)
↓ ToTensor
[3, 224, 224] (0~1 실수, 채널 먼저)
↓ Normalize
[3, 224, 224] (ImageNet 분포에 맞춤)
왜 비교적 쉬운가:
차원이 2개 (높이 × 너비) + 채널. 직관적이다
리사이즈·크롭·정규화 3개가 전부
torchvision이 전부 해준다
왜 텍스트보다 어려운가:
값이 연속적 (0.0~1.0 실수)
데이터가 크다 (224×224×3 = 150,528개 실수 vs 텍스트 수십 개 정수)
정규화 기준(mean/std)을 알아야 한다
4단계: 오디오 — STFT + 멜 스펙트로그램 (난이도: ★★★★☆)
여기서부터 확 어려워진다.
import torch
import torchaudio
wav, sr = torchaudio.load("speech.mp3") # [2, 441000] — 10초 스테레오
# 전처리: 파형 → 멜 스펙트로그램
mel_transform = torchaudio.transforms.MelSpectrogram(
sample_rate=sr,
n_fft=2048, # FFT 윈도우 크기
hop_length=512, # 윈도우 이동 간격
n_mels=80 # 멜 밴드 수
)
mel_spec = mel_transform(wav) # [2, 80, 862]
log_mel = torch.log(mel_spec + 1e-9) # 로그 스케일 (인간 청각 모방)
# model(input) → output
output = model(log_mel)
전처리가 하는 일:
speech.mp3
↓ torchaudio.load()
[2, 441000] (raw 파형, 시간 도메인)
↓ STFT (n_fft=2048, hop=512)
[2, 1025, 862] (주파수 × 시간, 복소수)
↓ 멜 필터 뱅크 적용
[2, 80, 862] (80개 멜 밴드 × 시간)
↓ log()
[2, 80, 862] (로그 멜 스펙트로그램)
왜 어려운가:
STFT를 이해해야 한다 (푸리에 변환 = 대학 수학)
n_fft, hop_length, n_mels 등 하이퍼파라미터가 모델마다 다르다
시간 도메인 ↔ 주파수 도메인 변환이 직관적이지 않다
샘플레이트, 모노/스테레오, 정규화 방식이 모델마다 다르다
후처리(ISTFT, 보코더)도 복잡하다
왜 이미지보다 어려운가:
이미지는 "그림"이라 직관적. 오디오 스펙트로그램은 "보이지 않는 소리의 주파수 표현"
이미지는 리사이즈 하나면 끝. 오디오는 STFT 파라미터를 모델에 맞춰야 한다
이미지의 후처리는 argmax. 오디오는 ISTFT나 보코더가 필요
5단계: 비디오 — 프레임 추출 + 시간 축 (난이도: ★★★★☆)
이미지 + 시간 차원이 추가된다.
import torchvision
from torchvision.io import read_video
# 전처리: 비디오 → 프레임 시퀀스
video, audio, info = read_video("clip.mp4", pts_unit="sec", start_pts=0, end_pts=3)
# video: [90, 720, 1280, 3] — 90프레임(3초×30fps), 720p, RGB
# 프레임 샘플링 (90프레임 → 16프레임)
indices = torch.linspace(0, len(video)-1, 16).long()
frames = video[indices] # [16, 720, 1280, 3]
# 각 프레임을 이미지처럼 전처리
preprocess = torchvision.transforms.Compose([
torchvision.transforms.Resize(224),
torchvision.transforms.CenterCrop(224),
torchvision.transforms.ConvertImageDtype(torch.float32),
torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
processed = torch.stack([preprocess(f.permute(2,0,1)) for f in frames])
# [16, 3, 224, 224] — 16프레임, 각 224×224
# model(input) → output
output = model(processed.unsqueeze(0)) # → "액션: 달리기"
왜 이미지보다 어려운가:
차원이 하나 더 있다 (시간). [프레임수, 채널, 높이, 너비]
프레임 샘플링 전략이 필요 (균등 샘플링? 키프레임? 랜덤?)
데이터가 매우 크다 (16×3×224×224 = 2.4M 실수)
오디오 트랙도 동시에 처리해야 하는 경우가 많다
6단계: 3D / 점군 — 복셀화 + 정규화 (난이도: ★★★★★)
가장 어렵다.
import torch
import open3d as o3d
import numpy as np
# 전처리: 3D 스캔 → 점군 → 정규화
pcd = o3d.io.read_point_cloud("scan.ply")
points = np.asarray(pcd.points) # [N, 3] — N개 점, (x,y,z)
# 중심 이동 + 단위 구로 정규화
centroid = points.mean(axis=0)
points -= centroid
max_dist = np.linalg.norm(points, axis=1).max()
points /= max_dist
# 포인트 수 통일 (FPS: Farthest Point Sampling)
if len(points) > 1024:
indices = farthest_point_sampling(points, 1024)
points = points[indices]
tensor = torch.tensor(points, dtype=torch.float32) # [1024, 3]
# model(input) → output
output = model(tensor.unsqueeze(0)) # → "객체: 의자"
왜 가장 어려운가:
데이터가 비정형이다 (점 개수가 매번 다름)
점의 순서가 의미 없다 (순서 불변성)
3D 좌표계 정렬이 필요 (회전, 이동, 스케일)
복셀화(voxelization), 메시 변환 등 추가 전처리
라이브러리 생태계가 텍스트/이미지만큼 성숙하지 않다
전체 난이도 비교
| 순위 | 분야 | 전처리 | 난이도 | 입문 추천 |
|---|---|---|---|---|
| 1 | 텍스트 | 토큰화 (룩업 테이블) | ★☆☆☆☆ | 최추천 |
| 2 | 정형 데이터 | 정규화 + 원핫 인코딩 | ★★☆☆☆ | 추천 |
| 3 | 이미지 | 리사이즈 + 정규화 | ★★☆☆☆ | 추천 |
| 4 | 오디오 | STFT + 멜 스펙트로그램 | ★★★★☆ | 기초 후 |
| 5 | 비디오 | 프레임 추출 + 이미지 처리 | ★★★★☆ | 이미지 후 |
| 6 | 3D | 점군 + 복셀 + 정규화 | ★★★★★ | 고급 |
AI 공부 순서 추천
1. 텍스트부터 시작 — 전처리가 토큰화뿐이라 model(input)의 본질에 집중할 수 있다. HuggingFace transformers로 감정 분석이나 텍스트 생성을 해보면 된다.
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
print(classifier("I love this!"))
# → [{'label': 'POSITIVE', 'score': 0.9998}]
이게 AI 추론의 전부다. 전처리(토큰화)는 pipeline이 알아서 한다.
2. 이미지로 넘어간다 — 차원이 하나 늘어나지만(1D→2D) 전처리는 여전히 단순하다. MNIST 손글씨 분류가 고전적인 입문 프로젝트.
3. 그다음 오디오 — STFT를 이해해야 하니까 텍스트/이미지를 먼저 익힌 후가 좋다. Whisper로 음성 인식을 해보면 된다.
4. 비디오는 이미지 후에 — 이미지 처리를 알면 프레임마다 같은 걸 적용하고 시간 축만 추가하면 된다.
5. 3D는 나중에 — 전처리가 가장 복잡하고 라이브러리 생태계도 덜 성숙하다.
핵심
전처리가 복잡할수록 "model(input) 한 줄"에 도달하기까지 알아야 할 게 많다. 텍스트는 그 거리가 가장 짧다. 그래서 AI 입문은 텍스트가 맞다.
핵심 개념
텍스트 (★☆☆☆☆) — 토큰화는 룩업 테이블. 문자열 → 정수 배열. 가장 쉽다
이미지 (★★☆☆☆) — 리사이즈 + 정규화. [3, 224, 224] 텐서로 변환
오디오 (★★★★☆) — STFT + 멜 필터 뱅크 + 로그 스케일. 푸리에 변환 이해 필요
비디오 (★★★★☆) — 프레임 샘플링 + 이미지 전처리 × N프레임 + 시간 차원
3D (★★★★★) — 점군 정규화 + FPS + 좌표계 정렬. 가장 어렵다