영주머니의 개발주머니

[cs231n 강의 정리] Image Classification, KNN 본문

cs231n

[cs231n 강의 정리] Image Classification, KNN

영주머니 2023. 7. 7. 07:24

Image Classification

Image classification은 어떤 input image가 주어졌을 때 그 이미지가 어떤 카테고리에 속하는지 분류하는 문제이다. 예를 들어 고양이 사진이 주어지면 해당 사진을 "고양이"로 분류하는 문제이다. 사람은 고양이 사진을 봤을 때 직관적으로 "고양이"라고 인지할 수 있지만, 컴퓨터는 고양이 사진의 각 픽셀을 하나의 RGB값으로 인식하고 사진을 각 픽셀의 RGB값을 가진 거대한 행렬로 인식한다. 사람과 컴퓨터간의 이미지를 인식하는 방식의 차이를 "Semantic Gap(의미적 차이)"이라고 부른다.

이렇게 숫자로 이루어진 행렬에서 "고양이"라는 의미를 얻어내기는 어렵다. 사진에 조금의 변화라도 주면 행렬 전체의 값이 변화하고 여러 형태와 배경에 놓인 고양이를 인식해야 한다는 점은 컴퓨터의 사진 인식을 더 어렵게 만든다. 예를 들어, 다음과 같은 경우가 있을 수 있다.

 - Viewpoint variation: 카메라의 각도가 바뀌는 경우

 - Illumination: 빛의 세기가 다른 경우

 - Deformation: 고양이의 자세가 달라지는 경우

 - Occlusion(폐색): 고양이가 다른 사물에 가려져서 일부만 보이는 경우 (ex. 이불 속에 들어가서 얼굴만 보이는 경우)

 - Background Clutter: 고양이와 배경의 색이 비슷한 경우

 - Intraclass variation(Class 내부의 분산): 고양이가 다양한 모양, 크기, 색을 가짐

Image Classifier Model 구현

이미지 분류를 위한 코드는 어떻게 짜면 좋을까? 이미지를 분류하는 hard-code 알고리즘은 존재하지 않는다. 즉, 어떤 랜덤한 이미지가 주어졌을 때, 그 이미지의 label을 반환해주는 고정된 알고리즘은 존재하지 않는다.

Hard-code 알고리즘을 만들려는 시도가 존재하긴 했다. 예를 들어, 고양이 이미지를 edge와 corner를 찾아서 고양이의 형태를 명시적으로 표현하는 것이다. 그러나 이러한 방식은 이미지의 변화에 민감하고 만약 고양이가 아닌 다른 이미지를 분류하기 위해서는 처음부터 다시 알고리즘을 짜야하기 때문에 잘 사용되지 않는다.

 

고정된 알고리즘이 없다면 이미지 분류는 어떻게 구현해야할까? 많은 데이터를 이용하여 classifier model을 학습시킨 뒤 그 모델을 이용하여 새로운 이미지가 어떻게 분류되어 하는지 예측하는 Data-Driven Approach를 사용할 수 있다.

Classifer 예시 - Nearest Neighbor

Classifier model은 다양한 방식으로 학습시킬 수 있다. 하나의 간단한 Classifier 예시로 Nearest Neighbor가 있다. Nearest Neighbor는 training 과정에서 모든 학습 데이터와 label을 기억하고, prediction 단계에서는 기억한 데이터 중 새로운 이미지와 가장 비슷한 데이터의 label을 새로운 이미지의 label로 예측한다. 아래의 예시에서 빨간색 별과 초록색 세모가 training 과정에서 기억한 학습 데이터를 label과 함께 나타낸 것이고, "?"는 분류해야 하는 새로운 이미지이다. 기억한 데이터 중 "?"와 가장 비슷한(가까운) 데이터는 빨간색 별이므로 "?"의 label는 빨간색 별로 예측된다.

그런데 여기서 새로운 이미지가 어떤 데이터와 얼마나 "비슷"한지를 어떻게 정량적으로 측정할 수 있을까? 이를 위해 Distance Metric을 사용할 수 있다. 위의 예시에서는 단순히 가까운 것이 비슷하다고 표현했지만 사용하는 Distance Metric에 따라 두 데이터의 비슷한 정도가 달라질 수 있다. 대표적인 Distance Metric에는 L1 distance와 L2 distance가 있다. 상황에 따라 적합한 Metric을 골라 사용해야 한다.

K-Nearest Neighbors

Nearest Neighbors에서는 가장 가까운 하나의 데이터만을 찾는다. 그러다보니 여러 문제점이 발생한다. 예를 들어, 아래 그림의 왼쪽 K = 1인 경우를 보면 초록색 점들 사이에 노란색 점 하나가 존재한다. Nearest Neighbor는 가장 가까운 하나의 점만을 찾아서 label을 복사하기 때문에 초록색 영역 사이에 노란색 영역이 생기게 된다. 그러나 직관적으로 해당 영역은 초록색으로 예측되는 것이 더 적합하다. 이를 해결하기 위해 K-Nearest Neighbors가 등장한다. K-Nearest Neighbors에서는 새로운 데이터와 가장 가까운 K개의 점을 찾아서 그 중 다수에 해당하는 Class로 새로운 데이터를 분류한다.

 

아래 사이트에서 K-Nearest Neighbors를 시뮬레이션을 해볼 수 있다.

 

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

 

vision.stanford.edu

 

그러나 K-Nearest Neighbor는 이미지 분류에 사용하기에 적합하지 않다.

우선, 예측을 하는데 시간이 오래 걸린다. 새로운 이미지를 분류하기 위해서는 기억하고 있는 모든 학습 데이터와 새로운 이미지를 하나씩 비교하여 가장 비슷한 이미지를 찾아야하기 때문에 시간복잡도는 O(N)이다. 일반적으로 training이 오래 걸리는 것은 상관 없지만 prediction에 걸리는 시간은 짧아야 한다.

또한, 이미지에 Distance Metric을 적용하는 것이 큰 의미를 가지지 않는다. 아래의 오른쪽 3개의 이미지는 왼쪽의 원본 이미지와 모두 같은 L2 distance를 가지고 있다. 눈과 입이 Boxed된 이미지와 왼쪽으로 살짝 Shifted된 이미지가 원본 이미지와 같은 distance를 가진다. 이는 L2 distance가 이미지 간의 유사성을 잘 나타내지 못하고 있다는 것을 보여준다.

 

Comments