📊

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 입문은 텍스트가 맞다.

핵심 개념

1

텍스트 (★☆☆☆☆) — 토큰화는 룩업 테이블. 문자열 → 정수 배열. 가장 쉽다

2

이미지 (★★☆☆☆) — 리사이즈 + 정규화. [3, 224, 224] 텐서로 변환

3

오디오 (★★★★☆) — STFT + 멜 필터 뱅크 + 로그 스케일. 푸리에 변환 이해 필요

4

비디오 (★★★★☆) — 프레임 샘플링 + 이미지 전처리 × N프레임 + 시간 차원

5

3D (★★★★★) — 점군 정규화 + FPS + 좌표계 정렬. 가장 어렵다

사용 사례

AI 학습 로드맵 — 텍스트 → 이미지 → 오디오 → 비디오 → 3D 순서로 공부 프로젝트 난이도 판단 — 다루는 데이터 타입으로 전처리 복잡도 예측 전처리 파이프라인 설계 — 각 분야의 표준 전처리 패턴 파악