본문 바로가기
ML & DL/CS231n (Stanford Univ.)

[CS231n] Lecture 2 | Image Classification

by 남르미누 2020. 10. 14.

이미지(image)는 숫자로 이루어진 3D array로 구성되어 있다.

 

 

컴퓨터는 이미지를 픽셀 값 즉, 숫자로 생각한다.

이미지가 조금만 달라져도 모든 픽셀 값은 달라진다.

그렇기에 우리가 만드는 알고리즘은 이런 상황에 대해 강인해야한다.

(보는 시각의 달라짐, 조명, 형태의 변형, 은닉, 배경과 구분 안되는 상황, 클래스내의 구분 등등)


기본적인 image classifier는 이미지를 인자로 받아서 예측을 하는 것이다.

그 이미지가 어느 쪽에 속하는지 label를 반환하는 기본적인 함수를 말한다.

 

이미지를 구분할 때 직관적이고 명시적인 알고리즘(Hard Code)는 없다.

과거에는 이미지를 보고 특징점들을 찾아내고 edges와 corners를 계산하여 분류하려 했다.

하지만 위 접근방법에는 많은 한계가 존재하여 더이상 발전할 수 없었다.

 

그렇기에 아래와 같이 데이터에 기반한 접근방법

즉, 데이터 중심 접근방법(Data-Driven Approach)이 중요하다.

 

과거처럼 물체의 특징을 하나씩 규정하기보다는

이미지와 레이블로 구성된 데이터셋을 수집하고

이 데이터셋에 대해서 image classifier를 학습을 시킨다.

그리고 test image set들에 대해서 학습시킨 image classifier를 평가하는 것이다.

 

하나의 함수가 아닌 2개의 함수가 필요해졌다.

 

Train 함수 : 입력 - 이미지와 레이블, 출력 - 모델

Predict 함수 : 입력 - 모델과 test image, 출력 - test image label

 

지금부터 기초적인 classifier들에 대해 배워보도록 하자.


우리는 앞으로 CIFAR-10 데이터를 사용할 것이다.

 

test image를 모든 training image와 각각 비교한다.

비교하는 기준이 distance가 된다.

 

그 중에서도 L1 distance를 봐보도록 하겠다.

이미지1과 이미지2의 차이의 절댓값을 씌워준 형태를 띈다.

 

위 예시를 보면 각각의 원소들의 총합이 456이다.

두 이미지 사이는 456의 거리를 보임을 알 수 있다.


NN-classifier를 코드로 표현하면 다음과 같다.

 

 

Train 과정에서는 메모리상에 학습데이터를 기억한다.

Predict 과정에서는 각각의 test image에 대해

train image와 가장 가까운 즉, L1 distance가 가장 작은 image로 라벨링한다.

 

Q. train data의 크기에 따라서 분류 속도는 어떻게 되나요?

A. linearly하게 증가하게 된다.

train data 두 배 증가 -> 모델 성능 속도 두 배 느려짐

 

Q. training 속도와 testing 속도 중에 어느 것이 더 중요할까요?

A. test의 성능속도가 중요하다. 하지만 위의 NN분류기는 그렇지 못하다.

 

이후에 배울 CNN은 정반대가 된다.

train 시간이 매우 오래 걸리지만 test 시간은 굉장히 짧다.

어떤 크기의 training set 이더라도 testing 시간은 일정하다는 뜻이다.


L2 distance도 존재한다.

이를 Euclidean distance 라고도 한다.

L1을 사용할 것이냐 L2를 사용할 것이냐는 하나의 hyperparameter이다.

주어진 환경에서 여러 번의 실험을 통해서

최적의 parameter를 찾아야한다는 면에서 위와 같이 표현할 수 있다.


< KNN (K-Nearest Neighbor) >

 

k개의 가장 가까운 이미지들을 찾고

k개의 이미지들이 다수결로 voting을 하는 것이다.

즉, 가장 많이 나온 것으로 가장 유사한 이미지로 판단하는 것이다.

 

Q. 일반적으로는 test set에 있는 이미지를 NN classifier에 돌려서 정확도를 판단하는데,

이번에는 train set에 있는 데이터를 NN classifier에 돌려서 분류하게 되면 정확도는 얼마나 될까요?

 

A. 100% 입니다.

완전 동일한 이미지간에 비교이기 때문에 distance가 0이므로 100%가 된다.

 

Q. train set을 KNN에 적용하면 정확도는 어떻게 될까요?

 

A. 상황에 따라 다르다.

KNN에서 1위는 정확한 클래스를 예측할 것이지만,

2, 3, 4위 등 나머지 순위의 이미지들을 엉뚱하게 예측한다면

다수결로 인해서 결과가 바뀔 수도 있기에 상황에 따라 다르다.


그렇다면,

L1과 L2 중에 어떤 걸 사용해야할까?

그리고 KNN이라면 k 값으로 얼마를 사용해야 가장 적합할까?

 

이를 결정할 때

우리는 이러한 것들을 hyperparameter라고 알고 있는데

hyperparameter를 어떻게 설정해야할까?

 

이는 문제에 따라 다르게 된다.

주어진 환경에 따라서 각각의 파라미터를 실험해보고

그 중에 가장 잘 나온 파라미터로 설정하는 것이다.

 

단, test set으로 적용하여 성능을 측정하는 것은

마지막에 해보는 것이 중요하다.

 

대신에 우리는 여러 번의 실험을 해야하기 때문에

train data의 일부분을 Validation data를 마련하게된다.

(일반적으로 약 20%를 떼어낸다.)

train data가 적은 경우?

Cross-validation을 사용한다.

즉, 1,2,3,4번에서 train을 하고 5번에서 validation을 하는 것이다.

그리고나서 2,3,4,5번에서 train을 하고 1번에서 validation을 하는 것이다.

이런 식으로 5번을 반복하게 된다.

이러한 방법을 Cross-validation이라고 한다.


하지만

KNN은 현실에서는 절대 사용해선 안된다.

test time 성능이 매우 안좋고,

distance로 정확한 예측을 하기 힘들다.

거리 척도들은 이미지들 간의 '지각적 유사성'을 측정하는 척도로는 적절하지 않다.

 

기존의 사진과 조금씩 변경시킨 이미지를 L2를 통해 비교해봤을 때

모두 동일한 L2 distance를 가진다고 나오는데

이미지간의 유사도를 잘 포착해 내지 못하는 것을 확인할 수 있다.

 

KNN을 사용하지 않는 이유로

'차원의 저주'라는 것이 있다.

KNN이 잘 동작하려면 전체공간을 조밀하게 채울 만큼의 충분한 train set이 필요하다.

그렇지 않다면 두 data의 거리는 엄청 멀 수도 있고, 성능은 좋지 않을 것이다.

 

데이터의 양이 증가함에 따라 차원이 기하급수적으로 증가하게된다.

특히, 고차원의 이미지라면 더더욱 데이터를 모으는 일은 현실적으로 불가능하다.

 

 

다음은 간단한 요약이다.

 


< Linear Classification >

 

Linear Classification은 parameter 기반의 접근 방식을 취하고 있다.

(앞에서 배운 NN 방식은 parameter를 취하지 않았다.)

 

 

x는 input data이고, W는 parameter이다.

우리는 W(=weight, parameter)를 조절할 수 있다.

 

10개의 class score가 높을 수록 입력데이터가 목표데이터일 확률이 크다는 것을 의미한다.

 

이제 더이상 test를 할 때 train set을 사용하지 않고 그 요약된 정보가 담긴 W를 중요하게 사용한다.

가장 쉬운 조합은 W와 x를 곱하는 것이고, 이러한 방법을 Linear Classification이라고 한다.

 

input data는 (32x32x3)의 이미지이지만 내적하기 위해

벡터형태로 쭉 펼쳐주는 것을 확인할 수 있다.

그리하여 x는 (3072x1)의 shape을 갖게된다.

 

(10x3072) x (3072x1) + (10x1) = (10x1)

 

위와 같은 행렬식이 성립한다.

 

b는 bias로 데이터와 무관하게 특정 클래스에 '우선권'을 부여한다.

예를 들어, data set이 불균형한 상황을 보면 고양이 데이터가 강아지 데이터보다

훨씬 많은 상황인데 이 때 고양이 클래스에 상응하는 bias가 더 커지게 되는 것을 말한다.


여기서 1.1 3.2 -1.2 를 bias term이라고 볼 수 있다.

각 스코어는 입력이미지의 픽셀값들과 가중치 행렬을 내적한 값에 bias term을 더한 것이다.

 

가중치 행렬 W의 각 행은 각 이미지에 대한 '템플릿'으로 볼 수 있고,

그 행 벡터와 이미지의 열벡터 간의 내적을 계산한다.

여기서 내적을 하는 것은 클래스 간 템플릿의 유사도를 측정하는 것과 유사함을 알 수 있다.

bias는 각 클래스에 scailing offset을 더해주는 것이다.


 

Linear Classifier는 이미지를 학습한다.

각각의 W들의 행을 이미지화 하면서 어떤 과정을 거치는지 알 수 있고

각각의 클래스에 대한 템플릿 이미지를 나타내는 것이다.

 

한 클래스 내에 다양한 특징들이 존재할 수 있지만,

모든 것들을 평균화 시키기 때문에 다양한 모습들이 있더라도

각 카테고리를 인식하기 위한 템플릿은 단 하나밖에 없다.

 

위의 예제들 중 car를 보면

우리는 빨간색 얼룩진 것을 확인할 수 있다.

중간에 보이는 파란부분은 아마도 창문일 것이다.

하지만 이를 차로 보기는 굉장히 힘들다.

horse의 경우에는 오직 초록색 부분위에 갈색 형태가 있다는 것만으로 예측하였다.

하지만 위 사진의 경우 말의 머리가 2개인 것을 볼 수 있는데 이는 말이 아닐 것이다.

하지만 선형분류기는 최선을 다해 분류한 결과일 것이다.

 

Linear classifier가 클래스 당 하나의 템플릿밖에 허용하지 않으므로 이 방법이 최선이다.

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

클래스 당 하나의 템플릿만 학습할 수 있다는 것과 같은 제약조건이 없을 때 가능하다.

 

또 다른 관점은 이미지를 고차원 공간의 한 점으로 보는 것이다.

 

Linear classifier는 각 클래스를 구분시켜주는 선형 결정 경계를 그어주는 역할을 하게되는 것이다.

 

하지만 Linear classifier로 분류하기 힘든 case가 많다.

 

위와 같은 예들이 모두 풀기 힘든 예제들이다.

 

Linear classifier는 단순히 행렬과 벡터 곱의 형태라는 것을 알았고, 템플릿 매칭과 관련이 있고,

이 관점에서 해석해보면 각 카테고리에 대해 하나의 템플릿을 학습한다는 것을 배웠다.

그리고 W(=parameter)를 학습시키고 나면 새로운 학습 데이터에도 스코어를 매길 수 있다.

 

 

그렇다면 우리가 실제로 올바른 W를 선택하는 방법은 무엇일까?

 

다음 강의에서 알아보도록 하자 :)

 


(참고자료)

 

leechamin.tistory.com/search/cs231n

 

참신러닝(Fresh - Learning)

이차민의 iOS/ML/DL 공부 블로그 Computer Vision과 iOS개발에 대한 전반적인 공부를 합니다. "Be The First Penguin"

leechamin.tistory.com

lsjsj92.tistory.com/

 

꿈 많은 사람의 이야기

안녕하세요. 이수진이라고 합니다. 이 블로그는 AI(인공지능), Data Science(데이터 사이언스), Machine Learning, Deep Learning 등의 IT를 주제로 운영하고 있는 블로그입니다.

lsjsj92.tistory.com

taeyoung96.github.io/categories/CS231n/

 

CS231n Summary

한 발자국씩 앞으로 나아가자

taeyoung96.github.io

 

댓글