JLOG

[Cs231n 정리] Lecture 2 : Image Classification / CS231n 2강 정리 본문

Study/cs231n

[Cs231n 정리] Lecture 2 : Image Classification / CS231n 2강 정리

정정선선 2021. 2. 22. 18:08

강의 영상

https://www.youtube.com/watch?v=OoUX-nOEjG0&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv

한글 번역

https://github.com/visionNoob/CS231N_17_KOR_SUB/blob/master/kor/Lecture 2 Image Classification.ko.srt

참고 : Python + Numpy 튜토리얼

1. Image Classification

컴퓨터가 Image classification을 하려면 입력 이미지, label(고양이, 개 등 카테고리)이 필요하다.

컴퓨터에서 발생되는 문제들

1) Semantic Gap (의미론적 차이)

컴퓨터에게 이미지는 큰 격자 모양의 숫자 집합으로 이루어져 있어, 객체를 인식하기에는 어려워 보인다.

사진이 조금만 달라져도 픽셀값들이 대부분 변경될 수 있어, 객체를 지속적으로 인식하기에는 어렵다.

컴퓨터는 이미지를 숫자로 인식하기 때문에 아래와 같은 문제점들이 발생한다.

  • Viewpoint variation(바라보는 관점)

  • illumination(조명)

  • Deformation(변형)

  • Occlusion(가려짐)

  • Background Clutter(배경과 비슷한 경우)

  • Intraclass variation(클래스 내에 다양성)

'고양이'를 인식하기 위하여 위와 같은 문제들을 해결 해야 한다.

사람은 쉽게 고양이를 인식할 수 있지만, 컴퓨터가 다양한 상황에서 고양이를 인식하기 위한 알고리즘 생각한다는 것은 기적에 가까울 것이다.

현재 물체 인식은 사람보다 높은 성능을 보여주고 있고, 어떤 요소들이 이를 가능하게 했는지에 대해서 공부한다.

지금까지 시도 되었던 알고리즘 with Edge

앞서 언급한 문제 때문에 객체를 인식하는 알고리즘은 쉽게 작성될 수 없다.

Huble & Wiesel의 연구에 의해 Edges를 이용한 방법이 있다.

세개의 선이 만나는 지점을 corner라고 했을 때 고양이의 corner 규칙 집합을 이용해 구별하는 것이다.

문제

  1. 강인하지 않음

    이 알고리즘은 고양이의 무늬, 자세 등에 대해 영향을 받게 되고 잘 사용 되지 않는다.

  1. 낮은 확장성

    강아지, 비행기와 같은 특정 객체에 대한 집합을 모두 정의해야 하기 때문에 많은 객체에 대해 이용 되기가 어렵다.

Data-Driven Approach(데이터 중심 접근방법)

edge를 이용한 알고리즘의 문제들을 해결하기 위해 데이터 중심 접근방법 방식을 사용했다.

많은 이미지 데이터 셋과 label을 수집하여, Machine Learning Classifier를 학습시킨다.

이때, ML 알고리즘은 많은 데이터들을 요약해 다양한 객체들을 인식할 수 있는 모델을 만들게 된다.

Nearest Neighbor

첫번째 classifier로 nearest neighbor가 있다.

Nearest neighbor는 단순히 train data를 기억하고, test data와 비교해 label을 예측한다.

객체를 인식하기 위해 두가지 함수가 필요하다.

첫 번째, train 함수로서 image와 label을 input으로 받고, 학습된 모델을 출력한다.

두 번째, 학습된 모델과 test_image를 입력으로 받고, test_label을 출력한다.

+CIFAR-10 data

이 수업에서 사용될 데이터 셋으로서

10가지의 class가 존재하고 50,000개의 학습용 데이터(이미지, label)와 10,000개의 테스트 이미지가 존재한다.

왼쪽은 10개로 나눠진 train set data이고, 오른쪽은 nearest neighbor를 사용한 test 결과이다. 얼핏 보기에 비슷한 이미지들이지만, 객체 종류가 다른 것을 확인할 수 있다.

이미지 비교 함수

test 이미지와 train 이미지를 비교하기 위한 비교함수

-L1 distance(Manhattan distance)

단순히 pixel wise로 비교하고 차이에 절대값을 취해준다.

Nearest Neighbor with L1 distance에 해당하는 코드

train 함수는 단순하게 train data, label에 대한 정보들을 저장하고,

predict 함수는 train set에 대한 test data의 길이로 유사도를 측정하는 것을 확인할 수 있다.

이때, 각 함수의 알고리즘의 시간 복잡도는

train은 단순히 train set을 저장함으로서 O(1),

predict는 모든 test set에 대해 train set과 길이 비교를 해야함으로 N개의 예제에 대해 O(N)이다.

predict(예측)가 오래 걸린다면, 새로운 예제를 예측할 때 마다 그만큼의 시간이 소요가 되고 성능이 낮은 기기에서도 동작해야함으로 소요시간이 많이 걸리는 것은 좋지 않다.

보통 train이 조금 오래 걸리고, predict가 빨리 되는 것을 선호한다.

높은 성능의 기기에서 시간을 두고 학습을 시키고, 이 학습된 모델을 낮은 성능의 기기에서 사용하는 것이 더 좋기 때문이다.

이러한 관점에서 NN 알고리즘은 반대라는 것을 알 수 있다.

K-Nearest Neighbor

위의 사진은 NN 알고리즘을 사용해 분류를 한 사진이다.

여기서 문제점이 나타나는 데

대표적인 문제로서

1) 실제로 초록색이어야 하는 부분이 노란색으로 판별이 되어 있고

2) 빨간색과 파란색 영역이 정확하게 구분 되어 있기 보단 서로를 침범하는 형상으로 나타나는 것을 볼 수 있다.

이러한 문제는 noise(잡음), spurious(가짜) 데이터 때문에 발생이 되는데 가장 가까운(유사한) 점만을 이용해 객체를 예측하기 때문이다.

이러한 문제를 해결하기 위하여 k-NN 알고리즘을 사용한다.

K-Nearest Neighbor

주위의 k개의 이웃을 중 가장 많은 득표 수를 가진 클래스로 예측하는 것이다.

K의 개수가 늘어날 수록 뾰족한 경계들이 부드러워지고, Noise 값들로 인한 예측 부분이 사라짐을 알 수 있다. 즉, K가 높을 수록 Noise에 대해 강해진다.

+분류되지 않은 흰색 부분?

k-nn이 대다수를 결정할 수 없는 지역이다.

추론을 진행하거나 임의로 정할 수 있다.

+Computer Vision 관점

1) 이미지를 고차원 공간의 한 점이라고 생각하는 관점

2) 픽셀을 하나의 고차원 벡터로 생각하는 관점

K-NN에서 사용하지는 않지만 1)2)를 자유롭게 생각할 수 있으면 좋다

K-NN classifier Result with CIFAR10

빨간 색이 오답이고, 초록색이 맞는 답이다.

K-NN 성능이 별로 안 좋은 것을 확인할 수 있다.

Distance metric(거리 척도)

어떤 척도를 사용하는지에 따라 기하학적 구조가 달라진다.

L1의 관점에서는 위의 사각형 위의 점들이 모두 원점에서부터 동일한 거리만큼 떨어져 있다. 어떤 좌표 시스템인지에 따라 많은 영향을 받는다(좌표계를 회전시키면 L1 distance가 변경 됨.

하지만 L2의 관점에서는 원으로 나타낼 수 있다. 그리고 좌표계와 아무 연관이 없다.

만약 특징 벡터의 각각 요소가 개별적인 의미를 가지고 있다면(키, 몸무게) L1 distance가 더 잘 어울릴 수 있다.

(메모 : 왜????)

일반적인 벡터이고 요소들간의 실질적인 의미를 잘 모르는 경우라면 L2 distance가 더 잘 어울릴 수 있다.

만약 어떤 문제에 대해 K-NN classifier를 사용하려면 단순히 거리만 계산해주면 된다. 새로운 문제를 접했을 때 간단히 시도해 볼만할 알고리즘이다.

L1 distance를 사용했을 때 좌표축에 영향을 받는 경계를 가지고 있음을 알 수 있다.

하지만 L2 distance는 좌표축의 영향을 받지 않아 조금 더 자연스러움을 확인할 수 있다.

(데모 사이트에서 L1, L2를 바꿔가면서 직관적으로 확인할 수 있다.

http://vision.stanford.edu/teaching/cs231n-demos/knn/)

Hyper parameter

어떤 거리 척도를 사용하는지, 몇개의 K를 사용할지 결정 짓는 것

problem-dependent :

하이퍼 파라미터를 결정짓기 위해 문제에 따라 테스팅을 진행하면서 좋은 성능을 가지는 하이퍼 파라미터를 선택하면 된다.

KNN의 경우 학습 데이터만 신경을 쓰면 높은 정확도를 가지게 될 것이고 새로운 데이터를 잘 예측하지 못할 확률이 높다.

Idea #1 : Train 데이터만 사용해 hyper parameter를 결정한다면 k=1인 경우 학습 데이터를 가장 완벽하게 분류하고, 새로운 데이터가 들어왔을 때 적절하지 못하게 분류할 확률이 크다.

Idea #2 : Test 데이터만 사용해 hyper parameter를 결정한다면 단순히 test 데이터에만 치중한 하이퍼 파라미터 값이 설정될 수 있다.

Idea #3 : 기계학습의 목적은 한번도 보지 못한 데이터에서 잘 동작해야 한다. 그래서 validation을 이용해 검증을 하고, 가장 좋은 값을 하이퍼파라미터 값으로 선택한다. 단 한번 test set을 이용해 오직 한번만 테스팅할 수 있고, 이 값이 논문과 보고서에 사용되어야 한다(새로운 데이터에 대해 성능을 예상할 수 있음).

Cross Validation(교차 검증)

작은 데이터셋에서 많이 사용 되는 방법이다.

처음 4개의 fold에서 하이퍼 파라미터를 학습시키고 남은 한 fold에서 알고리즘을 평가한다. 이것을 계속 순환해 최적의 파라미터를 구한다.

딥러닝의 경우 큰 모델을 학습시킬 때 계산량이 많아 실제로는 잘 사용하지 않는다.

cross validation을 이용하면 아래와 같은 결과를 볼 수 있다.

x축은 k이고, y는 분류 정확도이다. 이 모델에서는 k=7인 경우 가장 높은 정확도를 보여주고 있다.

하지만 실제로는 입력이 이미지인 경우 k-NN을 잘 사용하지 않는다.

1) 속도 문제 : predict 속도가 너무 느려 사용하지 않는다.

2) L1 / L2 distance는 이미지간 유사도(거리)를 측정하기에 적절하지 않다.

아래의 세 이미지는 L2 길이가 같도록 만들어졌지만, 모두 다른 이미지라는 것을 확인할 수 있다.

Linear Classification

Linear classifier는 전체 NN의 구성이 되기 때문에 중요하다.

다양한 컴포넌트들을 쌓아서 NN을 구축할 수 있다.

여기서 가장 기본이 되는 블록이 Linear classifier이다.

블록처럼 쌓는다는 것은 아래의 예제를 들 수 있다.

Image Captioning에서 이미지를 입력으로 받고 이미지를 설명하는 문장을 출력한다.

이미지를 인식하기 위한 CNN과 언어를 인식하기 위한 RNN을 블럭처럼 쌓아 어려운 문제를 해결할 수 있게 한다.

CIFAR-10 데이터 셋으로 Linear classification을 살펴보면,

X : 입력 이미지

W : 가중치, 세타(theta)

b : 바이어스, 곱을 끝내고 더하는 역할로 데이터에 무관하게 특정 클래스에 '우선권'을 부여한다.

f(x,W) = Wx + b는 Linear classification이다.

이미지 데이터와 가중치 값을 더하여 각 10개의 class에 대한 score를 나타낸다.

train을 시키며 W에 적절한 가중치 값을 모아준다.

이 학습된 가중치를 이용해 낮은 기기 성능에서 새로운 데이터에 대한 predict를 빠르게 진행할 수 있다.

어떤 모델을 사용하고, W의 값을 적절히 학습시키는 지가 NN 아키텍쳐를 설계하는 과정이다.

이미지 데이터와 W 데이터를 내적하고, bias 값을 더해 각각의 score를 계산한다.

여기서 w와 x의 내적은 클래스 간 템플릿의 유사도를 측정하는 것과 비슷함을 알 수 있고, bias를 더하는 것은 각 클래스에 scailing offsets을 해주는 것이다.

Linear classifier로 학습시킨 각 10개 카테고리 행 벡터들을 시각화 한 것이다.

각 이미지들은 흐릿하게 각각의 물체 특징을 보이고 있는 것처럼 보이지만 자세히 살펴보면 말의 머리가 두개인 듯 조금 이상한 부분들이 있다.

Linear classifier는 클래스당 하나의 템플렛 밖에 허용하지 않아, 이렇게 밖에 학습을 시키지 못한다.

하지만 Neural Network와 같은 복잡한 모델이라면 조금 더 정확도 높은 결과를 볼 수 있을 것이다.

Linear classifier는 각각의 클래스를 구분 시키는 선형 결정 경계 역할을 한다.

하지만 복잡한 이미지를 판별하기 위해 선형 식은 한계가 발생한다.

1) parity problem(반전성 문제) - 홀, 짝수를 분류할 때

0보다 큰 픽셀의 수가 홀수, 짝수 일 때 분별하는 것이다.

예를 들면 (1,1) -2 / (1, 0) -1/ (-1,-1) -0 이다. 단순히 선 하나로 분류 할 수 없다.

2) Multimodal problem - 한 클래스가 다양한 공간에 분포하는 경우

클래스가 다양한 공간에 분포하는 경우 Linear classifier로 해결하기 어렵다.

파란색의 섬들이 분포하고 그 의외의 구간은 모두 빨간색이다.

다음 수업 preview

Comments