바위타는 두루미

CS231n 한글 정리 | Lecture 2 | Image Classification 본문

Study/Vision

CS231n 한글 정리 | Lecture 2 | Image Classification

DoRoMii 2020. 3. 5. 17:07
728x90

Stanford University에서 2017년에 강의한 영상을 보며 정리한 자료입니다.

Link : https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv

자료출처http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture2.pdf

참조https://github.com/insurgent92/CS231N_17_KOR_SUB/blob/master/kor/Lecture%202%20%20%20Image%20Classification.ko.srt


Image Classification 은 어떻게 할 수 있을까요?

우선 이미지를 입력받아 어떤 카테고리에 속할지 판단하면 되겠죠

우리의 시각체계는 매우 고도화 되어있기 때문에 물체를 보자마자 바로 분류가 가능하지만 컴퓨터에게 이미지는 큰 격자모양의 숫자들의 집합이기 때문에 쉽게 분류하기가 어렵죠.

  • ViewPoint variation → 보는 방향의 변화
  • Iiiumiation → 조명에 따른 변화
  • Deformaion → 형태의 변화
  • Occlusion → 물체가 가려져 일부만 보여지는 경우
  • Background Clutter → 배경과 비슷한 경우
  • Interclass variation → 하나의 클레스에 속하는 물체들의 다양성

여러 문제들 때문에 인식의 어려움이 있을 수 있습니다.

*이전에도 이미지를 분류하기 위한 다양한 시도가 있었다

Huble과 Wiesel의 연구덕분에 Edges가 중요하다는 사실을 알게 되었고

Corner와 Edges를 이용하여 명시적인 규칙 집합을 만들어 분류하는 방식을 시도한 적이 있다.

이미지를 분류하는 방법에는 다양한 방식이 있지만 가장 첫번째로 생각해 볼 수 있는 방법은 NN입니다.


NN ( Nearest Neighbor )

가장 가까운 경우를 찾아서 그 레이블로 추측하는 방식입니다.

이를 위해서는 두가지 함수가 필요합니다. "Train" 과 "Predict"

Train : 모든 training 데이터에 lable을 달아 저장하는 기능

Predict : 가장 유사한 training 데이터로 예측하는 기능

그렇다면 어떻게 유사도를 구할 수 있을까요?

여러 비교방법들이 있지만, 가장 단순한 방법은 L1 distance를 이용하는 것입니다.


L1 distance는 같은 자리의 픽셀값을 서로 빼고 절댓값을 취하여 모두 더하는 방식입니다.


*Image classification 문제에서 이 방법이 별로인 것 같지만 연습용으로는 매우 좋습니다 :)

왜냐하면 Train에 소요되는 시간은 O(1)이지만, Test시에는 N개의 학습데이터를 모두 비교해야하기 때문에 O(N)이 소요됩니다.

실제로 우리는 Train에서는 조금 느려도 되지만, Test 시에는 빠르게 동작하기를 원합니다.

따라서 그런 관점에서는 image classification에서 NN은 적합하지 않은 방법입니다.

( 앞으로 다루게될 CNN같은 모델은 소요시간적 관점에서 반대입니다! )




이 방법을 적용한다면 이러한 모양이 나올 것입니다.

위의 사진을 보면 이 분류방식은 그리 적절하지 않음을 알 수 있습니다.

NN은 가장 가까운 이웃만을 보기때문에 녹색구역 가운데에 노란색구역이 생긴 것을 볼 수 있습니다.

이부분또한 노란색이 아니라 녹색이어야 테스트시 더 좋은 성능을 낼 수 있을 것입니다.

( 그 노란색은 아마 noise거나 spurious일 것이기 때문이죠 )


이러한 문제를 위해 K-NN 알고리즘이 탄생했습니다.

K-NN 알고리즘은 가까운 이웃을 K개만큼 찾아 자신의 lable을 예측하는 방식입니다.

거리별 가중치를 가지고 예측할수도 있지만, 가장 단순하면서도 잘 동작하는 방식은 각 이웃들의 lable의 갯수만을 고려하는 것입니다.

이 사진을 보면 K가 달라지면서 경계가 더 부드러워 지는 것을 볼 수 있습니다.

하지만 사이사이에 생기는 흰색 영역은 어떻게 처리할 수 있을까요?

흰색영역은 k-nn에서 결정할 수 없는 지역입니다.

따라서 어떤식으로든 추론을 해보거나, 임의로 정할 수도 있을 것입니다.


이번에도 비교함수를 어떤 것을 사용할지 결정해보아야 할 것입니다.

지금까지는 L1 distance를 이용했지만 L2 distance를 이용할 수도 있을 것입니다.


L2 distance는 Euclidean distance 입니다.


이 두가지 척도간에는 아주 흥미로운 차이점이 있습니다.

L1은 좌표 시스템에 따라 영향을 받습니다.

가령, 좌표시스템을 회전시키면 L1 distance도 변화합니다.

L2는 영향을 받지 않습니다.

따라서 예컨데 특징 벡터의 각 요소들이 개별적 의미를 가지고 있다면 ( e.g. 키, 몸무게 ) L1이 더 잘 맞을 수 있겠죠.

하지만 각 요소간의 실질적인 의미를 잘 모르는 경우에는 L2가 좋을 수 있을 것입니다.


K나 L1/L2 같은 것들 처럼 학습전에 미리 선택해야하는 변수들을 "하이퍼 파라미터"라고 부릅니다.

이런 값들은 어떤것이 가장 좋은 성능을 낼 지 모르기 때문에 각 값들을 모두 시행해 보면서 실험하며 가장 적절한 값을 찾는 경우 도 있습니다.


하지만 test를 할때 유의해야 할 점이 있습니다.


training set에서의 정확도를 최대화 하는 것이 아니라 training set에 없는 데이터에 대해 높은 정확도를 가지도록 해야한다는 것입니다.

따라서 K=1인 경우가 training set에서 정확도가 가장 높겠지만 그 특정 training set에만 정확한 분류기가 될 가능성이 높습니다.


그러면 가지고 있는 data set에서 일부를 training set으로 사용하고 일부를 test set으로 나눠서 사용하는건 어떨까요?

이 방법도 매우 위험합니다. 그 특정 test set에서만 잘 동작하는 분류기가 될 수 있기 때문입니다.


그래서 더 일반적으로는 데이터를 3개로 쪼개는 방식을 사용합니다.

train, validation , test 로 데이터셋을 분리합니다.

training set으로 학습하고 validation으로 검증하고 test로 test를 진행하는것이죠.

검증시 가장 좋았던 분류기로 test는 딱 한번만 진행하는 것입니다.


아래 보이는 사진은 Cross-Validation 방식입니다.

*이 방법은 데이터셋이 작은 경우에 많이 쓰입니다.



테스트셋을 제외한 데이터를 N개로 나누고 (여기서는 5개로 나누었습니다 )

4개의 fold에서 테스트를 하고 나머지 한개에서 validation을 진행하는 방식을 반복합니다.

각 하이퍼 파라미터에 대해서 이런식으로 테스트를 할 수 있을 것입니다.


하지만 이렇게 K-NN에 대해 열심히 배웠으나 이미지의 경우에서는 잘 사용하지 않습니다.


첫번째 문제점은, 앞서 말한대로 너무 느리다는 점입니다.


두번째 문제점은, L1/L2 Distance가 이미지간의 거리를 측정하기에 적절하지 않다는 점입니다.

아래의 사진에서 왼쪽의 한 여성이 있고 나머지 세개의 사진은 왜곡된 이미지입니다.


하지만 이들은 모두 같은 L2 Distance를 갖습니다. 즉, L2 Distance가 지각적 유사도를 측정하기에 적합하지 않다는 의미가 되겠죠

이미지들이 모두 같은 사람이므로 distance가 같으면 좋은것이 아닐까요?


이 예시에서는 그럴 수 있지만, 예컨데 다른 두개의 이미지가 있는데 어떤 적절한 위치에 박스를 놓거나 색을 더하거나 한 경우에 두 이미지가 다름에도 불구하고 Distance를 매우 근접하게 만들 수 있는 경우가 생길 수 있겠죠.


세번째 문제점은, 차원의 저주입니다. K-NN은 트레이닝 데이터를 이용하여 공간을 분할합니다.

그말은 즉, K-NN이 잘 동작하려면 전체 공간을 조밀하게 커버할 만큼 충분한 트레이닝 샘플이 필요하다는 말입니다. 하지만 차원이 증가하면서 필요한 데이터의 양은 기하급수적으로 증가합니다.

따라서 K-NN은 잘 쓰이지 않습니다.


다음은 Linear Classification입니다.

Linear Classification 은 NN과 CNN의 기반 알고리즘이며 "parametric model"의 가장 기본적인 모습입니다.

왼쪽의 고양이는 입력이미지 입니다.

입력이미지는 일반적으로 "X"로 사용합니다.

우리는 데이터 "X"와 parameter "W"를 가지고 10개의 숫자를 출력할 것입니다.

여기서 W는 가중치, "W"라고도 하고 theta(세타)라고도 합니다.

10개의 숫자는 학습을 위해 사용할 데이터인 CIFAR-10의 각 10개의 카테고리 스코어입니다.

여기서 스코어란, "고양이"의 스코어가 높다면 X가 고양이일 가능성이 높다는 뜻으로 해석될 것입니다.


우리는 어떤식으로 W와 데이터를 조합할지 여러가지 방법을 생각해 볼 수 있지만 가장 단순한 방법은 둘을 곱하는 것입니다. 

그리고 그것이 Linear Classificaion입니다.


이제 이들의 차원을 보겠습니다. 입력이미지는 32 * 32 * 3 입니다.

이 이미지를 길게 펴면 3072 벡터가 됩니다.

이제 이 3072벡터가 10개의 스코어로 되어야합니다.

따라서 행렬 W은 10*3072가 되어야 합니다.


그리고 가끔 b (Bias)를 보게 될 텐데 이것은 데이터와 무관하게 특정 클레스에 우선권을 부여합니다.

예를들어, 데이터 셋이 불균형한 경우 (고양이<개 인경우) 고양이의 바이어스가 더 커지게 됩니다.


이제 이 함수가 어떻게 동작하는지 보겠습니다.


*이 예제에서는 3가지 클레스로의 분류만 보도록 하겠습니다.

왼쪽의 2*2 고양이 이미지가 있습니다.


이미지를 4-dim 열벡터로 펼칩니다.

3개의 분류를 할 것이므로 가중치 W는 4*3행렬이 될 것이고, bias는 3-dim 열이 되겠죠

그러면 W와 4-dim 열벡터 (data)를 내적하고 , bias를 더해주면 각 분류에 맞는 스코어가 나오겠죠.

(내적은 클래스간 탬플릿의 유사도를 측정하는 것과 유사하다고 보면 좋습니다. )


Linear Classification은 고차원의 공간에서 NN처럼 일종의 "결정경계"를 학습한다고 볼 수 있습니다.

그 공간의 차원은 이미지의 픽셀 값에 해당되는 것입니다.


하지만 이미지가 고차원의 공간의 하나의 점이라는 관점에서 생각하면 Linear Classification이 직면할 수 있는 문제가 있습니다.

아래와 같은 케이스는 분류하기 매우 까다롭습니다.

하지만 Linear Classification은 매우 쉽게 이해하고 해석할 수 있는 알고리즘 입니다.

여기서는 W행렬을 어떻게 구하는 지에서는 아직 다루지 않았습니다.


다음 강의에서는 가중치 행렬 W를 구하는 방법과 다양한 알고리즘에 대해 다루겠습니다.

Comments