[CS231n] Lecture 2

7 minute read

[CS231n] Lecture 2 | Image Classification

1. Image Classification

Image Classification은 컴퓨터 비전 분야에서 Core Task에 속한다.

입력 이미지를 받고 해당 이미지가 어떤 레이블에 속하는지 분류해 내는 것이 iamge classification이다.

사람에게는 굉장히 쉬운 일이지만 컴퓨터에게는 고도의 연산이 필요한 어려운 작업이다.

1) The Problem

Image Classification을 수행함에 있어서 극복해야 할 점들은 다음과 같다.

  1. Semantic Gap 이미지는 아주 큰 격자 모양의 숫자집합으로 이루어져 있다. [ ex) 800x600 의 이미지에 800 x 600 x3(channel) 개의 숫자로 이루어져 있다. ] 이러한 거대한 데이터를 통해 이 이미지가 의미하는 바를 찾는 것이란 쉽지 않다.
  2. View Point Variation 데이터에서 이미지를 촬영한 카메라의 각도가 조금만 달라진다면 이미지의 데이터가 크게 변화할 수 있다.
  3. Illumination 주변환경의 밝기에 대해서도 알고리즘은 robust해야 한다.
  4. Deformation 같은 label에 속한 이미지더라도 객체가 어떠한 형태를 취하고 있는지 상관없이 같은 객체라는 사실은 변함이 없으므로 알고리즘은 이러한 문제에서도 robust해야한다.
  5. Occlusion 객체가 어떠한 사물에 의해 가려져 일부분만 보이더라도 분류할 수 있어야 한다.
  6. Background Clutter 찾고자 하는 객체가 배경과 유사한 색상이나 형태를 취하고 있더라도 객체를 분류할 수 있어야 한다.
  7. Intraclass variation 객체의 형태가 다양할 경우 그러한 객체들에 대해서 같은 class로 분류할 수 있어야 한다.

위에서 제시한 문제들은 image classification에 대해서 일반적으로 극복해야 할 문제들이다. 우리가 이용할 알고리즘은 위에서 제시된 문제들에 대해서 robust한 형태를 취해야 한다.

한 개의 객체를 분류하는 것이 아닌 (단순 이진 분류가 아닌 ) 여러 객체에 대해서 위 문제들에 robust한 알고리즘을 만들어야 한다는 것을 고려하면 컴퓨터에게 매우 어려운 일이고 완벽한 알고리즘을 만든다는 것은 기적에 가까운 일이다.

2) API를 만든다면 ?

하나의 객체를 분류하는 API를 만든다고 가정한다면 간략하게 아래와 같이 작성할 수 있을 것이다.

def classification_cat():
    '''
    고양이를 분류하는 함수
    '''
    return label

함수의 내용에는 고양이의 특징에 대해서 체크하고 이를 통해 분류하는 내용의 code가 작성될 수 있다.

하지만 이러한 코드를 통해 객체를 분류하는 것은 위에서 제시된 problem들에 대해서 해결하는 것이 어려울 뿐더러 여러 class에 대해서 분류하는 알고리즘을 만든다고 한다면 새로운 함수를 만드는 상황에 놓일 수 있다. 이러한 일은 일일히 작성하기에 불가능한 일이다.

우리는 다양한 객체들에게 정확하고 유연하게 적용 가능한 확장성 있는 알고리즘을 만들어야 한다.

3) Data Driven Approach

API를 통해 분류 알고리즘을 만드는 것은 매우 비효율적이기 때문에 우리는 Data Driven Approach 방식을 이용해야 한다.

인터넷에는 엄청난 양의 데이터가 존재하는데 이러한 데이터의 특징을 이용하여 컴퓨터가 각각의 label의 규칙을 인식할 수 있도록 하는 방식이다.

단계적으로 기술하자면 아래와 같다.

  1. Collect a dataset of images and labels
  2. Use Machine Learning to train a classifier
  3. Evaluate the classifier on new images

이러한 접근 방식을 이용하면 새로운 API를 만들 수 있다.

  1. Train 함수 입력으로 이미지와 레이블을 넣고 모델을 출력하도록 한다.

  2. Predict 함수 입력은 모델이고 출력은 이미지의 예측값이다.

이러한 Data Driven Approach 방식은 Deep Learning 방식 뿐만 아니라 Machine Learning 방식에도 유용한 방법이다.

2. Simple Classifier

간단한 분류 모델에 대해서 살펴본다.

1) Nearest Neighbor

NN

Train step , Predict step 의 두 단계로 나눈다면

Train step에서는 단순히 들어온 데이터와 레이블에 대해서 저장한다.

Predict step에서는 들어온 데이터를 train step에서 기억한 이미지와 비교하여 차이가 가장 적은 데이터가 해당하는 레이블을 반환한다.

이러한 모델을 CIFAR10 데이터셋에 적용해 본다.

  • CIFAR10 - Machine Learning에서 자주 쓰이는 연습용(테스트용) 데이터셋으로 10가지 클래스가 존재하면 총 50,000개의 train image와 10,000개의 test image 가 존재한다.

[결과]

nn-cifar10

위 이미지는 Nearest Neighbors 모델을 이용하여 데이터셋에 대한 결과를 반환한 결과이다.

왼쪽 열을 입력으로 넣어주면 해당 행에 가장 유사한 순으로 배열되어 있다. 정확한 것은 아니지만 겉으로 봤을 때, 꽤나 유사한 형태를 띄고 있는 것을 확인할 수 있다.

하지만 이미지가 비슷하기만 할 뿐, 정확하지 않다는 것을 쉽게 확인할 수 있다. (개구리의 경우 흰 배경을 가진 이미지를 같은 label이라고 분류 )

위 모델은 L1 Distance ( Mangattan distance )를 사용하였다.

L1 Distance는 각 필셀간 데이터의 차를 이용한 방법으로 가장 단순하고 간단한 비교 방법이다.

l1

두 이미지에 대해 fixel 데이터의 차에 대해 모두 더한 값을 지표로 사용하여 이 값이 가장 작은 이미지가 가장 유사한 이미지라고 판단한다.

[ NN 분류기의 python code 구현 ]

nn_code

  • argmin() : 함수값을 최소로 만드는 정의역을 반환 ( 최솟값의 index를 반환 )

일반적으로 이상적인 모델은 train 과정에서 오래 걸리더라도 predict 과정은 짧아야 한다. 하지만 NN 모델의 경우 그 와 반대이다. train 과정에서 O(1) 의 시간복잡도이며 predict 과정에서 O(n)의 시간복잡도로 구성되어 있다. 이러한 모델은 바람직한 모델이 아니라고 볼 수 있다.

아래 이미지는 NN 분류기의 decision regions이다.

nn_d_r

2차원 평면 상의 각 점은 학습 데이터를 의미하고 색상은 각각의 label을 의미한다. 색으로 분류된 영역은 새로운 데이터가 이 모델에 입력 되었을 때, 어떤 label에 속할지 K(고려하는 이웃의 수)를 고려하여 지정된 영역이다.

하지만 이 이미지를 확인해 보면 오류가 많다. 가운데 부분에 초록 영역 사이에 노란색 영역이 있다. 또한 각 영역 사이의 경계가 부드럽지 못하다.

이러한 문제를 해결하기 위해 k의 값을 조정하는 방법을 생각할 수 있다.

nn_d_r_k

k의 값을 조정하여 영역에 대해서 조금더 robust한 모델을 만들 수 있다. ( 단순히 가장 가까운 label로 분류하는 것이 아닌 투표형식 (가능성 )으로 분류가 진행되기 때문 )

k를 조정하는 방법 말고 두 점 사이의 거리를 고려하는 방법을 바꿔보는 방법도 있다. [거리 척도 변경] 위의 예시에서는 L1 Distance를 이용하여 두 점 사이의 거리를 측정 했지만 사실 L1 Distance의 방식은 단순하지만 성능이 좋지는 않다. L1을 대신하여 L2 Distance (Euclidean distance)를 이용할 수 있다.

l2

위 이미지는 L1 과 L2의 차이를 명확하게 설명한다. L1의 계산방식은 원점을 중심으로 마름모 형태의 테두리가 모두 같은 거리라고 계산한다. 하지만 L2의 계산방식은 원점을 중심으로 정확히 원의 형태로 같은 거리라고 계산한다.

아래 이미지는 L1과 L2 Distance 의 비교를 위해 각각 decision region을 그려본 이미지이다. L1,L2

결과를 확인해 보면 거리 척도에 따라 경계선의 모양이 달라짐을 확인할 수 있다.

L2의 경우 좌표축의 영향을 받지 않고 거리를 계산하기 때문에 L1에 비해 조금더 자연스러운 형태를 가지고 있음을 확인할 수 있다.

2) Hyper parameters

위에서 k(고려하는 이웃의 수)와 distance를 변경하며 모델의 성능을 높이는 방법에 대해서 알아 보았다. 이러한 방식으로 모델이 직접 학습하는 것이 아닌 사람이 모델이 학습하기 이전에 직접 설정해 줘야하는 변수들에 대해서 Hyper parameter라고 한다.

최적의 hyper parameter를 설정해 줘야 모델의 성능을 최대치로 이끌어 낼 수 있다. 이러한 최적의 hyper parameter를 찾는 방법은 다양한 hyper parameter값을 시도해 보고 가장 좋은 값을 이용하는 방법이다.

hyper

쉽게 생각해 볼 수 있는 방법으로는 위 3가지 방법이 있다.

  1. 학습데이터의 정확도와 성능을 최대화 하는 하이퍼파라미터를 선택하는 방법
    • 학습에 이용한 데이터에 대해서만 정확한 성능을 가지므로 좋지 않은 방법
    • K-NN분류로 예를 들면 K=1일 때, 가장 정확함 -> 새로운 데이터에 대해 부정확함.
    • 가장 좋은 모델은 모델이 한번도 보지 못한 데이터에 대해서 정확히 분류해 내야한다.(범용성 ) 이러한 점에서 어긋남.
  2. Train ,Test데이터셋으로 나눈후 test데이터를 통한 결과가 좋은 하이퍼 파라미터를 선택하는 방법
    • 이 방법은 위 방법보다는 좋아보일지라도 위와 마찬가지로 test 데이터셋에만 성능이 좋은 하이퍼 파라미터를 찾게 되는 것이다. 이 또한 범용성의 부분에서 어긋난다.
  3. Train, Test, Validation 데이터셋으로 나눈후 , validation 데이터셋에 적합한 하이퍼파라미터를 찾고 최종단계에 test데이터 셋을 이용하여 결과를 내는 방법
    • test 데이터셋은 하이퍼 파라미터를 정하는데 아무런 영향을 끼치지 않고 말 그대로 모델을(성능을) test하는데 쓰인다.

또 다른 hyper parameter를 찾는 방법으로 Cross Validation방법이 있다.

cross_valid

작은 데이터셋에 대해서 자주 쓰이머 머신러닝에서 많이쓰인다. 위 이미지에서 볼 수 있듯이 노란색으로 표시된 부분이 Validation 데이터셋이며 이 를 고정시킨 상태에서 학습시키는 것이 아니라 여러번 바꿔가면서 최적의 성능을 내는 hyper parameter를 찾는다. 이러한 방법의 장점으로는 하나의 validation 데이터셋에 최적화된 hyper parameter를 이용하여 test 데이터셋을 평가하지 않고 여러개의 validation 데이터셋을 참고하여 가장 좋은 성능을 내는 hyper parameter를 찾는다는 것이다. 하지만 디러닝 같은 큰 모델을 학습시킬때는 학습시간 자체가 오래걸리고 계산량 또한 많기 때문에 실제로 적용시키기는 어렵다.

3) K-NN on images never used

앞서 k-nn을 예시로 성능지표와 하이퍼 파라미터등에 대해서 알아보았다.

never_used

하지만 이러한 K-NN분류는 절대 쓰이지 않는다. 이유는,

  1. 이상적인 모델이라면 학습이 오래 걸릴지라도 predict는 빠르게 실행되어야 한다. 하지만 k-nn은 그와 반대로 학습이 빠르고 예측이 오래걸린다.
  2. L1,L2 Distance가 이미지간의 거리를 측정하기에 적절하지 않다. 위 이미지는 원본 이미지에 대해 약간의 변화를 준 이미지이다. L1,L2를 통해 거리를 측정해 보면 3개의 이미지 모두 같은 거리를 도출했다. (거리가 같다면 같은 데이터여야 하지만 3개의 이미지 모두 다른 이미지이다. )
  3. 차원의 저주

    데이터의 특성은 많은데 비해, 데이터의 양 자체가 부족하다면 모델의 성능을 저하시킨다.

    참조 : https://datapedia.tistory.com/15

3. Linear Classification

Linear Classification은 아주 간단한 알고리즘이지만 NN과 CNN의 기반이 되는 중요한 알고리즘이다.

linear_c

Linear classification은 parametric model의 가장 기본적인 형태이다. 위 이미지에서 볼 수 있듯이 2개의 parameter를 볼 수 있다.

X는 입력으로 넣고자 하는 이미지에 해당한다. W는 가중치에 해당하며 사람이 직접 넣어주는 것이 아니다.

두 개의 parameter를 가진 F를 통해 10개의 class scores를 도출한다.

따라서 딥러닝은 바로 이 함수 F의 구조를 적절하게 잘 설계하는 일이라고 할 수 있다. 그 예로는 입력이미지 x와 가중치w가 어떠한 방법으로 조합되어 결과를 도출하는지 설계하는 것이다. 이러한 설계방법이 모두 NN의 구조를 설계하는 일이다.

위 함수를 조합하는 방법에 대해서 간단하게 알아보자.

  1. 가중치 W 와 데이터 X를 조합하는 가장 쉬운 방법은 이 둘을 곱하는 것이다. f(x,W) = Wx가 되며 결과값이 (10,1)차원으로 도출되어야 하므로 이를 고려하여 지정된 w를 x에 곱해준다. (곱해질 때, 이미지는 (3072,1)의 한 줄로 길게 늘어선 형태로 변환되어 곱해진다. [32x32x3의 경우] )
  2. bias가 위 과정을 통해 도출된 결과에 더해지는 경우가 있다. bias는 데이터와 무관하게 클래스별로 가중치를 두는 것을 의미한다. 이러한 방식을 통해 데이터의 불균형이 있을 경우, 더욱 적은 양의 데이터에 대해서 가중치를 더 높게 두어 학습시킬수 있다.

f_xw

위 이미지는 위에서 설명한 함수의 계산 방식을 시각화 한 것이다.

여기서 주목해야 할 점은 가중치와 데이터를 내적하여 계산하게 되는데 도출된 score가 높게 나올수록 w와 x가 유사하다는 것이다. 역전파를 통해 점수가 더 높아지도록 가중치에 변화가 생기면 해당 label에 속한 w는 해당 label 이미지와 유사한 형태를 띄도록 학습된다.

이러한 Linear Classification을 해석하는 방법은 여러가지가 있다.

  1. Visualize weights Templete

temp

아래에 각 label에 속한 w들을 시각화 한 이미지들이 나열되어 있다. 이미지들이 명확하지 않은 모습을 띄고 있는 이유는 Linear Classification은 label당 하나의 템플릿( w를 시각화한 것-w)만을 허용하기 때문이다. 이러한 점을 알 수 있는 부분은 horse label이다. 머리가 양쪽으로 두 개 있는 것을 확인할 수 있다. 이러한 점이 하나의 템플릿만을 허용하기 때문에 생기는 것이다. [ 여러 특징들을 평균화하여 하나의 템플릿으로 씀 ]

  1. A point of High dimention

    high_d

    이미지를 고차원 공간상의 한 점이라고 해석을 하면 Linear Classification은 그 점들을 분류하는 선형 결정 경계을 학습한다고 할 수 있다.

하지만 Linear Classification으로 해결하기 어려운 경우가 존재한다.

hard_case

데이터의 구조가 굉장히 인위적이지만 극단적인 예를 들면 위 이미지의 데이터를 예시로 들 수 있다. 분홍색 영역과 파란색 영역으로 이루어진 데이터셋을 Linear classification으로 분류모델을 만든다고 하면 위에서 제시된 데이터셋의 경우 불가능하다.

Tags: ,

Categories:

Updated:

Comments