[CS231n] Image Classification

ai_lim·2022년 1월 22일
0

CS231n

목록 보기
1/12
post-thumbnail

CS231n 2강

Image Classification이란 이미지가 입력으로 들어오면 이미 정의된 카테고리내에서 컴퓨터가 분류하는 작업이다.

Image Classification이 어려운 이유


우리는 이 사진을 보고 고양이라는 것을 단번에 알아차릴 수 있다.
하지만 컴퓨터는 숫자로 이루어진 배열로 보기때문에 이미지를 분류하는데는 다양한 문제들이 존재한다.

  • Viewpoint Variation (시점 변화)

    view point가 달라지면 배열을 이루고 있는 숫자들이 많이 변한다. 숫자들이 변한다고해서 이미지가 고양이라는 사실은 바뀌진않는다.

  • Illumination (조명 변화)

  • Deformation (객체 변형에 의한 변화)

  • Occlusion (객체 가려짐에 의한 변화)

  • Background Clutter (배경과 유사한 색의 객체)

  • IntraClass variation (클래스 내부의 분산)

Image Classification Algorithm

이미지를 분류하는 알고리즘을 만들때 접근하는 방법이 두가지있다.

1. 이미지의 특징을 찾아서 알고리즘을 만든다.


예를 들어 뾰족한 귀, 꼬리 등 인간의 관점으로 특징을 찾아서 알고리즘을 만든다.
이런 방법을 사용해서 이미지를 분류한다면 객체가 바뀌었을때마다 특징을 새로 잡아야하기때문에 다른 접근 방법을 또 살펴보겠다.

2. 데이터 중심으로 접근


데이터셋을 모은 후 머신러닝을 사용해서 훈련을 시키면 새로운 이미지들에 대해서 라벨을 예측을 할 수 있다.


껍떼기 함수만 보면 이런 과정이다.
우리가 모은 이미지와 그에 대한 라벨을 전달해주면 머신러닝을 통해서 훈련을 하고 그에 맞는 모델을 리턴한다. 리턴한 모델과 테스트하고자하는 이미지를 predict함수에 전달하면 테스트 이미이지에 대한 라벨을 출력하게된다.

1) Nearest Neighbor

데이터 중심으로 접근하는 가장 간단한 알고리즘이다.

훈련데이터와 그에 대한 라벨을 모두 기억하고 테스트 이미지를 주면 훈련 이미지와 가장 비슷한 이미지의 라벨을 예측한다.

CIFAR 10 dataset

훈련데이터에 10개의 클래스가 있고 그에대한 이미지들이 모여있다. 모든것을 기억하고 테스트할 이미지를 주면 가장 유사한 훈련 이미지들을 출력한다.

이때 이미지의 유사도는 어떻게 측정하는 것일까?

이 예제에서는 L1 distance를 사용했다.

  1. 테스트 이미지의 픽셀값과 훈련 이미지의 픽셀값을 뺀다.
  2. 절댓값을 취한다
  3. 픽셀값을 모두 더한다.

이 값을 하나의 지표로 삼아 이미지의 유사도를 측정하는 것이다.

이 과정을 알고리즘으로 살펴보자.

N개의 이미지가 있는 X와 N개의 라벨이 있는 y, 훈련데이터를 Xtr과 ytr에 모두 저장한다.

  1. 모든 훈련데이터의 이미지가 저장된 Xtr과
    비교하고자하는 X의 행을 Xtr과 dimension을 맞춰준다음 빼고 abs를 취해준다.
    axis=1 y축을 기준으로 더한 값들로 저장된 배열을 distances에 저장해준다.
    (참고자료: http://www.gisdeveloper.co.kr/?p=8112)
  2. 그중 제일 작은 값을 argmin으로 찾아내서 그 위치를 min_index에 저장하고
  3. ytr에 그 인덱스값을 넣어 예측값으로 보낸다.

여기서 NN알고리즘에 대해 생각할 점이 있다.


1.보통 우리는 훈련이 오래걸리더라도 예측시간이 짧은것을 선호하는데 NN알고리즘은 train은 한번만 하면 되지만 하나를 예측할때 n개의 샘플을 모두 비교해야한다.너무나 큰 단점이다.


2.NN 알고리즘으로 decision regions를 그려본 이미지이다. 점은 학습데이터, 점의 색은 클래스 라벨이다.
녹색 한 가운데 노란색 영역, 초록색 영역에서 파란색 영역 침범하는 구간 등등decision boundary가 Robust 하지 않음을 볼 수 있다.

이러한 단점들로 NN 알고리즘은 잘 사용하지 않는다.

2) K-Nearest Neighbors

NN에서 일반화한 KNN알고리즘이 있다. 제일 가까운 이웃을 찾는 것이 아니라 가까운 이웃 k개를 찾아 예측하는 것이다.

가까운 이웃의 개수 k를 늘릴수록 경계가 점점 부드러워지는 것을 볼 수있고 영역을 더 잘 구분한다.
만약 하얀 부분에 점이 있다면 어떤 라벨로도 예측을 하지 않는다.


거리 척도에는 아까 소개했던 'L1 거리척도'도 있지만 'L2 거리척도'도 있다.
L1 거리척도는 특정 벡터가 개별적인 의미를 가지고 있을때, L2 거리척도는 일반적인 벡터 요소들의 의미를 모르거나 의미가 별로 없을 때 사용한다고 한다.


거리 척도를 무엇을 쓰느냐에 따라서 decision boundary가 달라지는 것을 볼 수 있다.

하이퍼 파라미터

우리는 K의 값도 지정할 수 있고 어떤 distance를 쓸건지 정할 수도 있다.
이처럼 우리가 지정해주는 값을 하이퍼 파라미터라고 한다. 하이퍼 파라미터를 어떻게 지정해야 좋은 모델을 만들 수 있을까?

  1. train/validation/test 데이터 분리

    데이터셋을 train, validation, test로 나눈다.
    여러 하이퍼 파라미터 값들로 train 데이터를 학습시킨 후 validation으로 검증한다. validation 세트에서 가장 좋았던 하이퍼 파라미터를 선택해서 test를 하는 방법이다.

  2. 교차 검증

    테스트 데이터는 빼놓은 후, 훈련 데이터를 여러개로 쪼개어 validation 세트를 바꾸어가며 최적의 하이퍼 파라미터를 선택하는 방법이다. 딥러닝에서는 잘 사용하지 않는 방법이라고 한다.

KNN알고리즘도 image classification에 잘 안쓰인다.
테스트하는데 시간도 오래걸리고
거리척도가 픽셀단위에서 유용한 정보가 아닐 뿐더러
차원이 늘어나면 필요한 훈련데이터가 기하급수적으로 증가하기때문이다.

0개의 댓글