Stanford University CS231n - Lecture2 Image Classification

jaehee kim·2020년 7월 31일
0
post-thumbnail

스탠포드 대학교 cs231n 2017년 강의를 정리하였습니다.

Image Classification - A Core task in Computer Vision


이미지 분류 문제는 컴퓨터비전 분야에서 코어 테스크에 속하는 문제입니다.

구분된 label의 set이 있을 때 이것이 어떤 label에 속하는지 찾아내는 것입니다. 사람에게는 쉬운일이지만, 기계에게는 쉽지않은 일입니다.

컴퓨터는 이미지를 어떤 숫자들의 집합으로 인식할 것입니다.

An images is just a big grid of numbers between [0, 255]

ex) 800 x 600 x 3 (여기서 3은 RGB채널을 말합니다.)



Challenges


컴퓨터에게 이미지는 거대한 숫자 집합에 불과하기 때문에 이미지 인식을 할때, 다음과 같은 어려움이 있을 것입니다.

  • Viewpoint variation - viewpoint에 따라서 픽셀들이 변화할 것이다.
  • Illumination - 조명차이에 대해서도 algorithm은 취약하다.
  • Deformation - 형태의 차이에 대해서 weakness
  • Occlusion - 물체가 숨어있는 경우에 대해서 weakness
  • Background Clutter - 배경과 구분이 힘든 경우
  • Intraclass variation - 같은 클래스내에서 구분하는 경우


An image classifier


Image Classifier API 코드를 작성한다고 생각해 봅시다.

def classify(image):
	# do something
	return class_label

이미지를 input으로 받아서, 어떤 과정을 거친의 해당 이미지의 클래스를 알려주는 것입니다.

이미지를 인식하는 것은 숫자를 정렬하는 것 같은 것들과는 다르게 expicit algorithm 이 없다.



Data-Driven Approach


이전에 이미지 인식과 관련된 여러가지 방법이 있었지만, 잘 동작하지 않거나, 확장성이 부족하다는 문제가 있었습니다.

이를 해결하기위해 고안된, 하나의 방법은 Data driven approach 입니다.

이 방식의 과정은 다음과 같습니다.

  1. 이미지와 레이블에 대한 많은 데이터셋을 모은다.
  2. 머신러닝으로 classifier를 학습시킨다.
  3. 새로운 이미지에 대해 classifier를 평가한다.

이 방식으로 인해서, Image Classifier API가 조금 변경됩니다. 다음과 같이 2개의 함수가 필요하게 됩니다.

Train 함수 : 이미지와 클래스를 input 으로하고, output 은 모델이 됩니다.

Test 함수 : 모델을 input으로 하고, output 은 이미지에 대한 예측값이 됩니다.



Nearest Neighbor


Nearest Neighbor라는 아주 단순한 Classifier에 대해서 알아보겠습니다.

# Memorize all data and labels
def train(images, labels):
	#ML
	return model

Train 과정에서는 모든 학습 데이터를 저장하는 작업만 일어납니다.

# Predict the label of the most similar training image
def predict(model, test_images):
	#Use model to predict
	return test_labels

Predict 과정에서는 새로운 이미지 들어왔을 때, 기존의 학습 데이터를 비교하여, 가장 유사한 이미지로 클래스를 예측합니다.

아주 간단하지만, Data driven approach로 좋은 알고리즘중 하나입니다.

CIFAR -10 데이터셋을 이용해서 Nearest Neighbor 사용한 예시입니다.

어떤 이미지에 대해서 가장 유사한 이미지들을 찾아내고 있습니다.

그럼 이제 중요한 것은 테스트 이미지 하나를 학습 이미지들과 비교할 때, 어떤 방식으로 진행할 것인지 입니다.

방법 중 하나는 L1 Distance(Manhattan Distance)를 사용하는 것입니다.

그림과 같이 각 픽셀별로 차를 구하고, 절대값을 합니다. 마지막으로 모든 원소들의 합을 구하면 됩니다.

다음은 Nearest Neighbor를 구현한 코드입니다.

import numpy as np

class NearestNeighbor:
	def __init__(self):
		pass

	def train(self, X, y)
	# the nearest neighbor classifier simply remembers all the training data
		self.Xtr = X
		self.ytr = y

	def predict(self, X):
		num_test = X.shape[0]
		# lets make sure that the output type matches the input type
		Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

		# loop over all test rows
		for i in xrange(num_test):
			# find the nearest training image to the i'th test image
			# using the L1 distance (sum of absolute value differences)
			distance = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
			min_index = np.argmin(distances) # get the index with smallest distance
			Ypred[i] = self.ytr[min_index] # predict the label of the nearest example

train 함수를 보면 학습 데이터를 저장하는 작업을 합니다.

predict 함수에서는 이미지를 입력으로 받아 L1 Distance를 이용하여 비교하고, 유사한 이미지들을 찾아냅니다.

다음은 Nearest Neighbor Classifier에 대한 질문입니다.

Q : With N examples, how fast are training and prediction?

Train O(1), predict O(N)

Train할 때는, 데이터를 저장하는 작업만하므로 O(1) 입니다.

Predict를 할 때는, N개의 데이터를 테스트 이미지와 모두 비교하므로 O(N) 입니다.

→ We want classifiers that are fast at prediction; slow for trainig is ok

어떤 모델이 스마트폰이나, 브라우저 같은 환경에서 작동해야할 경우에는, Train 시간이 오래걸리더라도, Test시간이 빨라야 할 것입니다.

CNN 같은 Parametric Approcah 의 경우, Nearest Neighbor와는 반대로 Train 시간이 오래걸리더라도, Test시간이 상대적으로 빠릅니다.

Nearest Neighbor의 decision regions을 그려본것입니다.

각 점들은 학습 데이터를 의미하고, 점의 색깔은 해당 클래스를 의미합니다.

가운데 노란색 점을 보면, 초록색 영역이어야 하지만, Nearest Neighbor 알고리즘은 가장 가까운 이웃만을 확인하기 때문에 노란색영역으로 표시되어 있습니다.

이러한 문제가 발생하기 때문에, Nearest Neighbor 알고리즘을 일반화된 버전인, KNN알고리즘이 만들어졌습니다.



K-Nearest Neighbors


Distance metric을 이용해서 가장 가까운 K 개의 포인트에 대해서 majority vote를 합니다.

K 값에 따른 KNN 알고리즘의 결과입니다. K = 5를 보면, 경계가 부드러워졌고, 가운데 있었던 노란색 영역도 사라진 것을 확인할 수 있습니다.

  • labeling이 되지 않은 흰색영역은 어떻게 처리하는가?

→ 흰색 영역은 majority vote 를 이용하여, 결정할 수 없는 지역입니다. 임의로 정하거나 하는 여러가지 방법을 이용하여, 지역의 클래스를 결정합니다.



Distance Metric


서로 다른 점들을 비교하는 방법에는 L1 말고도 다른 방법이 존재합니다.

L1 distance 방식은 픽셀 간 차이의 절대값을 하여, 합을 구하는 것입니다.

L2 distance 방식은 픽셀 간 차이의 제곱을 하여 합을 구한 후, 루트를 취해주는 것입니다.

어떤 distance metric을 사용할지는 결정하는 것이 필요합니다.

L1은 어떤 좌표계이냐에 따라 영향을 받습니다. 좌표계를 회전할 경우 영향을 끼칩니다. 하지만 L2는 그렇지 않습니다.

특징 벡터의 각 요소들이 키나 몸무게처럼 개별적인 의미를 가진다면 L1이 더 잘 어울릴 수 있습니다.

특징 벡터가 일반적인 벡터이고, 요소들간의 실질적인 의미를 잘 모르는 경우라면, L2가 더 잘 어울릴 수 있습니다.

KNN 에 대해서 각각 L1 distance 와 L2 distance를 적용한 예시입니다.

L1 의 경우 경계부분이 좌표축에 영향을 받는 경향을 보이는 것을 알 수 있습니다.



Hyperparameters


우리가 KNN 알고리즘을 선택하여, 사용하려면, K의 값이나 Distance Metric을 결정해줘야 합니다.

Train 전에 결정해줘야 하는 것들을 hyperparameter 라고 합니다.

최적은 K, distance는 무엇인가?

→ Very problem-dependent / 뭐가 좋은지 시도해서 찾아내야 합니다.

hyperparameter를 정하는 가장 간단한 방법은 데이터에 맞게 다양한 hyperparameter 값을 시도해 본후, 가장 좋은 값을 찾아내는 것입니다.

어떤 경우에 L1 Distance가 L2 Distance보다 더 좋은가?

→ 문제에 따라 다릅니다. 데이터의 각 요소가 특별한 의미를 가진다면, L1을 사용하는 것이 괜찮을 수 도 있습니다. 일반적으로는 어떤 문제이고, 어떤 데이터인지에 따라 다릅니다.



Setting Hyperparameters


hyperparameter를 선택할 때, 생각해볼 수 있는 아이디어를 보도록 하겠습니다.

Idea #1 : 데이터셋에서 최적의 결과가 나오는 하이퍼파라미터 선택

→ Terrible idea. train 데이터에만 좋은 결과가 나올 수 있습니다. 우리는 처음보는 데이터에서 좋은 성능을 내는 것을 원합니다. 이 방식으로는 우리가 원하는대로 결과를 얻을 수 없을 것입니다.

Idea # 2 : 데이터를 train과 test로 나눈 후, 좋은 결과 나오는 것 선택

→ Terrible idea. 우리는 unseen data 에 대해서 좋은 결과가 나오길 원한다. 이렇게 할 경우, test data에만 잘 동작하는 hyperparameter를 선택하게 될 수도 있습니다.

Idea # 3 : 데이터를 train, validation, test로 나눈다. validation을 이용해서 hyperparameter를 선택하고, test 로 평가한다.

→ Better. train data 로 학습을 진행한 후, validation data를 이용하여, 검증을 합니다. 검증결과 가장 좋았던 hyperparameter를 선택합니다. test data 에 대해서는 최종적으로 얻은 hyperparameter를 이용하여, 한번만 수행을 합니다.

Idea # 4 : Cross-Validation. 데이터를 폴드단위로 나눈 후, 각 폴드를 validation으로 하여 평균을 구한다.

→ 데이터 셋이 적을때, 유용합니다. not used too frequently in deep learning.

  • 구체적으로 트레이닝 셋과 벨리데이션 셋의 차이가 무엇인가?

→ train data 는 클래스를 볼 수 있지만, validation data 는 클래스를 볼 수 없고, 알고리즘이 얼마나 잘 작동하는지 확인만 합니다.

  • 테스트 셋이 한번도 보지 못한 데이터를 대표할 수 있는가?

→ 실제로는 그렇지 않은 경우가 많을 것이지만, 이론적으로는 i.i.d 라는 통계학적 가정을 생각합니다. 데이터가 독립적이고, 모두 동일한 분포를 따른다고 가정해야합니다.



K-Neareset Neighbor on Images never used


입력이 이미지인 경우에는 KNN을 잘 사용하지 않습니다.

느리다는 문제점과, L1/L2 Distance가 이미지간의 거리를 측정하기에 적절하지 않다는 문제점 때문입니다.

오른쪽 3개의 사진들은 왼쪽 원본 이미지와의 L2 distance가 모두 동일합니다.

차원의 저주 또한 하나의 문제점 입니다.

KNN은 트레이닝 데이터를 이용해서 공간을 분할하는 작업을 수행합니다. 그래서 KNN이 잘 작동하기 위해서는, 전체 공간을 조밀하게 커버할 수 있을 만큼의 데이터가 필요하게 됩니다.

필요한 데이터의 양은 차원이 증가함에 따라 기하급수적으로 증가할 것이기 때문에, 좋지 않습니다.

위의 그림에서 각 점은 트레이닝 샘플을 의미하고, 색깔은 클래스를 의미합니다.

왼쪽의 1차원의 경우 공간을 조밀하게 하려면 4개의 샘플로 충분합니다. 3차원의 경우는 64개의 샘플이 필요하게 됩니다. 차원이 늘어날수록, 필요한 샘플의 수가 기하급수적으로 늘어나게 됩니다.



Linear Classification


Neural Network을 구축할 때, 다양한 컴포넌트들을 사용할 수 있습니다. 사람들은 Neural Network를 레고 블럭에 비유하기도 합니다.

Linear Classification은 다양한 종류의 딥러닝 알고리즘들의 기본이 되는 블럭중 하나입니다.

Linear Classification은 parametric model 의 가장 단순한 형태입니다.

왼쪽에 입력 이미지가 있는데, 보통 x 로 표현합니다. 파라미터(가중치)는 W로 표현합니다. 위의 식에서 10개의 클래스에 대한 스코어를 출력하는데, 스코어가 높다는 것은 입력 x가 고양이일 확률이 크다는 것을 의미합니다.

parametric approach 에서는 train data의 정보를 요약하여, 파라미터 W에 모아줍니다. 이러한 방식을 사용하여, Test 할 때, train data 필요하지 않도록 합니다.

어떤 식으로 가중치 W와 데이터를 조합할지를 여러가지 방법으로 생각해볼 수 있는데, 가장 쉬운 방법은 둘을 곱하는 것입니다. 이러한 방법이 Linear Classification 입니다.

이미지 : 32x32x3 → 벡터로 만들면 3072-dim 벡터

우리가 원하는 것은 10개의 스코어를 얻는 것입니다. 그래서 W는 10x3072 행렬이 되어야 합니다.

W 와 x 를 곱하게 되면 10x1 벡터를 얻게 됩니다.

Bias 항을 더해주기도 하는데, Bias 항은 입력과 직접 연결되지 않고, 데이터와 무관하게, 특정 클래스에 preference를 부여합니다.

예를들어, 고양이 데이터가 개 데이터보다 훨씬 많은 상황에서는 고양이 클래스에 상응하는 bias가 더 커지게 됩니다.;

예시를 보겠습니다. 왼쪽에 2x2 입력 이미지가 있습니다. Linear classifier는 이미지를 입력으로 받아서 4-dim 벡터로 만들어 줍니다.

현재 3개의 클래스에 대한 스코어를 원하기 때문에 W 는 4x3 행렬이 됩니다.

bias는 데이터와 독립적으로 각 클래스에 연결됩니다.

Linear Classification은 템플릿 매칭과 유사합니다. W의 각 행을 각 이미지에 대한 템플릿으로 볼 수 있고, 각 행과 이미지의 벡터를 내적하는데, 클래스 간 템플릿의 유사도를 측정하는 과정이라고 생각하면 됩니다.

W의 행들을 이미지로 시각화해보면 Linear Classifier가 이미지 데이터를 인식하기 위해 어떤 작업을 하는지 생각해볼 수 있습니다. 위의 슬라이드에서 하단의 10개의 이미지는 10개의 클래스에 해당하는 행들을 시각화 한 것입니다.

Linear Classifier의 문제중 하나는 각 클래스에 대해서 하나의 템플릿만 학습한다는 것입니다. 한 클래스 내에서 다양한 특징들이 존재할 수 있음에도, 각 클래스를 인식하기 위한 템플릿은 하나만 존재하게 됩니다.

이미지를 고차원 공간의 한 점이라고 생각해봅시다. 그럼, Linear Classifier는 각 클래스를 구분시키는 경계를 만들어주는 역할을 합니다.

위의 그림은 Linear Classifier이 해결하기 어려운 문제들이 존재하는 것을 알 수 있습니다. 하지만, 아주 쉽게 이해하고 해석해볼 수 있는 알고리즘입니다.



Reference


Stanford University School of Engineering

Lecture 2 | Image Classification

notion 정리
[notion]Stanford University CS231n - Lecture2 Image Classification

0개의 댓글