CS231n - Lecture 2 | Image Classification

kimgaeul02·2023년 3월 19일

CS231n

목록 보기
2/5

본 포스팅은 Standford University의 'CS231n' 강의로 공부한 것을 정리했습니다.

Lecture 2 | Image Classification

1. Image Classification?

  • 이미지 분류(Image Classification)란, 입력 이미지에 대해 사전에 정해진 레이블(label) 집합의 한 원소를 할당하는 작업으로 컴퓨터 비전의 핵심 Task이다.
  • 인간의 시각체계는 이러한 시각인식 작업에 고도화 되어있으나, 기계는 이미지를 격자모양의 숫자집합으로 인식하기 때문에 이미지를 인식하는 것이 어렵다. 이를 의미론적 차이(Semantic gap)라고 한다.

다음과 같은 변화가 발생했을 때 Image Classification이 어렵다.

  1. Viewpoint Variation
  2. Illumination
  3. Deformation
  4. Occlusion
  5. Background clutter
  6. Intraclass variation

Image Classification을 위한 방법은 다음과 같다.

1) Attempts have been made(규칙 기반 판단)

이미지의 특징적인 edge, shape, junction 등을 찾아 라이브러리화 하고 이미지의 배열 상태 등을 비교하여 탐색한다. 그리하여 다른 이미지가 들어왔을 때 전반적인 상태를 비교하고 그것을 통해 분류하는 시도이다.

  • 문제점1) 알고리즘이 강인하지 않다.
  • 문제점2) 다른 객체를 인식하기 위해서는 새로운 객체에 대해 별개의 규칙을 만들어야 한다. 즉, 확장성이 없다.

2) Data-driven approach (데이터 기반 방법론)

  1. 이미지 및 레이블의 데이터셋을 수집한다.
  2. 기계 학습을 사용하여 분류기를 학습한다.
  3. 새 이미지를 사용해 분류기를 평가한다.

수많은 데이터를 수집해야 한다는 문제점이 있으나 하드웨어의 발전으로 성능이 좋아졌다.


2. First Classifier : Nearest Neighbor(NN)

Train 함수로 학습된 이미지를 모두 기억하고, Predict 함수로 새로운 이미지를 받아 학습된 데이터 중 가장 비슷한 이미지(레이블)를 찾는다.

def train(train_images, train_labels):
	# build a model for images -> labels...
	return model

def predict(model, test_images):
	# predict test_labels using the model...
	return test_labels

NN 알고리즘 구현

크게 두 가지 과정을 거친다.

  • Train Step: 모든 학습 데이터를 기억한다.
  • Predict Step: 입력 데이터를 Train data와 비교하여 어느 label 값을 가질지 예측한다.
import numpy as np

class NearestNeighbor(object):
  def __init__(self):
    pass

  def train(self, X, y):
    """ X is N x D where each row is an example. Y is 1-dimension of size N """
    # train 함수: 학습 데이터를 기억
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ X is N x D where each row is an example we wish to predict label for """
		# predict 함수: 이미지를 입력 받고, L1 distance로 비교
    num_test = X.shape[0]
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # loop over all test rows
    for i in range(num_test):
      # i번째 테스트 이미지와 가장 가까운 학습 이미지를
      # L1 거리(절대값 차의 총합)를 이용하여 찾는다.
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # 가장 작은 distance를 가지는 인덱스
      Ypred[i] = self.ytr[min_index] # 가장 가까운 이웃의 라벨로 예측

    return Ypred

L1 Distance(Manhattan distance)

Nearest Neighbor 구현에 사용된 거리 측정 함수로, 이미지를 Pixel-wise로 비교한다. 두 이미지 간의 차이를 어떻게 측정할 지에 대한 구체적인 방법을 제시한다.

Q) Trainset 이미지가 총 N개라면 Train/Test 함수의 속도는?
A) Train Time은 O(1), Test Time은 O(N)

입력된 데이터를 기억하는 Train 함수에 반해, Test 함수는 N개의 데이터 전부를 테스트 이미지와 비교하여야 하기 때문에 상당히 오랜 시간이 걸린다.

Decision Regions of NN

Decision Region은 각 좌표가 어떤 학습 데이터와 가장 가까운지 계산한 뒤, 해당 클래스의 색으로 칠한 것이다. 중앙을 보면 대부분이 초록색 점인데 중간에 노란색 점이 끼어있음을 알 수 있다. NN 알고리즘은 "가장 가까운 이웃"만을 보기 때문에 발생하는 현상이다. 이를 잡음(noise) 또는 가짜(spurious)라고 부른다. 이러한 현상을 해결하기 위해 생긴 것이 NN의 일반화 버전인 K-NN 알고리즘이다.

3. K-NN Algorithm

Decision Regions of K-NN

Distance Metric을 이용해 가까운 이웃을 K개 만큼 찾고 이웃끼리 투표하는 방식이다. 가장 높은 득표수를 획득한 레이블로 예측한다. 여러 방법이 있으나 득표수만 고려하는 방법이 가장 쉽고 잘 동작한다.

  • 위 예제는 동일한 데이터를 사용한 K-NN 분류기이다.
  • K=3의 경우, 초록색 영역에 자리잡은 노란색 영역이 깔끔하게 사라졌다. 파랑/빨강 사이의 뾰족한 경계도 점차 부드러워졌다. 즉, K가 1보다 커야 결정 경계가 부드러워지고 더 좋은 결과를 보임을 알 수 있다.
  • 그러나 성능이 그리 좋지 않기 때문에 이미지를 다루는 문제에서 K-NN을 잘 사용하지 않는다.

Distance Metric

  • L1 Distance: 두 점 사이의 절댓값(거리)을 나타내며, 좌표계에 따라 달라진다.
  • L2 Distance: 두 점 사이의 '직선 거리'를 나타내며, 좌표계의 영향을 받지 않는다.
  • 특징 벡터가 개별적 의미(ex. 키, 몸무게)를 가지고 있다면 L1 Distance, 일반적인 벡터의 의미를 모르거나 의미가 별로 없을 때는 L2 Distance를 사용한다.

  • K-NN에 다양한 거리 척도를 적용하면 벡터, 이미지 외에도 다양한 종류의 데이터를 다룰 수 있다.
  • Distance Metric에 따른 기하학적 변화는 다음과 같다.

  • L1 Distance가 좌표 시스템의 영향을 받기 때문에 결정 경계가 "좌표 축"에 영향을 받았고, L2 Distance는 좌표 축의 영향을 받지 않고 결정 경계를 만들기 때문에 조금 더 자연스러움을 알 수 있다.

Hyper Parameter

what is the best value of k to use?
what is the best distance to use?

학습을 하는데 영향을 미치는 Parameter. 데이터 분석을 통해 얻어지는 값이 아니기 때문에 학습 전 사용자가 직접 정해야 한다. 경험에 의해 정해지는 경우가 많아 여러 번 수행해보며 최적의 값을 찾는다. 예제에서는 K와 거리 척도에 해당한다.

How to find Hyper Parameter?

Idea #1: "학습데이터의 정확도와 성능"를 최대화하는 하이퍼파라미터를 선택

BAD 해당 데이터에서만 완벽하게 적용됨

Idea #2: 전체 데이터셋 중 학습 데이터를 쪼개서 일부를 테스트 데이터로 사용

BAD 알고리즘이 새 데이터에서 어떻게 수행되는지 알 수 없음

Idea #3: 데이터를 세 개(train, val, test)로 나눔

Better val에 대한 하이퍼 파라미터 선택 및 테스트에 대한 평가

Idea #4: 크로스 벨리데이션(교차 검증)

Better 데이터를 여러 개의 fold로 나눔

  • 예제에서는 5-Fold Cross Validation을 사용하였다.
  • 확실하게 분류를 잘 하는 하이퍼파라미터 값을 찾을 수 있다.
  • 데이터가 작을 때는 괜찮지만 데이터가 많은 경우 너무 오래 걸린다는 단점이 존재하여 딥러닝 분야에서는 잘 사용하지 않는다.

k-Nearest Neighbor on images never used.

  • Reasons1: Very slow at test time
  • Reasons2: Distance metrics on pixels are not informative

  • Reasons3: Curse of dimensionality
    k-NN이 잘 동작하기 위해서는 전체 공간을 조밀하게 커버할 만큼의 충분한 트레이닝 샘플이 필요하다. 그러나 공간을 조밀하게 덮으려면 충분한 량의 학습 데이터가 필요하고 그 양은 차원이 증가함에 따라 기하급수적으로 증가한다. 이러한 데이터를 모으는 것은 현실적으로 불가능하다.

요약

  • 학습 이미지와 라벨을 입력하고, 테스트 세트의 라벨을 예측하는 것이 이미지 분류이다.
  • K-Nearest Neighbors 분류기는 가까운 거리 척도 함수를 기반으로 레이블을 예측한다.
  • 이때 거리 척도와 K는 hyper parameter가 된다.
  • 하이퍼 파라미터는 사용자가 직접 선택해야 한다.

4. Linear Classification

Linear Classification은 Neural Network를 구성하는 가장 기본적인 요소로, "parameter model"의 가장 단순한 형태이다.

  • x: input image

  • W: 가중치(Weight). 트레이닝 데이터의 정보가 요약된 벡터

  • b: 바이어스. 곱을 끝내고 더하는 역할을 수행. training data와 상호작용 하지 않는 상수로, 데이터에 무관하게 특정 클래스에 우선권 부여

  • 이 함수는 data x와 parameter W을 가지고 10개의 숫자(각 10개 카테고리의 스코어)를 출력한다. 고양이 카테고리의 스코어가 높으면, 입력값 x가 고양이일 확률이 높음을 의미한다.


👨🏻‍💻 후기

방학에 진행한 인공지능 스터디가 도움이 되었다. 교수님께서 PPT 외적으로 설명해주시는 내용을 쫓아가기 위해 강의를 여러 차례 반복하여 듣기도 하였다. 실제 대학교에서 실제로 진행한 과제이다보니 학생을 대상으로 한 과제도 있는데, 시간이 나면 풀어봐야겠다.

0개의 댓글