본문 바로가기
코딩 독학/CS231n

[CS231n] 2강. Image classification

by 효니루 2020. 10. 16.

이번 강의에서는 컴퓨터가 사진에서 단순한 픽셀값의 나열만을 보고 어떻게 사진을 인식하는지에 대해 다뤄볼거다.

 

먼저 컴퓨터가 이미지를 인식할 때는 각 픽셀값을 벡터로 쫙펼쳐서 받아들이게 된다.

하지만 단순히 모든 픽셀값을 비교하게 된다면, 사진의 구도나 빛, 카메라위치가 조금만 변해도

모든 픽셀값은 변하게 되어 사진을 전혀 구별할 수 없다. 

이렇게 컴퓨터가 받는 정보인 픽셀값과 실제 이미지의 해석에 차이가 나게 되는 것을 "Semantic gap" 이라고 한다.

 

처음에 이를 해결하기 위해 시도한 방법은 point를 잡기 쉬운 모서리와 경계선 부위를 따라서, 특징적인 부위에서 값이 어떻게 변하는지를 규칙화시켜 이미지를 구분하는 방식이었다.

고양이라면 귀가 있을테니 둥근얼굴에서 뾰족하게 귀가 나오는 식으로 픽셀값이 변하면 고양이겠지? 이런식..

근데 이런 방식은 모든 물체마다 각각 다른 알고리즘을 새로 개발해야 한다.

 

따라서 나온 것이 Data-driven approach 이다.

다수의 데이터를 모아 카테고리화시키고, 그 데이터셋 자체를 설명가능한 알고리즘을 훈련시키는 것이다.

이러한 접근방식의 종류에 대해서 살펴보자.

 


Data-driven approach

1. Nearest neighbor

1) train data와 label(데이터의 분류) 세트를 모두 학습시킨 알고리즘을 준비한다.

2) 이 알고리즘은 새로운 test data에 대하여 기존에 학습된 train data 중 가장 비슷한 사진을 찾아 분류하게 된다.

 

분류방식) 

 

 

test image와 train image는 각각 같은 사이즈를 갖고, 같은위치의 픽셀값 차이를 구해 단순히 합하게 된다. 이 값이 가장 적은 사진이 비슷한 사진으로 골라지는 것이다.

 

 

 

한계점) 윗줄 오른쪽 사진은 CIFAR10 이라는 데이터셋이었다. 5만개의 학습데이터와 1만개의 검증데이터, 그리고 10개의 분류(class)로 이루어져 있는데, 검증데이터가 알고리즘에 의해 분류된 것을 보면, 학습데이터들 중 가장 비슷한 10개의 사진을 골라놨는데, 겉으로 봤을 때만 비슷한 사진이지 사실 class분류에는 오류가 많다.  단순히 픽셀값을 비교하는 것으로는 붉은벽돌이랑 붉은지갑이랑 같은 물체로 구분할 수 있는 오류가 있다.

 

2. K-Nearest Neighbor

K-NN 방식은 기존 NN방식에서 조금 더 정교해졌다. 

같은 class의 데이터는 데이터값들이 비슷할 것이다. 따라서 대부분 구역을 나눠본다면 비슷하게 나눠지겠지만, 가장 왼쪽 사진을 봤을 때, 종종 혼자 튀는 곳에 있는 데이터들이 있을 것이다.

이렇게 혼자튀는 데이터들까지 100% 완벽하게 학습시킨 알고리즘은 오히려 검증데이터셋을 잘못 분류하는 오류를 낳게 된다.

K-NN방식은 test data와 train data 사이의 거리 (NN방식에서의 픽셀차이값과 같은것) 가 가장 짧은 K개의 train data들을 고르고, 그 중 가장 다수의 class로 결정되는 모델이다.

K가 커질수록 위의 그림처럼 분류할 때 혼자 튀는 데이터들은 무시해서 train data에서 소수의 오류를 감안하고, test data에서의 성능을 높이게 된다.

 

**data간의 거리를 구하는 방식

data 간의 거리란 두 data의 유사성을 나타내는 것이다.

L1 (맨하탄거리) 와 L2 (유클리디안 거리)

hleecaster.com/ml-distance-formula/

여기 설명 잘 돼있음!

쉽게보자면, L2는 실제 다차원에서의 두점간의 거리를 구하는 공식이고, L1은 다차원에서 단순히 두 점의 좌표들간의 차이의 절댓값을 모두 더한 것으로 L2보다 조금 덜 정확하지만 그래도 데이터거리간의 대소비교는 가능하다.

 

쨌튼! K와 거리공식을 쓸지는 알고리즘마다 다 달라서 여러 시도 끝에 정해지는 hyperparameter이다.

 

**K-NN에서 hyperparameter 설정

그렇다면 어떤 식으로 K값을 설정할지에 대해 간략히 알아보자.

#1. train data에서 젤 잘 작동하는 hyperparameter로 결정하는 방식 (K=1이고 검증시에도 학습데이터를 사용)

   :  K=1의 경우 학습데이터자체는 완벽히 분류하게 되지만, 새로운 데이터로 test해보면 튀는 데이터로 인한 복잡한 분류로 인해 오히려 성능이 떨어지게 된다. 

#2. train & test data로 나누고, test data에서 최적인 hyperparameter로 결정하는 방식

   : 이 역시 새로운 데이터를 만나면 성능이 떨어질 수 있다.

#3. 가진 데이터를 train, val, test 세개로 나누는 경우

   : train data로 알고리즘을 학습하고 validation set으로 최적 hyperparameter를 찾고, test data를 마지막으로 실제 성능을 unseen data에서 확인해본다.

#4. Cross-validation (교차검증)

   : validation set를 따로 설정하는 것이 의미가 없을정도로 데이터가 부족한 경우, train set를 K개의 fold로 나누어 돌아가면서 validation set 역할을 한다. 이를 K-교차검증이라고 한다.

 


위 두가지 방식이 이미지 부류에 쓰이지 않는 이유

하지만 위의 Nearest Neighbor와 K-Nearest Neighbor는 이미지데이터분류에 사용하지 않는다.

1. Nearest Neighbor를 이미지 데이터에 쓰지 않는 이유 

- Test dataset을 분류할 때 각 data마다 모든 train data와 비교하기 때문에 시간이 오래 걸린다.

- 이미지 데이터에서 distance 를 구하는 것은 매우 오류가 많다.

이를테면, 왼쪽의 4개 사진은 모두 다른 사진이지만, distance 관점에서는 같은 사진으로 분류되기도 한다.

 

 

 

2. K-Nearest Neighbor를 이미지 데이터에 쓰지 않는 이유

 

K-NN은 train data가 분포된 지역을 구분하여 class를 분류하는 방식인데, 이것은 train data가 많아야 dense하게 분포가능하고 그에 따라 정교하게 분류가 가능하다. 

하지만, 데이터의 차원이 커질수록 비는 곳 없이 데이터를 채우려면 필요한 data수가 기하급수적으로 늘어난다는 단점이 있다.

 


Linear Classifier

따라서 이미지데이터를 분류할 때 Neural Network를 사용하게 된다. 

그림과 같이 여러 층을 쌓고, 각 층은 Linear classifier에 의해서 분류과정이 일어나게 된다.

총개수 가로픽셀수x세로픽셀수x채널수(컬러면 RGB로 3, 흑백은 1)로 이루어진 데이터들을 행렬계산을 위해 벡터로 쫙 펼치고, 각 클래스를 대변할 수 있는 parameter인 W(가중치, weights)와 b 설정하여 결괏값을 구해 가장 score가 높은 class로 분류하게 된다. 여기서 사용되는 함수 f(x, W)가 직선의 방정식이라서 linear classifier라고 부른다.

 

 

결국 사진들은 좌표평면에서 각 parameter (W, b)에 따른 서로다른 직선을 그어서 이미지들을 구분하게 된다.

 

 

 

 

하지만 왼쪽의 2, 3번째 그림과 같이 데이터의 분포가 직선만으로는 절대로 나뉠 수 없는 경우가 있다. 이를 해결하기 위해 여러층의 신경망을 쌓게 되는 것이다.

 

 

이것은 다음 강의에서!!

 

 

지금보니 앤드류응 교수님 강의랑 같은 개념을 강의하는 거였당 ㅎㅎ

어렴풋이는 이해가 가는데 역시 글로 풀어쓰자니 모호해지는 부분도 있고 ㅠㅠ

나중에 아! 하고 이해하는 부분도 있고 그렇다~

 

 

www.youtube.com/watch?v=OoUX-nOEjG0&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=2

댓글