Deep Learning/cs231n

cs231n Lecture 2 - Image Classification

준성(JunSeong) 2026. 5. 29. 13:37

Stanford cs231n: Deep Learning for Computer Vision 강의 정리 시리즈
챕터 2 - Image Classification
#cs231n#딥러닝#ImageClassification#KNN#컴퓨터비전

1. Image Classification이란?

말 그대로 이미지를 보고 "이거 고양이야", "이거 트럭이야" 같은 식으로 미리 정해진 카테고리 중 하나로 분류하는 태스크다. 간단해 보이지만 실제로 CV 분야에서 굉장히 핵심적인 문제고, 나중에 배울 object detection이나 segmentation 같은 더 복잡한 태스크들도 결국 이 image classification으로 환원되는 경우가 많다.

Image Classification 개념

▲ 입력 이미지 → 미리 정해진 레이블 중 하나를 출력 (출처: cs231n Lecture 2)


2. 컴퓨터가 이미지를 보는 방식 (Semantic Gap)

우리한테는 그냥 고양이 사진이지만, 컴퓨터 입장에서는 0~255 사이 숫자가 쭉 늘어선 3차원 배열이다. 800×600 RGB 이미지면 숫자가 무려 1,440,000개. 거기서 "고양이다"라는 의미를 뽑아내야 하는 거다.

이 간극을 Semantic Gap이라고 부른다. 인간이 직관적으로 느끼는 "의미"와 컴퓨터가 처리하는 "픽셀값" 사이의 거리. 조명이 조금만 바뀌어도 수천 개의 픽셀값이 한꺼번에 달라지는데, 우리가 원하는 건 그런 변화에도 "고양이"라고 제대로 인식하는 알고리즘이다.

Semantic Gap

▲ 컴퓨터가 실제로 보는 것 - 숫자 행렬 (출처: cs231n Lecture 2)


3. Challenges

그래서 image classification이 왜 어려운지, 강의에서는 아래 6가지 요인을 이야기한다.

Challenge 설명
Viewpoint variation 카메라 각도가 달라지면 픽셀값이 완전히 바뀜
Illumination 조명에 따라 밝기, 색상이 달라짐
Deformation 고양이는 자세를 마음대로 바꿈
Occlusion 물체 일부가 가려질 수 있음
Background clutter 배경이랑 물체 색이 비슷해서 구분 어려움
Intraclass variation 같은 "고양이"라도 생김새가 너무 다양함

인간 시각 시스템은 이걸 너무 자연스럽게 처리해서 얼마나 복잡한 문제인지 잘 못 느끼는데, 직접 구현하려고 하면 그때서야 실감이 온다.


4. Data-Driven Approach

예전엔 이런 식으로 접근했다 - "고양이는 귀가 뾰족하고 수염이 있고..." 이렇게 규칙을 직접 코딩하는 방식. 근데 이게 왜 망했냐면, 예외가 너무 많고, 다른 클래스로 확장하려면 처음부터 다시 만들어야 하고, 복잡도가 감당이 안 됐기 때문이다.

그래서 나온 게 Data-Driven Approach다. "내가 규칙을 정의한다"에서 "데이터가 규칙을 만들게 한다"로의 전환인데, 이게 현대 딥러닝의 근간이 되는 발상이다.

1. 각 카테고리 이미지를 대량으로 수집
2. ML 알고리즘으로 학습(train)
3. 새로운 이미지 분류(predict)
train/predict 함수 코드

5. Nearest Neighbor Classifier

Data-Driven Approach를 가장 단순하게 구현한 것이 Nearest Neighbor다. 아이디어 자체는 단순한데, 테스트 이미지랑 가장 비슷한 학습 이미지를 찾아서 그 레이블을 그대로 쓰는 방식이다.

"비슷하다"를 어떻게 정의할지가 문제인데, 여기서는 L1 Distance를 쓴다.

$$d_1(I_1, I_2) = \sum_{p} \left| I_1^p - I_2^p \right|$$

픽셀별 차이의 절댓값을 다 더한 값이다. 구현해보면 이렇다:

NearestNeighbor 구현 코드

시간복잡도를 보면 train은 O(1), predict는 O(N)이다. train이 빠른 대신 predict가 느린 구조인데, 실제 서비스에서는 반대가 이상적이다. 학습은 오래 걸려도 되지만, 추론은 빨라야 하니까. 그래서 NN은 실용성이 떨어진다.


6. K-Nearest Neighbors (KNN)

NN의 확장판이다. 가장 가까운 이미지 1개만 보는 게 아니라, K개를 보고 다수결로 결정한다. K=1이면 그냥 NN이고, K가 커질수록 결정 경계가 부드러워진다.

K=1일 때 문제가 뭔지는 아래 그림에서 바로 보인다. 초록 영역 한가운데 노란 섬이 생기는 것처럼, 이상치 하나에 경계가 민감하게 반응한다. K를 키우면 주변 다수 의견을 반영하니까 이런 이상한 영역이 없어진다.

KNN K=1 Decision Boundary

▲ K=1일 때 - 이상치에 민감해서 섬 같은 영역이 생김 (출처: cs231n Lecture 2)

KNN K=1,3,5 비교

▲ K가 커질수록 경계가 부드러워짐 (출처: cs231n Lecture 2)

sklearn KNN 코드

K랑 distance metric 둘 다 우리가 직접 정해줘야 하는 값이다. 이런 걸 하이퍼파라미터라고 부른다.


7. Distance Metrics: L1 vs L2

"가깝다"를 어떻게 정의할지는 선택 사항이고, 대표적으로 L1이랑 L2 두 가지가 있다.

L1 Distance (Manhattan)

$$d_1(I_1, I_2) = \sum_{p} \left| I_1^p - I_2^p \right|$$

L2 Distance (Euclidean)

$$d_2(I_1, I_2) = \sqrt{\sum_{p} \left( I_1^p - I_2^p \right)^2}$$
L1 vs L2 Distance

▲ L1은 다이아몬드 형태, L2는 원형 등거리 경계 (출처: cs231n Lecture 2)

둘의 차이를 정리하면:

  L1 L2
등거리 경계 모양 다이아몬드
이상치 민감도 상대적으로 robust 더 민감 (제곱 때문)
좌표 회전 시 거리 변함 불변
언제 쓰면 좋냐 피처가 독립적인 의미를 가질 때 피처 관계를 잘 모를 때

어떤 게 항상 좋다는 건 없고, 데이터마다 다르다. 결국 실험해보는 수밖에 없다.


8. Hyperparameter Tuning & Validation Set

K랑 distance metric처럼 학습 전에 사람이 직접 정해야 하는 값을 하이퍼파라미터라고 한다. 근데 이걸 어떻게 골라야 할까?

Setting Hyperparameters 3가지 방법

▲ 3가지 시나리오 - Idea #3이 올바른 방법 (출처: cs231n Lecture 2)

강의에서 3가지 시나리오를 이야기하는데:

  • Idea #1 - 전체 데이터로 학습하고 같은 데이터로 테스트. K=1이면 항상 100% 나와서 의미가 없다.
  • Idea #2 - train/test로만 나눠서 test로 튜닝. 그러면 test set에 과적합되는 거라 의미가 없다.
  • Idea #3 - train / validation / test 3분할. 이게 맞는 방법이다.
전체 데이터
├── Train set      (70~80%) → 학습
├── Validation set (10~20%) → 하이퍼파라미터 튜닝
└── Test set       (10~20%) → 최종 평가 (딱 한 번만)

수능에 비유하면, train은 교과서, validation은 모의고사, test는 수능이다. 수능 문제로 미리 공부하면 의미가 없는 것처럼, test set으로 튜닝하면 진짜 성능을 알 수 없다.

Cross-Validation

Cross-Validation fold 다이어그램

▲ 5-fold Cross-Validation - 각 fold를 돌아가며 validation으로 사용 (출처: cs231n Lecture 2)

데이터가 적을 때 쓰는 방법이다. train 데이터를 K개 fold로 나눠서 돌아가며 validation으로 쓰고, 결과를 평균낸다. 딥러닝에서는 데이터도 많고 학습 시간도 길어서 거의 안 쓰고, 전통적인 ML에서 많이 쓴다.


9. KNN의 한계

KNN이 이미지 분류에서 잘 안 쓰이는 이유가 크게 3가지 있다.

1) 예측이 너무 느림

CNN 같은 parametric model이랑 정반대 구조다.

  KNN CNN (Parametric)
Train O(1) - 저장만 O(느림) - W 학습
Predict O(N) - 전체 비교 O(1) - W 곱셈만

서비스 입장에서는 학습이 오래 걸리는 건 괜찮은데, 추론이 느리면 곤란하다. 모바일이나 저전력 기기에서도 돌아가야 하니까. KNN은 이 기대랑 정반대여서 실제 서비스에 쓰기가 어렵다.

2) 픽셀 거리는 시각적 의미랑 무관함

L1/L2 distance는 지각적 유사성을 반영하지 못한다. 원본 이미지를 조금 이동하거나, 밝기를 바꾸거나, 일부를 가려도 L2 distance는 비슷하게 나올 수 있다. 반대로 완전히 다른 이미지인데 거리가 가까울 수도 있고. 픽셀을 그냥 숫자 벡터로 보고 거리를 재는 게 이미지의 "의미"를 전혀 안 담는다는 뜻이다.

3) 차원의 저주 (Curse of Dimensionality)

KNN이 제대로 동작하려면 공간을 촘촘히 채울 만큼 데이터가 있어야 한다.

$$ ext{필요 데이터 수} \propto k^d \quad (d: ext{차원 수})$$

1차원이면 10개로 충분하지만, 차원이 늘어날수록 필요한 데이터가 기하급수적으로 증가한다. 이미지는 수천 차원 이상이니까 사실상 불가능한 얘기다.


10. Linear Classification 맛보기

KNN의 한계를 넘기 위한 다음 단계가 parametric approach다. 그중 가장 기본 형태가 Linear Classifier.

Parametric Approach Linear Classifier

▲ f(x, W) = Wx + b 구조 (출처: cs231n Lecture 2)

$$f(x, W) = Wx + b$$
  • \(x\): 입력 이미지 벡터 (32×32×3 = 3072차원)
  • \(W\): 가중치 행렬, shape \((C, D)\)
  • \(b\): bias, shape \((C,)\)
  • 출력: 각 클래스의 score

아래 예시처럼 4픽셀짜리 이미지를 열벡터로 펼치고 W를 곱한 뒤 b를 더하면 각 클래스의 점수가 나온다.

Linear Classifier 행렬 연산 예시

▲ 4픽셀 3클래스 예시 - W·x + b 계산 과정 (출처: cs231n Lecture 2)

# CIFAR-10 예시 (10개 클래스)
# x: (3072,), W: (10, 3072), b: (10,)
scores = W @ x + b

KNN이랑 핵심 차이는, KNN은 예측할 때 학습 데이터를 전부 들고 다녀야 하는 반면, parametric model은 학습 데이터의 정보를 W에 다 압축해버린다. 그래서 예측 시에는 W만 있으면 되고, 속도가 훨씬 빠르다.

W의 의미

W의 각 행을 이미지로 시각화하면 그 클래스의 "평균적인 생김새" 같은 게 나온다. 즉 Linear Classifier는 클래스마다 하나의 템플릿을 학습하고, 입력 이미지가 어떤 템플릿이랑 가장 비슷한지 내적으로 계산하는 것으로 볼 수 있다.

한계

Hard cases for linear classifier

▲ 선형 경계 하나로는 분류할 수 없는 패턴들 (출처: cs231n Lecture 2)

문제가 있는데, 클래스당 템플릿이 딱 하나다. 다양한 변형을 평균화해버리니까 제대로 된 표현이 어렵다. (말 이미지를 학습하면 머리가 양쪽에 달린 괴상한 말이 나오는 게 대표적인 예.) 거기다 위 그림처럼 선형 경계 하나로 분리할 수 없는 패턴은 아예 처리를 못 한다.

결국 "W를 어떻게 잘 학습시킬 것인가"가 핵심 문제가 되는데, 이게 다음 강의인 Lecture 3 (Loss Function + Optimization)의 주제다.


핵심 요약

개념 한 줄 요약
Image Classification 이미지 → 미리 정의된 레이블 출력
Semantic Gap 픽셀값과 이미지 의미 사이의 간극
Data-Driven Approach 규칙 코딩 대신 데이터로 패턴 학습
Nearest Neighbor 가장 비슷한 학습 이미지 레이블 그대로 사용. O(1) train / O(N) predict
KNN K개 투표로 결정. K > 1이어야 경계가 부드러워짐
L1 vs L2 거리 측정 방법. 둘 다 하이퍼파라미터. L2는 이상치에 더 민감
Validation Set 하이퍼파라미터 튜닝용. Test set은 최종 평가에만
KNN의 한계 느린 예측 / 픽셀 거리 무의미 / 차원의 저주
Linear Classifier \(f(x,W)=Wx+b\). 데이터 정보를 W에 압축

참고


다음: Lecture 3 - Loss Functions and Optimization