[CS231n] 2강

신동혁·2022년 12월 8일
0

CS231n

목록 보기
2/2

Image Classification

우리가 보는 이미지와 컴퓨터가 보는 이미지는 굉장히 다르다. 만약 고양이 사진을 본다면 우린 고양이 자체를 보지만, 컴퓨터는 고양이 이미지를 이루고 있는 여러개의 숫자들의 집합을 본다. 이런 이유로 컴퓨터 비전에서 우리가 해결해야 할 문제는 굉장히 많다.

  • Semantic Gap
    사람이 이미지에 붙인 의미를 가진 라벨, 예를 들어 고양이 이미지, 강아지 이미지, 풍경 이미지 같은 라벨들은 컴퓨터가 이미지를 볼 때 인식하는 여러개의 숫자들의 집합과 굉장한 차이가 있다.
    • Viewpoint variation
      카메라 각도가 살짝만 달라져도 컴퓨터는 알아보기 힘들게 된다.
    • Illumination
      빛의 세기가 살짝만 달라져도 컴퓨터는 알아보기 힘들게 된다.
    • Deformation
      자세가 살짝만 달라져도 컴퓨터는 알아보기 힘들게 된다.
    • Occlusion
      다른 사물에 가려져 있으면 컴퓨터는 알아보기 힘들게 된다
    • Background Clutter
      배경이랑 비슷할 때 컴퓨터는 알아보기 힘들게 된다.
    • Intraclass variation
      같은 고양이라도 종마다 조금씩 다르게 생겼다면 컴퓨터는 알아보기 힘들게 된다.

이런 문제점들을 모두 고려하여 이미지를 분류하는 코드를 작성한다? 이것은 불가능하다. 예를 들어 정말 복잡한 코드를 작성해서 고양이의 특징들을 잘 찾는 코드를 작성했다고 가정한다. 위에서 언급한 빛의 각도, 세기, 자세의 변화, 사물에 가려져 있는 정도 등에 큰 영향을 받지 않고 강인하게 이미지 내의 고양이를 찾을 수 있는 코드를 만드는 것 자체가 불가능에 가깝지만, 이런 코드를 만들었다고 할지라도 만약 강아지를 인식하려면? 자동차를 인식하려면? 해당 물체에 대한 코드도 각각 작성해야 한다. 세상에 있는 모든 물체에 대한 코드를 작성하는 것은 말이 되지 않는다.

Data-Driven Approach

위에서 언급한 문제를 해결하기 위한 방법이다. 간단하게 요약하자면 많은 양의 이미지와 해다 이미지에 대한 라벨을 컴퓨터에게 학습시키는 방법이다. 어떤 물체 이미지를 인식하기 위한 코드를 우리가 작성하는 것이 아니라 컴퓨터에게 많은 양의 데이터를 제시해줌으로 컴퓨터가 코드를 작성하게 하는 방식이라고 생각하면 쉽다. 해당 개념을 이용한 알고리즘들을 살펴본다.

  • Nearest Neighbor(NN)
    간단하게 모든 이미지 데이터와 라벨링 데이터를 외우고 새로운 이미지 데이터가 입력되었을 때 외워놓은 이미지 데이터 중 가장 비슷한 데이터와 같은 라벨링이라고 예측하는 방법이다. 해당 알고리즘은 학습 시에는 아무런 작업을 하지 않는다. 그냥 학습용 데이터를 가지고만 있는다. 하지만 예측 시에는 모든 데이터를 뒤져보며 가장 비슷한 데이터를 찾아야 한다. 그래서 N개의 학습용 데이터가 있다면 예측 시간은 빅오 표기법으로 O(N)이 걸린다. 이런 NN 알고리즘이 가장 비슷한 데이터를 찾는 원리를 살펴본다.
    • L1 distance(Manhattan distance)
      같은 자리에 있는 픽셀 값들의 차이를 구하고 이 차이값들을 모두 더하는 방식이다. 즉, 이 방식을 이용하면 이미지 자체가 비슷하게 생겨야 할 것이다. 만약 2개의 사슴 이미지가 존재하는데 첫번째 사슴 이미지는 사슴이 좌상단에 존재하고 두번째 사슴 이미지는 사슴이 우하단에 존재한다면 첫번째 이미지의 좌상단과 두번째 이미지의 좌상단은 굉장히 다를 것이고, 첫번째 이미지의 우하단과 두번째 이미지의 우하단도 굉장힐 다를 수 있다. 이 경우에는 두 이미지를 다른 이미지로 분류할 가능성이 커질 것이다.

NN은 학습 데이터를 그대로 학습함에 있어서 문제가 생긴다. 예를 들어 몸무게와 키에 대한 데이터가 있다고 할 때 키가 190인데 몸무게가 40인 데이터가 있다고 가정한다. 이것은 일반적인 데이터가 아니다. 하지만 해당 데이터로 인해 키가 190인 데이터를 예측할 때 몸무게를 40으로 예측할 가능성이 생긴다. 이런 잡음이나 이상치에 취약한 문제로 인해 수정된 알고리즘이 제시된다.

  • K-Nearest Neighbor(KNN)
    가장 가까운 데이터 하나만을 확인하는 것이 아니라 가까운 데이터 다수를 체크하고 더 많은 부류를 확인하는 방법이다. 예를 들어 위에서 제시한 예에서 키 190 데이터가 들어왔을 때 가장 가까운 데이터는 몸무게 40이었지만, 키 191, 192 등의 더 많은 주변 데이터를 찾아보면 더 신빙성있는 데이터를 알아낼 수 있을 것이다. KNN이 이런 원리다. 여기서 K는 주변을 설정하는 정도를 의미한는 변수다.
    • L1 distance(Manhattan distance)
      주변을 정사각형으로 설정해 확인하는 방법
    • L2 distance(Euclidean distance)
      주변을 원형으로 설정해 확인하는 방법

이런 KNN 알고리즘은 굉장히 단순하지만 여러 경우에 처음으로 적용해보기 좋은 알고리즘이다. 예를 들어 글에서 문단을 알기 위해서는 문장과 문장 사이의 간격 정도를 체크하면 될 것이다. 이 경우에 KNN을 사용한다면 문단과 문단 사이는 큰 간격 데이터, 문장과 문장 사이는 작은 간격 데이터로 구분되어 새로운 간격 데이터가 입력되었을 때 이 간격이 큰 부류에 속하는지 작은 부류에 속하는지 KNN알고리즘으로 분류해 문단과 문장을 분류할 수 있을 것이다.

Hyperparameter
하이퍼파라미터란 위에서 말한 KNN의 K와 비슷한 종류의 파라미터를 의미한다. 모델의 퍼포먼스를 결정하는 매개변수라고 생각하면 쉽다. 예를 들어 격투기 로봇의 하이퍼파라미터를 가정해 본다면 팔 길이, 파워, 속도 등을 예로 들 수 있을 것이다. 이런 하이퍼파라미터를 설정할 때 내가 가진 데이터를 학습할 때 좋은 성능이 나오도록만 설정하는 것은 좋지 않다. 왜냐하면 과적합으로 인해 새로운 데이터가 입력되었을 때 오히려 새로운 데이터에는 성능이 좋지 못할 가능성이 높기 때문이다. 머신러닝의 목표는 가지고 있는 데이터를 얼마나 잘 추측하느냐가 아니다. 가지고 있는 데이터를 활용해서 새로운 데이터가 입력되었을 때 새로운 데이터에 대한 예측을 얼마나 잘하느냐가 관건이다. 그래서 우린 가지고 있는 데이터를 3부류로 나누어 학습하고 검증하고 테스트하는 과정을 거치는 것을 가장 좋은 방법이라고 여긴다. 일반적으로 전체 데이터를 train, validation, test 3가지로 분류해놓고 학습하고 검증하며 테스트하지만, 더 발전된 방법들도 존재한다.

  • Cross-Validation
    fold라는 단위로 전체 데이터를 나눈다. validation할 부분을 여러 fold로 할 수 있도록 설정해 validation fold가 계속 바뀌게 설정한 방법이다.

KNN 알고리즘은 이미지 분야에 실제로 쓰이지 않는다. 너무 느리고 약간의 변화만 줘도 같은 이미지로 분류를 잘 하지 못하는 것이 이유다.

  • Linear Classification
    이미지를 1차원 데이터로 만들고 이 숫자들마다 가중치를 부여하고 각 픽셀과 픽셀마다의 가중치를 곱한 값들을 더한다. 이 최종값이 어떤 이미지로 분류될지 구분하는 것이 linear classification 알고리즘이다.
profile
개발취준생

0개의 댓글