CS231n

[CS231n] Lecture2: Image Classification

syveany 2024. 11. 17. 23:37

Lecture2: Image Classification

- CS231n 강의 [1]를 듣고 공부한 내용을 나름대로 정리했다.

CS231n 강의 [1]

 

- 글에 있는 모든 그림과 표는 [2]에서 가져왔다.

 

 

~ 목차 ~

1. Image Classification의 어려움
2. Classifier 종류
    2.1 Nearest Neighbor
        2.1.1 시각화
        2.1.2 수식 표현   
        2.1.3 코드 구현  
        2.1.4 CIFAR-10에 적용
        2.1.5 한계

    2.2 Linear Classification
        2.2.1 수식표현
        2.2.2 시각화
        2.2.3 한계

3. Hyperparameters
    3.1 Train, Val, Test
    3.2 Cross-Validation

 

1. Image Classification의 어려움

- 사람은 이미지를 보고 이미지 속에 어떤 물체가 있는지 쉽게 판단할 수 있다.
   하지만 컴퓨터는 그렇지 않다. 컴퓨터는 입력을 숫자로 받기 때문이다.


컬러이미지의 해상도가 800 x 600일 때, 컴퓨터는 800 x 600 x 3 개의 숫자를 입력으로 받는다.
   여기서 카메라 구도가 조금이라도 달라지면 모든 숫자가 바뀌게 된다.


이런 상황에서 컴퓨터가 숫자만 보고 이미지를 인지하는 것은 쉽지 않은 task이다.

 

컴퓨터는 입력을 숫자로 받는다 [2].

 
- 안그래도 입력을 숫자로 받으니 쉽지 않은데, 실제 상황에서는 같은 물체여도 환경에 따라 이미지의 양상이 다를 수 있으니 더 쉽지 않다. 
같은 고양이어도 아래와 같이 밝기 또는 색상 차이가 있을 수도 있고, 고양이가 잘 안 보여도 맥락을 통해서 고양이임을 파악해야 할 때도 있다.

 
- 이건 사람이 하나하나 특성을 지정해주면서 할 수 있는 일이 아니다.
   물체마다 많은 특성들이 있고, 세상에는 너무 많은 물체가 있기 때문이다.


- 그래서 라벨이 있는 이미지를 엄청 많이 수집에서 classifier를 학습시키는 머신러닝적인 방법을 사용한다.

 

 

2. Classifier 종류

- 여기서는 classifier의 종류로 2가지(Nearest Neighbor, Linear Classification)를 소개한다.

 

  2.1 Nearest Neighbor

  - 말 그대로 가장 가까웃 이웃을 찾아서 그 값도 이웃에 속한다고 하는 것이다. 가장 단순한 classifier이다.

 

 

    2.1.1 시각화

    - 시각화해서 표현하면 다음과 같다.

 

    - K는 이웃의 수를 뜻한다.

    - K-Nearest Neighbors라고 하면 가까운 순서대로 K개의 이웃을 찾아서 제일 많은 이웃을 정답으로 한다는 것이다.

    - K가 커질수록 경계선이 부드러워짐을 알 수 있다. 

 


    2.1.2 수식 표현

    - Nearest Neighbor는 간단히 말해서 비슷한 이미지끼리 묶는 방법이다.

    - 비슷한 이미지끼리 어떻게 묶느냐! 바로 Distance metric을 사용한다.

      - Distance metric에는 L1 distance(Manhattan distance)랑 L2 distance(Euclidean distance)가 있다.

 

    - L1 distance는 test이미지와 train이미지 사이의 픽셀값 차이의 절댓값를 이용해서 거리를 구한다.

    - L2 distance는 test이미지와 train이미지 사이의 픽셀값 차이의 제곱의 루트값를 이용해서 거리를 구한다.

    - L1 distance의 예시는 아래와 같다. 각 픽셀값의 차이를 구해서 더해주면 된다.

L1 distance 예시

 

    - L1 distance에서는 coordinate frame이 바뀌면 L1 distance값이 바뀐다.

    - L2 distance에서는 coordinate frame이 바뀌어도 L2 distance값이 바뀌지 않는다.

      (∵직관적으로 마름모에서 이리저리 움직이면 튀어나가지만 동그란데서 이리저리 움직이면 괜찮다고 생각해보면 될듯)

       → 그래서 벡터에 특징성이 들어있으면 L1이 적합하고, 그냥 일반적인 벡터들로 구성되어 있으면 L2가 적합하다!

 

    - 시각화해서 봤을 때도 L1보다 L2가 좀 더 일반화 되어있다는 것을 알 수 있다.

 

 

    2.1.3 코드 구현

    - 코드로 구현하면 다음과 같다.

 

 

    2.1.4 CIFAR-10에 적용

 

    - 위 사진은 CIFAR-10 데이터셋에 Nearest Neighbor를 적용해본 결과이다. 
    - 잘 보면 그리 정확하지 않음을 알 수 있다. Frog 분류결과에 cat, automobile, airplane 등이 섞여있다.

       대충 봤을 때 비슷한 것끼리 묶어서 생기는 문제이다.

 

 

    2.1.5 한계

    - 실제로 이미지 처리를 할 때 Nearest Neighbor는 거의 사용되지 않는다. 

 

       [이유1] 너무 느림

         - 시간복잡도가 train에서 O(1)이지만 test에서는 O(N)이 된다.

         - Train에서 시간 오래걸리는 건 성능이 좋다면 커버할 수 있지만 test에서 시간이 오래 걸리면 상용화하기에 어렵다.

 

       [이유2] Distance metric가 그리 효과가 없음

         - 아래 4가지 이미지는 모두 다르게 생겼지만 L2 distance가 모두 같다. → L2가 차별 요소가 되지 못한다.

 

       [이유3] 차원이 커지수록 힘들어짐

         - 같은 density를 가지려면 차원이 한 차원 올라갈 때마다 point의 개수가 지수적으로 많이 필요하다. 

 

 

  2.2 Linear Classification

  - 다른 방법으로는 linear classification이 있다.

  - Linear Classification은 단순한 선형 함수를 적용해서 출력값을 구한 뒤, 출력값을 기준으로 데이터를 분류한다.

 

 

    2.2.1 수식 표현

    - 수식으로 표현하면 아래 그림과 같다.

       고양이 이미지가 들어오면, 이미지를 flatten시킨 뒤 가중치 W를 곱해서 출력값 f를 구한다. (필요하면 편향 b도 추가) 

 

    - 예시를 들어보면 다음과 같다.

      3개 클래스를 분류하는 문제에 2x2 이미지가 들어오면 flatten시켜서 가중치 W를 곱해준 뒤 편향을 더해서

      클래스 각각의 점수를 구한다. 

 

 

    2.2.2 시각화

    - CIFAR-10에 Linear Classification을 적용한 뒤, 가중치 행렬 W를 시각화해보면 왼쪽 아래 뿌연 그림과 같다.

      Linear Classification이 대충 이러한 형태의 이미지를 각각의 클래스로 분류하고 있음을 파악할 수 있다.

 

    - 오른쪽 그림과 같이 클래스 각각의 f(x,W)를 구한 뒤, 좌표평면의 이미지들을 f(x,W)를 기준으로 분류한다.

 

 

    2.2.3 한계

    - Linear Classification은 다양한 구도의 같은 물체 사진들은 잘 학습하지 못한다. 

        (∵ 2.2.2의 나온 뿌연 그림과 같이 클래스 별로 하나의 구도만 학습하기 때문)

 

    - Linear Classification으로는 아래 그림과 같은 사례들을 분류하기는 어렵다. 다른 분류 방법이 필요하다.

 

 

3. Hyperparameters

- Hyperparameter란, 학습을 통해 구해지는 파라미터가 아니라 사람이 직접 지정하는 파라미터를 말한다.

  (e.g. K-Nearest Neighbor에서의 K와 distance)

 

- 어떤 파라미터가 제일 좋은지 알려면 실험을 반복하면서 직접 알아내야 한다.

  이때 데이터를 분할하는 방법에는 2가지가 있다. 

 

  3.1 Train, Val, Test

 

    - 전체 데이터셋을 train, val, test로 나눈 뒤, Val로 하이퍼파라미터 튜닝을 하고 Test로 평가를 한다.

 

 

  3.2 Cross-Validation

 

    - 전체 데이터셋을 fold로 나눈뒤, 각 fold를 val로 놓으면서 결과를 평균내는 방법이다.

    - 데이터셋이 적을 때 데이터 효율성을 극대화할 수 있는 방법이다. (+ 딥러닝에서는 많이 사용되지는 않는다)
 

 

 

 

 

참고문헌

[1] Stanford University, "Lecture 2, Image Classification," YouTube, Aug. 12, 2017. [Online]. Available: https://www.youtube.com/watch?v=OoUX-nOEjG0&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=2
[2] F. Li, J. Johnson, and S. Yeung, "CS231n Convolutional Neural Networks for Visual Recognition: Lecture 2 - Image Classification Pipeline," Stanford Univ., 2017. [Online]. Available: http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture2.pdf