구현 코드



Image Classification?

Image Classification이란, Input image를 받아 미리 정해놓은 category 집합 중 어디에 속하는지를 알아맞추는 Computer Vision 분야이다. 이 과정은 사람에게는 매우 쉽지만 기계에게는 어려운 일이다. 왜냐하면 컴퓨터는 이미지를 거대한 숫자집합으로만 인식하기 때문이다(semantic gap). 이미지에 아주 미묘한 변화만 줘도 픽셀 값들은 모조리 달라지며, 알고리즘은 이런것들(조명, 화각, 객체 자세 변화, 가려짐, background clutter:배경과 비슷, 하나의 클래스에서의 다양성 등등)에 강인해야 한다.



Image Classification의 방법

1. 명시적인 규칙 집합 선언

명시적으로 모든 case에 대한 조건을 하드 코딩하는 알고리즘이다. 강인하지 않고, 또 다른 객체 인식 시, 규칙을 처음부터 다시 선언해야 하기에 확장성이 없다는 큰 문제점이 있어 CV에서는 사용하지 않는다.

2. Data-Driven Approach

해당 데이터를 매우 많이 수집하여 ML Classifier를 학습하는 방법이다. 데이터 중심 접근 방법은, 물고기는 무엇이고 고양이는 무엇이다라고 일일이 하드 코딩을 하지 않고, 고양이/물고기 사진을 매우 많이 수집하여 컴퓨터가 스스로 학습할 수 있게 한다.(본 강의는 CIFAR-10을 사용하여 설명한다.)

2-1) Nearest Neighbor

모든 데이터 저장하고(train) 가장 유사한 이미지를 찾는(pred) 가장 간단한 Data-Driven Approach Classifier이다. 다양한 거리척도를 사용하여 유사성을 판단하며, train 시간보다 test 시간이 더 느리다는 특징이 있다.

2-1-1) 유사성 판단

NN은 유사성 판단에 사용하는 거리척도를 사용한다. 거리척도에는 대표적으로 L1(manhattan) distance, L2(Euclidean) distance가 있다. 거리척도마다 특성이 다르기 때문에, 데이터 및 target의 성질에 따라 적절한 거리척도를 사용해주는 것이 좋다.

  • L2 distance

    L1 distance는, test와 train 이미지 픽셀간 차이의 제곱을 계산하며, 모든 픽셀의 수행결과를 모두 더한 뒤, 제곱근을 구한다. 좌표계와 연관이 없으며 각 요소의 특성을 잘 모를때 사용한다.

  • L1 distance

    L1 distance는, test와 train 이미지 픽셀간 차이의 절대값을 계산하며, 모든 픽셀의 수행결과를 모두 더한다. 아래와 같은 예제에서, test 이미지와 train 이미지는 L1 distance 기준 456만큼 차이가 난다고 할 수 있다. L1 distance는 어떤 좌표 시스템이냐에 따라 영향을 많이 받는다. 좌표계만 회전시켜도 distance가 변하며, 각 요소가 특별한 의미를 가지고 있을 때(봉급, 나이 등등) 사용.

2-1-2) 구현

2-1-3) 속도

train set의 이미지가 N개일때의 속도는 다음과 같다.

  • train

    O(1) : 단순히 데이터를 기억하기만 하면 됨

  • pred

    O(N) : N개의 모든 이미지와 비교하는 과정이 필요함

predict 속도가 train 속도보다 느리다.

2-1-4) 문제점

  • 속도 문제

    우리는 train 속도는 느리더라도 predict 속도가 빠른 것을 원한다. train 과정은 어차피 개발 과정에서 진행되는 것이기 때문에, 속도가 느려도 개발 기간이 늘어날 뿐 큰 문제가 되지 않는다. 그러나 실제 서비스 시에는, 모델이 핸드폰이나 브라우저 같은 low power device에서 동작해야할 수도 있기 때문에, predict 속도가 어느정도 빨라야한다. NN은 이러한 우리의 기대와 정반대이기 때문에 실제 서비스 시 사용하기 어렵다.

  • Decision Regions

    다음은 NN의 Decision Regions를 나타낸 것이다. 2차원 평면상의 각 점은 train 데이터이며, 각 점의 색은 해당 점의 클래스를 나타낸다. 색이 칠해진 영역은 NN이 만들어낸 결정 영역이다.

위 사진에서 보았듯이, NN은 최근접 이웃만을 보고 결정 영역을 생성하므로 이상치에 매우 민감하다. 따라서, 초록색 영역 한 가운데에 노란색 영역이 생기기도 하고, 파란색 영역에 빨간색과 초록색이 침범하기도 하는 등, 제대로 된 분류가 되고있지 않다.



2-2) k-Nearest Neighbors

NN의 문제점을 일부 개선한 K-NN은, 단순히 가장 가까운 이웃을 찾기보다는 k개의 가까운 이웃을 찾고 이웃끼리 투표를 진행한다. 여기서 가장 많은 투표를 획득한 클래스를 최종 클래스로 분류한다. K는 적어도 1보다 커야 결정 경계가 더 부드러워지고 좋은 결과를 보이며, 여기서 K는 하이퍼 파라미터이다.

이미지 분류에서 K-NN은 성능이 좋지 않지만, K-NN에 다양한 거리 척도를 사용하면 다양한 문제를 다룰 수 있음(e.g. NLP). 거리척도만 잘 정해주면 어떤 종류의 데이터도 다룰 수 있기 때문에, 새로운 문제를 접했을 때 간단히 시도해 볼만함.

2-2-1) 하이퍼 파라미터

K-NN의 하이퍼 파리미터에는 K와 거리척도가 있다. 학습 전 사전에 반드시 정해야 하며, 여러가지를 실험/시도해보고 최고를 찾아야 한다. 다음은 하이퍼 파라미터 튜닝의 가능한 시나리오별 정리 내용이다.

  • 1. 학습 데이터의 정확도와 성능을 최대화하는 하이퍼 파라미터 선택

    • terrible idea
    • K=1일 때, 모델은 학습 데이터를 완벽하게 분류하지만, 위 decision regions에서도 보았듯이, test 데이터에 대해서는 제대로 된 분류가 되지 않는다.

  • 2. 전체 데이터 중 학습 데이터를 쪼개서 학습 데이터로 다양한 하이퍼 파라미터 값들을 학습시키고 테스트 데이터에 적용

    • 조금 더 합리적이지만 여전히 terrible idea.
    • 한번도 보지 못했던 데이터에 대해서 성능이 잘 나와야 하지만, 그저 테스트 셋에서만 잘 동작하는 하이퍼파라미터가 됨.

  • 3. train, validation, test로 나눔

    • 가장 괜찮은 시나리오이다.
    • 다양한 하이퍼 파라미터로 트레인 셋을 학습시키고, validation 데이터로 검증한다. 이 때, 가장 좋았던 하이퍼 파라미터를 선택하고, 해당 하이퍼 파라미터를 test에서는 오로지 한번만 수행하여 스코어를 산출한다. 이렇게 되면, test 데이터는 한번도 보지 못한 데이터가 되어 올바른 score를 계산할 수 있다.

  • 4. cross validation(교차검증)

    • 작은 데이터셋일 때 사용하며 딥러닝에서는 계산량이 많아 잘 사용하지 않는다.
    • 이외 ML에서는 거의 표준처럼 사용한다.
    • test 데이터를 정하고 validation set을 번갈아가며 지정하는 방식

2-2-2) 문제점

이미지에 K-NN을 사용할 수 없는 이유는 다음과 같다.

  • 1. 너무 느린 predict 시간

    위에서 설명했듯이, predict 시간이 너무 느리다. train 속도는 느리더라도 predict 속도가 빠른 모델이 좋은 모델이다.

  • 2. 거리척도의 지각적 유사성 판단 불가

    L1/L2 Distance는 이미지간의 거리를 측정하기에 유용하지 않음

위 사진은 원본 이미지를 적절히 변형한 것이다. 하지만 위 사진의 L2 Distance는 모두 동일하다. 지각적 유사도를 측정하기에 적합하지 않다는 것이다. 혹자는 해당 이미지가 모두 같은 사람이므로 모두 같은 거리이면 좋은 게 아닌가?라고 생각할 수도 있다. 그러나 이 말인 즉슨, 서로 다른 이미지에 대해 적절한 변형을 통해 distance를 가깝게 만들 수도 있고, 동일 이미지에 대해서 미묘한 변화에도 제멋대로 distance가 변할 수 있다는 말과 같다. 이는, 글의 서두에서 밝힌 강인함을 모델이 만족하지 못한다는 뜻이다.

  • 3. 차원의 저주 문제

K-NN은 트레인 데이터를 이용하여 공간을 분할한다. 따라서 K-NN이 잘 동작하려면 전체 공간을 조밀하게 커버할 만큼의 충분한 트레이닝 샘플이 필요하며, 차원이 증가함에 따라 필요한 샘플의 수는 기하급수적으로 증가한다. 기하 급수적으로 증가하는 모든 것은 언제나 옳지 않으며, 특히 CV에 사용되는 고화질 이미지는 더더욱 데이터 확보가 어렵다는 문제가 있다.

3. Parametric Approach

3-1) Linear classifier

아주 간단한 Neural Network과 CNN 기반 알고리즘이다. Nueral Network와 CNN은 마치 레고 블럭과 같은데, 이러한 딥러닝 알고리즘의 가장 기본이 되는 블럭이 바로 Linear classifier이다. parametric model의 가장 단순한 형태이며 입력 이미지 x와 가중치 w를 요소로 갖고, F(x,W) = Wx + (bias)의 형태로 표현된다.

3-1-1) 속도

K-NN은 파라미터 없이 그저 전체 트레이닝 셋을 가지고 있었고, 모든 트레이닝 셋을 test time에 사용하여, predict time이 매우 오래걸렸다. 그러나, parametric approach에서는 트레이닝 데이터의 정보를 요약하여 파라미터 W에 모아주기 때문에, predict시에는 W만 있으면 된다. 트레이닝 데이터가 필요 없기 떄문에 predict time이 훨씬 빠르다.

3-1-2) 내부 연산

Linear classifier는 x와 W를 가지고 class의 개수와 동일한 output을 출력한다. 각각의 숫자는 각 카테고리의 스코어이며, 특정 카테고리의 스코어가 높다는건, x가 해당 카테고리일 확률이 높다는 것이다.

CIFAR-10을 예로 들어보겠다. 입력이미지는 (32,32,3)의 shape를 가지는 array인데, 해당 array를 (32×32×3=3012, 1)의 열 벡터로 펴준다. 해당 열 벡터가 10-classes 스코어가 되어야 하므로, 10×3072가 되어야 한다. 따라서 최종적으로 W(10×3072) × X(3072×1) = 10×1짜리 스코어가 출력된다. bias term은 10-dim 열 벡터로 입력과 직접 연결되지는 않고, 데이터와 독립적으로 각 카테고리에 연결된다. 고양이가 개 데이터보다 많다면 고양이 클래스에 상응하는 bias가 더 커지는 형태이다.

3-1-3) 문제점

  • 템플릿 관점

위 이미지는 가중치 행렬 W의 한 행을 뽑아서 이미지로 시각화 해본 결과이다. W의 특정 행 벡터(특정 카테고리)와 이미지의 열벡터간의 내적을 계산하는 것은, 클래스 간 템플릿의 유사도를 측정하는 것과 유사하다. 따라서 가중치 행렬 W의 각 행은 각 이미지에 대한 템플릿으로 볼 수 있다. 여기서, Linear classifier는 각 클래스에 대해서 단 하나의 템플릿만을 학습한다. 한 클래스 내에 다양한 특징이 존재할 수 있지만 모든 것을 평균화하기 때문에 horse의 경우 말 머리가 앞뒤에 존재하는 등 제대로 된 템플릿을 생성하는 데 한계가 존재한다.

  • 결정경계 관점

이미지를 고차원 공간의 한점이라고 보면, Linear classifier는 각 클래스를 구분시켜 주는 선형 결정 경계를 그어준다. 하지만 선이 하나(템플릿이 하나)이기 때문에, 선 하나로 분류할 수 없는 문제가 생길 수 있다. 가령, 홀/짝수를 분류하는 것과 같은 parity problem은 Linear Classifier로 풀기 힘들다.

댓글남기기