gumgood blog

컴퓨터 비전(computer vision)에서 가장 핵심적인 task인 이미지 분류(image classification)에 대해 소개한다.

이미지 분류(Image Classificaion)

이미지 분류란 입력 이미지를 받아 미리 정해놓은 카테고리(category)들 중에서 속하는 하나의 레이블(label)을 찾는 문제다. 문제의 정의는 간단하지만 매우 다양하게 응용된다. 이후 강의에서 살펴보겠지만, 서로 달라보이는 많은 컴퓨터 비전 분야의 task들(객체 탐지(object detection), 이미지 분할(image segmentation) 등)은 이미지 분류 문제로 귀결된다.

컴퓨터는 이미지를 하나의 큰 3차원 정수 배열로 나타낸다. 예를 들어 세 개의 색상 채널 RGB를 가지는 너비 $248$픽셀, 높이 $400$픽셀 크기의 고양이 이미지를 생각해보자. 이미지는 $248 \times 400 \times 3 = 297,600$개의 정수로 이뤄져있는 셈이다. 이때 각 정수의 범위는 $0$(검은색)부터 $255$(흰색)까지다. 결국 이미지 분류 문제는 이 수십만개의 수를 하나의 레이블인 “cat”으로 바꾸는 것이다.

어떤 이미지를 분류하는 함수를 작성한다고 생각해보자.

1
2
3
def classify_image(image):
  # Some magic here?
  return class_label

정렬 알고리즘처럼 잘 작성할 수 있으면 좋겠지만, 안타깝게도 고양이를 분류하는 명시적인 방법은 없다. 기존 연구에서 윤곽선을 기반으로 “귀는 세 개의 점이 만나는 모퉁이가 세 개고..”와 같이 규칙을 모두 직접 써서 인식하려는 접근이 있었지만 잘 동작하지 않거나 변형에 취약했다. 또한 다른 객체를 인식하려면 처음부터 수많은 규칙을 또 만들어 적어야하는 문제도 있다. 즉, 확장성이 없다.

데이터 기반 방법론(Data-driven approach)

앞서 말한 것과 같이 하드코딩으로 직접 분류하는 것이 아닌, 컴퓨터에게 각 카테고리에 대한 많은 예제를 주고 시각적인 모습(visual appearance)를 학습하는 학습 알고리즘(learning algorithm)을 개발하는 방법이 있다. 이를 데이터 기반 방법론(data-driven apporach)이라고 하는데, 다양한 객체에 유연하게 적용할 수 있는 확장성을 확보할 수 있다.

  1. 이미지와 레이블로 이뤄진 데이터셋을 수집한다.
  2. 머신러닝(machine learning) 알고리즘을 이용하여 분류기(classifier)를 학습시킨다.
  3. 새로운 이미지에 대해 분류기를 평가한다.

이제 API가 약간 변경해보자. 입력 이미지를 고양이로 이식하려면 두 개의 함수가 필요하다.

1
2
3
4
5
6
7
def train(images, labels):
  # Machine learning!
  return model

def predict(model, test_images):
  # Use model to predict labels
  return test_labes

이 방법이 지난 10~20년간 정말 잘 작동한 이 모든 것들을 시작할 수 있었던 핵심이다. 이 강의에서는 주로 신경망(Neural network), CNN, 딥러닝(Deep learning)을 주로 다루겠지만, 데이터 기반 방법론은 딥러닝 뿐만 아니라 아주 일반적인 개념이다. 보다 복잡한 알고리즘을 배우기 전에 간단한 분류기를 한번 살펴보도록 하자.