인공지능 공부/CS231n

2강 | Image Classification

ablewi 2023. 3. 18. 00:18

🐱Image Classification: 이미지 분류

Image Classification(이미지 분류)는 컴퓨터 비전에서 핵심 과제에 해당된다.

이미지 분류 과정

  1. 고양이 이미지를 입력 받는다.
  2. 시스템에 미리 정해놓은 카테고리 집합(개, 고양이 등..)이 있는 상태이다.
  3. 컴퓨터는 이미지가 어떤 카테고리에 속하는지 고른다.

하지만, 컴퓨터에게 “고양이” 이미지는 숫자에 불과하다.

이렇게 사람과 컴퓨터의 이미지에 대한 인식 차이를 의미론적 차이(Semantic Gap)라고 한다.

이미지 데이터

4 x 4 x 3(총 48개의 픽셀)의 구조를 가진다.

이미지 데이터는 픽셀(pixel: 모니터 화면을 구성하는 최소 단위)로 이루어져 있으며, 기본적으로 a X b X c 3차원 구조(배열)이다. a X b X c 에서 a는 너비(width. 열), b는 높이(height. 행), c는 색 채널의 수(일반적으로 c = 3)를 의미한다.

c 색 채널이란, RGB(red, green, blue) 3개의 채널을 의미한다. 또한, 각 채널의 값이 모여

: (0 ,0, 0): 검정, (255, 255, 255): 하양, (255, 0, 0): 빨강, (0, 255, 0): 초록, (0, 0, 255): 파랑

의 색이 만들어진다. 따라서 숫자의 범위는 0 ~ 255 사이이다.

이 많은 값을 “고양이” 하나의 레이블로 분류해야 하는 것이다.

이미지 분류의 어려움: Challenges

같은 고양이 사진일지라도, 조금의 변화만 줘도 픽셀 값은 모두 변하게 되어 컴퓨터가 이미지를 분류하는데 어려움이 있다.

카메라의 다양한 각도(viewpoint variation), 조명(illumination), 변형(deformation. 누워있는 고양이, 앉아있는 고양이 등), 가려짐(occlusion. 수풀 뒤의 고양이), 배경과 비슷함(background clutter. 눈 속의 하얀 고양이), 내부 클래스의 다양성(intraclass variation. 여러 종의 고양이) 등이 어려운 과제에 속하며, 알고리즘은 이 모든 것들을 다룰 수 있어야 한다.

인간과 비슷한 분류 수준을 갖는 것은 기적에 가깝지만, 일부 상황을 제한한다면 인간 수준의 프로그램이 존재할 수도 있다. 앞으로 어떤 요소들이 이를 가능하게 만들었는지 살펴볼 것이다.

📸An image classifier: 이미지 분류기

데이터 중심 접근 방법(Data-Driven Approach)을 활용하여, 고양이 사진을 넣었을 때 “고양이”라고 출력하는 이미지 분류기를 만들어 보자. 단순하게 보면 과정은 다음과 같다.

  1. 여러 이미지와 레이블의 dataset을 모은다.
  2. dataset을 넣고 Machine Learning을 사용해 분류기를 학습시킨다.
  3. 이 학습 모델로 새로운 이미지를 테스트해 본다.

여기서 이미지를 분류하기 위해서는 2개의 함수가 필요하다.

  • Train 함수 
    • 입력값: 이미지, 레이블
    • 출력값: 모델
  • Predict 함수
    • 입력값: 모델, 새로운 이미지
    • 출력값: 새로운 이미지의 레이블

이 때, 여러 가지 알고리즘의 분류기가 존재한다.

def train(images, labels):
	# Machine Learning!
    return model
    
def predict(model, test_images):
	# Use model to predict labels
    return test_labels

CIFAR-10

본격적인 이미지 분류기 생성에 앞서, 연습용 dataset인 CIFAR-10에 대해 알아보자. CIFAR-10은 이미지 분류에 대한 예시 dataset으로 Machine Learning에서 자주 쓰인다. 이 데이터에는 10가지의 카테고리가 있고, 50,000개의 학습 이미지, 10,000개의 테스트 이미지가 있다.

import tensorflow as tf

# CIFAR-10에서 데이터셋을 다운로드 받기 위해 keras의 helper 함수인 load_data 함수 import
from tensorflow.keras.datasets.cifar10 import load_data

# data load
(Xtr, Ytr), (Xte, Yte) = load_data()

# 구조 보기
print(Xtr.shape)
print(Ytr.shape)
print(Xte.shape)
print(Yte.shape)
>>>
(50000, 32, 32, 3)  # 4차원
(50000, 1) 
(10000, 32, 32, 3)
(10000, 1)
- Xtr: 50,000개의 train 이미지가 있으며, 32x32 사이즈의 픽셀을 3개의 색 채널로 가짐
- Ytr: 50,000개의 1차원 train 레이블을 가짐
- Xte: 10,000개의 test 이미지가 있으며, 32x32 사이즈의 픽셀을 3개의 색 채널로 가짐
- Yte: 10,000개의 1차원 test 레이블을 가짐

# Xtr 첫 번째 이미지의 0채널 보기
print(Xtr[1][:,:,0])
>>>
[[154 126 105 ...  91  87  79]
 [140 145 125 ...  96  77  71]
 [140 139 115 ...  79  68  67]
 ...
 [175 156 154 ...  42  61  93]
 [165 156 159 ... 103 123 131]
 [163 158 163 ... 143 143 143]]
- R채널에서 32x32개 각각의 픽셀값

# Xtr 첫 번째 이미지에서 1행 1열의 픽셀값
print(Xtr[1][0,0,:])
>>>
[154 177 187]
- (r, g, b)값을 나타냄

Nearest Neighbor: 최근접 이웃 분류기

이미지 분류에서 첫 번째 알고리즘은 아주 단순한 NN 분류기이며, 원리는 다음과 같다.

  • Train 단계: 학습 데이터로 들어온 모든 이미지와 레이블을 기억한다.
  • Predict 단계: 새로운 테스트 이미지가 들어오면, 기존의 학습 데이터와 비교해 가장 유사한 학습 이미지의 레이블을 예측한다.

위 그림을 보면 첫 번째 열에는 테스트 이미지가 있으며, 오른쪽 방향으로는 테스트 이미지와 가장 유사한 순으로 학습 이미지들이 나열되어 있다.

하나의 테스트 이미지를 모든 학습 이미지들과 비교할 때 여러가지 방법들이 있으며, 이는 어떤 비교 함수를 사용할지에 달려있다.

L1 distance(Manhattan distance)

학습 이미지와 테스트 이미지, 두 개의 이미지를 비교하는 가장 간단한 방법 중 하나는 L1 Distance를 사용하는 것이다. 같은 자리의 픽셀 값을 서로 빼고 절댓값을 취한 후, 그 값을 모두 더한다. 다시 말해 두 이미지를 I1, I2 2개의 벡터로 나타낸 후, L1 거리를 계산하는 것이다.

두 이미지가 같으면 더한 값이 0일 것이고, 다를수록 그 값이 커질 것이다.

NN Classifier code

import numpy as np

class NearestNeighbor:
	# 생성자: 객체가 생성될 때 자동으로 호출되는 메서드
	def __init__(self): # self에는 메서드를 호출한 객체 a가 전달됨
		pass # 아무것도 수행하지 않는 문법. 임시로 코드 작성할 때 주로 사용
	
	def train(self, X, Y):
		"""X: N x D 구조의 학습 이미지. Y: N사이즈의 1차원 레이블"""
		# Nearest Neighbor classifier은 단지 모든 train data를 기억한다.
		self.Xtr = X
		self.Ytr = Y
		
	def predict(self, X):
		"""X: 레이블 예측을 원하는 N x D 구조의 테스트 이미지"""
		# 테스트 이미지의 개수
		num_test = X.shape[0] 
		# 테스트 이미지의 개수(10,000개)만큼 0으로 채워진 1차원 array 만들기.
		# 입력과 출력 타입 맞추기(uint8)
		Ypred = np.zeros(num_test, dtype = self.Ytr.dtype)

		# 테스트 이미지의 개수(10,000개)만큼 반복
		# L1 distance를 사용해서 i번째 테스트 이미지와 가장 가까운 학습 이미지 찾기
		# L1 distance: 차이의 절댓값을 모두 합함
		for i in xrange(num_test):
			# 모든 학습 이미지와 i번째 테스트 이미지를 하나씩 비교
			distances = np.sum(np.abs(self.Xtr - X[i, :]), axis = 1) # axis=1: 같은 열끼리 합
			min_index = np.argmin(distances) # L1 distance에서 최소값에 해당하는 index 값
			Ypred[i] = self.Ytr[min_index] # 가장 근접한 레이블 반환

		return Ypred

Train & Predict

# 모든 이미지를 2차원으로 평탄화(flatten)
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32*32*3) # 이미지 개수, 픽셀 수
Xte_rows = Xte.reshape(Xte.shape[0], 32*32*3)

nn = NearestNeighbor() # 분류기 생성
nn.train(Xtr_rows, Ytr) # 학습 이미지와 레이블을 넣어 분류기 학습
Yte_predict = nn.predict(Xte_rows) # 테스트 이미지의 레이블 예측
# 정확도 계산
print(f"accuracy: {np.mean(Yte_predict == Yte) }") # 예측과 실제 레이블이 같은 비율

시간복잡도

💡시간복잡도

시간복잡도란, 알고리즘의 속도이며 “완료까지 걸리는 절차의 수”이다.
시간복잡도가
- O(1) 상수시간: input size와 관계없이 스텝의 수가 일정하게 정해진 알고리즘이다.
- O(N): 알고리즘을 N번 반복한다. input size가 증가하면 스텝의 수도 선형적으로 증가한다.
- O(N^2) 2차 시간: 알고리즘을 N제곱만큼 반복한다.
- O(logN): 알고리즘을 N에 로그 씌운 수만큼 반복한다.

Q: 만약 Train data 이미지가 총 N개라면 Train / Test 함수의 속도는 어떻게 될까?

A: Train의 시간복잡도는 상수시간 O(1)일 것이다. 데이터를 기억하기만 하면 되기 때문이다. O(N)이 아닌 이유는, N개의 훈련 데이터가 있어도 하나의 벡터로 입력되기 때문이다.

A: 하지만 Test의 시간복잡도는 O(N)이다. 테스트 이미지의 개수만큼 모든 학습 이미지와 비교하는 것을 반복해야 하기 때문이다. 이것은 상당히 느린 작업이며, 우리가 원하는 결과와 반대된다. 왜냐하면 Train 시간이 오래 걸려도 Test 시간은 빠르길 원하기 때문이다.

Decision Regions: 결정 영역

NN 분류기는 공간을 나눠서 각 레이블로 분류한다. Decision Regions이란, 하나의 클래스로 나누어진 구역을 말한다.

위 그림을 보면 2차원 평면 상의 각각의 점은 학습 데이터를 의미하며, 점의 색은 클래스 레이블을 의미한다. 여기서 클래스는 총 5개이다.

평면 내의 모든 좌표에서 각각의 좌표가 어떤 학습 데이터와 가장 가까운지 계산한 후, 각 좌표를 해당 클래스로 칠한 결과이다.

하지만 몇몇 문제점들이 보이는 이 분류기는, 그닥 좋지 않다.

  1. 가운데를 보면 초록 영역 중간에 노란 영역이 끼어있다. 이 구역은 사실 초록색이여야 하는데, NN 알고리즘 특성상 “가장 가까운 이웃”만을 보기 때문에 노란 구역이 생겨버린다.
  2. 초록색 구역이 파란색 구역을 침범하고 있다. 이 또한, 초록색 점이 끼어있어서 그렇다.

위의 점들은 아마 noise(잡음) 혹은 spurious(가짜)일 것이다. 이러한 문제들 때문에 조금 더 일반화된 버전인 k-NN 알고리즘이 탄생했다.

k-Nearest Neighbors: k-최근접 이웃 분류기

k-NN은 테스트 데이터와 가장 가까운 학습 데이터를 1개만 찾는 것이 아니라, 가장 가까운 상위 k개만큼 찾은 후 이들의 레이블 중 가장 많은 표를 받은 레이블을 테스트 데이터에 대한 예측값으로 사용한다. 

k=1일 때 NN 분류기와 결과는 동일하다.

k=3인 경우를 보면 가운데 노란 구역이 초록색으로 바뀐 것을 볼 수 있다. 또한, 파란색과 빨간색 구역의 경계가 k=1에 비해 부드러워졌다.

k=5인 경우를 보면 빨간색과 파란색의 결정 경계가 아주 부드러워진 것을 확인할 수 있다.

흰색 구역은 k-NN이 “대다수”를 결정할 수 없는 지역이다.

Distance Metric: 거리 행렬, 거리 척도

k-NN 알고리즘을 사용할 때 k값 뿐만 아니라 결정해야 할 사항이 더 있다. 그 중 하나가 서로 다른 두 벡터(점)를 어떻게 비교할 것인지이다. 두 벡터의 차이를 측정하는 방법 중 Distance 기반의 측정 방법은 말 그대로 두 벡터 간의 물리적 길이를 기반으로 측정하는 방법이다. 길이에 가중치를 주는 방법에 따라 여러가지 지표로 나타낼 수 있다. 그 중 L1, L2 Distance를 살펴보자. 

위 그림은 L1, L2 Distance를 표현한 것이다.

초록색 선이 L2 Distance이며 나머지는 모두 L1 Distance이다. 초록이 직선거리로 가장 짧으며, 빨강, 파랑, 노랑 모두 경로는 다르지만 L1 거리는 같다.

L1 Distance는 Manhattan distance라고도 하며, stepped path(계단식 경로) 형태를 띤다. 좌표상에서 두 벡터 거리 차이의 절대값들의 합이다. 위 첫 번째 그림을 보면 원점으로부터 사각형까지의 L1 Distance는 모두 같다. (L1 Distance의 관점에서, 아래 그림은 “원”이다. 원의 정의는 한 점으로부터 거리가 같은 점들의 집합이다.) L1 Distance의 특징 중 하나는 좌표계(coordinate axis)에 영향을 많이 받는다는 점이다. 예를 들어 기존 좌표계를 회전시키면 L1 Distance가 변하게 된다. 따라서 키, 몸무게와 같은 개별적인 의미를 가지고 있는 특징 벡터에 어울린다.

L2 Distance는 Euclidean distance(유클리드 거리)라고도 하며, straight line(직선) 형태를 띤다. 두 벡터 사이의 직선거리, 즉 차이의 제곱 합의 제곱근이다. 위 두 번째 그림을 보면 원점으로부터 원형까지의 L2 Distance는 모두 같다. 따라서 L2 Distance는 좌표계에 아무런 영향을 받지 않으므로, 실질적인 의미를 잘 모르는 일반적인 벡터에 어울린다.

이 밖에도 다양한 거리 척도가 있으므로 이를 이용해 다양한 종류의 데이터를 다룰 수 있다.

위 그림은 동일한 데이터에 L1, L2 Distance를 사용한 결과이다. 비교해보면 결정 경계의 모양이 다름을 알 수 있다. L1은 좌표축의 영향을 받고 L2는 그렇지 않기 때문에, L2의 결정 경계가 더 자연스럽다.

Hyperparameters

앞서서 k-NN을 사용하기 위해 꼭 설정해야 하는 요소들인 k의 개수, 거리 척도에 대해 살펴보았다. 그렇다면 어떻게 해야 “내 문제”와 “데이터”에 적절한 모델을 찾을 수 있을까? 답은 하이퍼파라미터에 있다.

k와 거리척도를 하이퍼파라미터라고 한다. 그렇다면 하이퍼파라미터를 어떻게 정해야 할까? 하이퍼파라미터를 정하는 일은 문제의존적(problem-dependent)이다. 따라서 가장 간단한 방법은 데이터에 알맞게 다양한 하이퍼파라미터 값을 시도해 보고 그 중 가장 좋은 값을 찾는 것이다. 여기서 가장 좋은 값이란, 데이터의 정확도와 성능을 최대화하는 하이퍼파라미터 값이다. 여기 하이퍼파라미터를 결정할 수 있는 몇 가지 아이디어가 있다.

  1. 전체 데이터셋를 학습 데이터로 두고 학습을 통해 가장 결과가 좋은 하이퍼파라미터를 선택하는 것이다. 하지만 이것은 아주 좋지 않은 방법이다. 예를 들어, k-NN 분류기의 경우 k = 1일 때 학습 데이터를 가장 완벽하게 분류한다. 하지만 새로운 테스트 데이터에 대해서는 좋지 못한 성능을 보인다. 기계학습의 궁극적인 목표는 학습 데이터를 잘 맞추는게 아니라, 한 번도 보지 못한 새로운 데이터를 잘 예측하는 것이다. 따라서, 학습 데이터에만 신경쓰는것은 최악이다.
  2. 전체 데이터셋을 학습 데이터와 테스트 데이터 둘로 나누는 것이다. 학습 데이터로 하이퍼파라미터 값들을 학습 시키고 이를 테스트 데이터에 적용시켜본 후, 가장 좋은 하이퍼파라미터를 선택하는 것이다. 첫 번째 방법보다는 합리적으로 보이지만, 사실 이것 또한 좋지 않은 방법이다. 왜냐하면 이 모델도 결국에는 새로운 데이터에 대한 성능을 알지 못하기 때문이다. 기계학습의 목표는 한 번도 보지 못한 데이터에서 잘 동작해야 한다.
  3. 데이터셋을 3개로 나누는 것이다. 대부분을 트레이닝 셋으로 두고 일부는 벨리데이션(validation) 셋, 나머지를 테스트 셋으로 분류한다. 다양한 하이퍼파라미터로 트레이닝 셋을 학습시킨 후, 벨리데이션 셋으로 검증한다. 그리고 가장 좋았던 하이퍼파라미터를 선택한다. 최종적으로 개발/디버깅 등 모든 일들을 마친 후에 벨리데이션 셋에서 가장 좋았던 분류기를 가지고 테스트 셋을 딱 한 번만 수행한다. 이 마지막 수치를 논문 또는 보고서에 삽입하는 것이다. 이 수치가 나의 알고리즘이 한 번도 보지 못한 데이터에 얼마나 잘 동작하는지 실질적으로 나타내주는 것이다.
  4. Cross-Validation(교차 검증)이다. 이 방법은 우선, 제일 마지막에 사용할 테스트 셋를 정해놓는다. 그리고 나머지는 트레이닝 셋으로 두고 여러 부분으로 나눈 후, 번갈아가면서 한 부분을 벨리데이션 셋을 정해준다. 아래의 예제에서는 5-Fold Cross Validation을 사용한다. 처음 4개의 fold에서 하이퍼파라미터를 학습시키고 마지막 fold에서 알고리즘을 평가한다. 그리고 1, 2, 3, 5 fold에서 다시 학습시키고 4 fold로 평가한다. 이런식으로 계속 순환한 후 최적의 하이퍼파라미터를 확인한다. 사실 이 방식이 거의 표준이긴 하지만, 작은 데이터셋에 많이 사용되며 딥러닝 같은 큰 모델을 학습시킬 때는 계산량이 많기 때문에 실제로는 거의 사용하지 않는다.

 

분류기로 5-fold Cross-Validation을 수행하고 나면 위와 같은 그래프를 얻게 된다. X축은 k값이고 Y축은 정확도(accuracy)를 나타내어 각각의 k마다 5번의 교차 검증을 통해 알고리즘이 얼마나 잘 작동하는지 알려준다. 또한 분산을 함께 계산하면 그 성능의 분산도 알 수 있다. 따라서 하이퍼파라미터에 따라 모델의 정확도와 성능을 평가할 수 있게 된다. 아래 예제에서는 아마 k = 7일 경우에 모델이 가장 좋은 성능을 낼 것이다.

k-NN의 한계

1차원일 때에는 공간을 조밀하게 덮으려면 4개의 데이터가 필요하다. 하지만 2차원일 때에는 16개가 필요하고 3차원일 때에는 64개가 필요하다. 이렇게 고차원일수록 공간을 충분히 덮으려면 필요한 데이터의 양이 기하급수적으로 늘어난다.

하지만, 실제로는 이미지를 분류할 때 k-NN 분류기를 잘 사용하지 않는다. 몇 가지 문제들 때문이다.

  1. 너무 느리기 때문이다. test 단계에서 너무 많은 시간을 할애한다.
  2. L1/L2 Distance가 이미지 간의 거리를 측정하기에 적절하지 않기 때문이다. 벡터간의 거리 측정 관련 함수들은 이미지들 간의 지각적 유사성(perceptual similarity)을 측정하는 척도로 적절하지 않다. 예를 들어, 아래 여성 이미지 원본이 하나 있고 3개의 변형된 이미지들이 있다. 눈과 입을 가리고, 픽셀을 이동하고, 파란 색조도 추가시켜 보았다. 모두 원본과 다른 이미지이지만 유클리드 거리를 측정해보면 모두 동일한 값을 가진다. 이는 L2 Distance가 이미지들 간의 지각적 유사도를 측정하기에 적합하지 않기 때문이다.
  3. 차원의 저주이다. k-NN이 하는 일은 위에서 언급했다시피 학습 데이터를 이용해 공간을 분할하는 일이다. 이 말은, k-NN이 잘 작동하려면 전체 공간을 조밀하게 덮을 만큼의 충분한 학습 데이터가 필요하다는 것을 의미한다. 하지만, 고차원의 이미지일수록 모든 공간을 채울만한 데이터를 모으는 것이 현실적으로 불가능하다.

Linear Clssification: 선형 분류

Linear Classification은 간단하지만 NN(Neural Network)과 CNN(Convolutional Neural Network)의 기반이 되는 아주 중요한 알고리즘이다. 많은 사람들이 NN을 레고 블럭과 비유하고, Linear Classifier가 그것의 기본 블럭이라고 말한다.

Linear classifier는 parametric classifier의 가장 단순한 형태이다. parametric classifier란, training data의 정보가 parameter인 “행렬 W”로 요약된다는 것을 뜻하고 W가 학습되는 것이다.

Linear classifier의 작동 원리는 간단하다.

먼저 구성 요소로는, 입력 이미지 x와 가중치인 parameter W 두 개의 요소가 있으며, 결과값으로는 10개의 숫자 출력한다. 숫자들은 CIFAR-10의 10개 카테고리의 스코어이다.

작동 순서를 보면,

  1. 32 x 32 x 3 이미지를 입력받으면 3072 x 1의 긴 열벡터로 펼치며, 이게 x값이다.
  2. x와 parameter인 행렬 W(기울기)를 곱하고 b(bias, 절편)를 더하여
  3. 10 x 1 형태의 결과값을 출력한다.
  4. 이 때 3072 x 1인 x와 연산하고 10 x 1인 출력값을 내기 위해서 parameter W는 10 x 3072 형태여야 하고, 더해주는 b도 10 x 1 이여야 한다.

결과값에서 “고양이”의 스코어가 높다는 것은 입력 데이터 x가 “고양이”일 확률이 크다는 것을 의미한다. 반대로 개나 자동차 클래스의 스코어가 낮다는 것은 이 이미지가 개나 자동차일 확률이 낮다는 것을 의미한다.

 

간단한 예제를 살펴보자.

벡터의 형태를 보면, 입력값은 단순하게 2 x 2 → 4 x 1이며, 출력값은 cat, dog, ship 3개의 카테고리의 스코어인 3 x 1이다. 그렇다면 곱해주는 W는 3 x 4, 더해주는 b는 3 x 1 형태여야 한다.

연산 시 W의 첫 번째 행은 Cat Score를 결정하기 때문에 Cat classifier라고도 한다.

결과값을 보면 고양이 이미지임에도 불구하고 Cat score의 점수가 가장 낮다. 이는 학습이 부족해 성능이 낮다고 볼 수 있다.

 

Linear Classifier를 말로 풀어서 설명하면, 이미지 내의 모든 픽셀값들 x에 가중치 W를 곱한 것의 합이다. 위의 행렬을 생각해보면 이해할 수 있다. 또 다른 말로 표현하면, 각각 다른 공간적 위치에 있는 color들을 counting한 것이다.

Linear Classifier를 이 두 가지 관점에서 해석해보자.

Template matching: 템플릿 매칭

Linear Classifier의 과정은 템플릿 매칭과 거의 유사하다.

💡Template matching 

템플릿 매칭이란, 입력 영상에서 (작은 크기의) 템플릿 영상과 일치하는 부분을 찾는 기법이다. 여기서 템플릿이란, 찾을 대상이 되는 작은 영상이다.

템플릿 매칭의 원리는,
1. 템플릿을 입력 영상 좌측 상단에서부터 우측 하단까지 모든 부분과 비교하여 스캔한다.
2. 비교 기준은 유사도와 비유사도를 사용하는데, 유사도 중 최대값을 선택하고 비유사도 중 최소값을 선택한다.
- 유사도: 비교 부분의 동일한 정도를 나타낸다. → 최대값 선택
- 비유사도: 비교 부분의 차이를 나타낸다. → 최소값 선택

가중치 행렬 W의 각 행은 각 이미지에 대한 템플릿으로 볼 수 있다. 각각의 행 벡터와 이미지의 열 벡터 간의 내적을 계산하는데, 여기에서 내적이란 클래스 간 템플릿의 유사도를 측정하는 것과 비슷하다는 것을 알 수 있다.

템플릿 매칭의 관점에서 보면, 위사진의 하단은 W의 각 행들(class 별)을 시각적으로 표현한 것이다. 이 이미지를 통해 가중치 행렬 W가 어떻게 학습되는지 알 수 있다. 하나씩 살펴보면,

  • 맨 왼쪽은 비행기 클래스에 대한 템플릿 이미지이며, 대부분 파란색이다. Linear Classifier가 비행기를 분류할 때 파란것을 찾고 있는 것 같다.
  • 두 번째 자동차의 경우 중앙은 빨갛고 상단은 파랗다. 하지만 실제 자동차처럼 보이지는 않는다. 여기서 Linear Classifier의 문제점이 드러난다. 한 클래스 내에 다양한 특징들이 존재할 수 있지만 (파란 차, 빨간 차, 회색 차 등), 이 모든 것을 평균화 시켜 단 하나의 템플릿으로 나타내 학습한다는 것이다.
  • 오른쪽의 말을 보면 말의 머리가 두 개이다. 클래스 당 하나의 템플릿만 학습할 수 있다는 제약이 있어 이러한 문제점이 발생한다.
  • 또 다른 특징은 color가 매우 중요하다는 것이다. 각 이미지를 보면 객체의 특정한 color들이 반영된 것을 알 수 있다.

고차원 공간의 점

Linear Classifier를 또 다른 관점으로 해석해 보자면, 이미지를 고차원 공간의 한 점으로 보는 것이다. Linear Classifier는 각 클래스를 구분하는 선형 결정 경계를 그어주는 역할을 한다.

왼쪽 상단 비행기의 경우, Linear Classifier가 파란색 선을 학습하여 비행기와 다른 클래스를 구분할 수 있다.

 

하지만, 이미지가 고차원 공간의 한 점이라는 관점으로 해석해보면 Linear Classification이 직면할 수 있는 문제가 있다.

파란, 빨강 두 개의 클래스가 있고 아래 좌표들과 같이 분포되어 있다고 하면, 선 하나로 데이터들을 분류할 방법이 없다.

  • 반전성 문제(partiy problem): 첫 번째는 이미지 내 동물이나 사람의 수가 ‘홀/짝수’인지를 분류하는 문제로 예를 들 수 있다.
    • 파란색 카테고리: 0보다 큰 픽셀이 홀수 개인 경우이다. (x, y) 둘 중 하나는 양수, 하나는 음수인 경우이다.
    • 빨간색 카테고리: 0보다 큰 픽셀이 짝수 개거나, 0보다 작은 픽셀이 짝수 개인 경우이다. (x, y) 둘 다 음수이구나, 둘 다 양수이다.
  • Multimodal problem: 맨 오른쪽 이미지처럼 파란색이 분포하는 세 개의 섬들이 있으며, 그 밖은 모두 빨간색 카테고리이다. 한 클래스가 다양한 공간에 분포할 수 있다.
    • 위의 말 예시로 들 수 있다. 왼쪽 머리 하나가 섬이 될 수 있고, 오른쪽 머리가 또 하나의 섬이 될 수 있다.