cs231보다 최신 버전인 미시간 대학교의 Deep Learning for Computer Vision 강의를 정리하며 Deep Learning 기초를 잡아보고자 한다.
2강에서는 이미지 분류에 대한 기본적인 내용을 다룬다.
- Image Classification?

Image Classification이란 입력으로 이미지가 주어졌을 때 어떤 알고리즘이 출력으로 이미지가 어떤 분류에 속하는지 할당하는 것이다.
위의 예로 입력 이미지에 대해서 알고리즘은 5개의 (cat, bird, deer, dog, truck) label중 하나를 출력한다.
- Image Classification의 문제

각도가 살짝 바뀐 고양이의 이미지를 찍는다면 같은 고양이 이미지이지만 숫자들의 나열에는 많은 변화가 생긴다. 이와 같이 이미지는 숫자로 표현되기 때문에, 이로 인해 생기는 다양한 문제들을 해결해야 이미지 분류를 robust하게 할 수 있다.
- 우리가 시도할 수 있는 방법

우리는 입력 이미지에서 edge성분들, 모서리 성분 등을 통해 고양이에 대한 어떤 패턴을 찾는 것을 시도할 수 있다. 이를 통해 고양이가 어떻게 생겼는지에 대한 패턴을 파악한다. 하지만 만약 수염이 있는 고양이, 없는 고양이가 있을 때 같은 고양이지만 서로 다른 패턴을 가지기 때문에 좋은 방식은 아니다.
- Data-Driven Approach

그래서 나온 방식은 Data-Driven Approach 방식으로
1. 다양한 이미지들의 이미지 데이터, 레이블로 구성된 데이터셋을 만들고
2. 이 데이터셋을 바탕으로 분류기를 학습하고
3. 새로운 이미지가 들어왔을 때 이 분류기가 Class를 평가한다.
train 함수는 데이터셋이 들어와서 분류기가 학습되는 함수일 것이고, predict 함수는 새로운 이미지가 들어왔을 때 이 이미지가 어떤 class에 속하는지를 평가 or 예측하는 함수일 것이다.
- Nearest Neighbor Classifier - L1 distance

이미지 2개의 유사성을 판단하는 가장 간단한 방법은 Distance를 계산하는 것이다.
테스트 이미지의 픽셀값과 훈련 이미지의 픽셀값을 element-wise absolute value difference로 계산 후 이 픽셀들을 다 더해서 두 이미지간의 유사성(Distance)를 계산한다.
위의 슬라이드에서는 L1 distance로 계산을 하는데 이 방법은 단순히 두 이미지의 픽셀값의 차이에 절대값을 취한 것을 의미한다.
만약 두 이미지가 완전히 같은 이미지라면 L1 distance의 값은 0이 된다. 즉, 값이 작을수록 두 이미지의 유사성은 크다.
아래에서는 이 알고리즘을 Nearest Neighbor Classifier로 소개하고 있다.
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
num_test = X.shape[0] # X is N x D
Y_pred = np.zeros(num_test, dtype = self.y_train.dtype)
for i in range(num_test):
distances = np.sum(np.abs(self.X_train - X[i,:]), axis = 1)
min_index = np.argmin(distances)
Y_pred[i] = self.y_train[min_index]
return Y_pred
알고리즘을 간단히 분석해보자.
predict함수에서는 입력으로 X를 받는다. 이 입력이 우리가 테스트하고자 하는 이미지가 될 것이다.
여기서 입력 X의 shape = N x D인데 여기서 N은 테스트하고자 하는 이미지의 수, D는 픽셀이다(예를 들어 mnist면 32x32x3 = 3072). 이후 테스트하고자 하는 이미지의 수 만큼 배열 Y_pred를 만들어준다.
이제 테스트 이미지를 for문으로 돌며 모든 훈련 이미지(X_train)과의 L1 distance를 계산하고, 가장 작은 distance를 가지는 index를 min_index로 저장한다.
(X[i,:]로 들어가는 이유는 테스트 이미지도 shape이 N x D의 형태이기 때문에 첫 번째 이미지는 X[1, 모든픽셀], 두 번째 이미지는 X[2, 모든픽셀]이 되므로 X[i,:]의 형태로 들어간다!)
이후 해당 테스트 이미지에 대한 label은 훈련 이미지에서 min_index에 해당하는 label로 예측한다. -> 앞에서 L1 distance가 작을수록 유사한 이미지로 판단함을 확인했다.
| [ Nearest Neighbor Classifier 분석] Q: N개의 이미지가 있을 때, training하는데 걸리는 시간은? A: O(1) Q: N개의 이미지가 있을 때, testing하는데 걸리는 시간은? A: O(N) -> 안 좋다! 우리는 training에서는 어느 정도 오래 걸리더라도 testing에서는 빠른 판단이 필요하다! 또한 정확도가 너무 낮다.. |
이러한 Nearest Neighbor의 대표적인 알고리즘으로는 K-Nearest Neighbors가 있다.(K=1인 경우 Nearest Neighbor알고리즘이 된다.)
- K-Nearest Neighbors

K-Nearest Neighbors는 인접한 K개의 데이터 중 가장 개수가 많은 데이터의 Class로 예측하는 알고리즘이다.
왼쪽의 이미지는 모든 좌표에 대해 가장 인접한 1개의 데이터에 대한 모든 Decision boundary를 나타낸 것이다. 오른쪽은 인접한 3개의 데이터를 통해 Decision boundary를 표현했는데 K가 커질수록 선형에 가까운 Decision boundary를 생성하며 이상치에 대한 영향이 줄어든다.

K-NN 알고리즘에서 사용하는 대표적인 Distance Metric은 L1 distance, L2 distance가 있다. 특정 위치로부터 가장 가까운 K개를 판단하기 위해 distance를 측정해야하는데 이때 L1, L2를 사용하냐에 따라 다른 특성을 보인다.
L1 distance는 좌표축에서 크게 뻗어나가는데 이는 특정 feature의 영향을 강하게 받을 수 있다는 의미이다.
반면 L2 distance는 모두 균일하게 뻗어나가므로 모든 feature의 영향이 골고루 적용된다.
- Hyperparameters

Hyperparameters는 우리가 학습하는 모델에 대해 설정하는 파라미터이다. 앞서 K-NN에서는 K, distance가 하이퍼파라미터가 될 것이다. 다양한 실험을 통해 가장 좋은 Hyperparmeter를 구하고 이를 사용해 학습 모델을 구현한다.

Idea #3만 보면 Dataset을 train, validation, test 3개로 나누어 학습을 진행한다. train데이터로 학습하며 validation 데이터에 대해 성능이 좋은 hyperparameter를 설정하며 가장 좋은 성능의 모델로 test 데이터를 평가한다.

이미지 분류에서 K-NN을 단독적으로는 거의 사용하지 않는다.
- test하는 시간이 너무 오래 걸림
- Distance metric만으로 픽셀이 가진 모든 중요한 정보를 가져올 수 없음
'DeepLearning > Michiganc 대학 강의' 카테고리의 다른 글
| Lecture 4: Optimization (1) | 2022.11.14 |
|---|---|
| Lecture3: Linear Classifiers (0) | 2022.11.07 |