210104 Michigan Online | Lec.02 - Image Classification

shoulmon·2021년 1월 8일
1

Computer Vision

목록 보기
1/2

Image classfication(이미지 분류)란?

이미지를 알고리즘에 입력하면, 사전에 정해진 여러 카테고리 중 하나의 라벨로 입력 이미지를 분류하는 것이다.

Semantic gap

고양이 사진을 예로 들어보자.

사람은 고양이 사진을 볼 때 신경계에서 일어나는 여러 복잡한 처리 과정을 의식적으로 수행하고 인식하지 않는다.

직관적으로 고양이임을 알 뿐이다.

하지만 컴퓨터는 '직관성'을 갖지 못할 뿐더러, 컴퓨터가 인식하는 이미지는 단지 많은 숫자로 구성된 그리드 형태다.

게다가 사람은 고양이가 갖는 특징을 기억하고 다른 각도의 사진을 보더라도 이것이 고양이 임을 인식하지만, 컴퓨터가 이미지를 볼 땐 각도가 조금만 바뀌어도 그리드를 구성하는 숫자 구성이 "비직관적으로" 변한다.

이렇게 현실과 컴퓨터에서 고양이 이미지가 표현되는 방법이 다르기 때문에 발생하는 의미적인 차이를 semantic gap이라고 한다.

즉, 컴퓨터에서 사진을 표현할 때 사용하는 그리드 형태의 숫자 데이터에서 "고양이"라는 의미를 뽑아내기 위한 별도의 장치가 필요하고, 이 장치가 이미지 분류기인 것이다.

그렇다면, 아무렇게나 만들면 돼?

물론 안된다.

특히 이미지 분류기가 이겨내야 할 몇 가지 조건들이 있다.

1. viewpoint variation

앞서 말했듯, 고양이를 다른 각도에서 보더라도 동일한 대상으로 인식해야 한다.

2. intraclass variation

같은 고양이여도 서로 색, 무늬, 다리 길이 등 많은 것이 다르며, 이런 차이는 서로 다른 수의 그리드로 표현된다.

우리의 알고리즘은, 같은 카테고리 내에서의 수많은 "변이"에 대해 취약하지 않아야 한다.

3. fine-grained categories

"고양이"와 같이 포괄적인 카테고리가 아니고, 메인쿤, 랙돌, 아메리칸 숏 헤어 등 더 세분화된 카테고리들은 시각적으로 매우 유사한 특징을 갖는다.

우리의 알고리즘은, 이런 유사한 이미지들이 서로 다른 카테고리라면 분류해낼 수 있어야 한다.

4. Background clutter

때로, 이미지 내의 고양이가 흰 색이고, 배경이 눈밭일 때가 있다.

또는 고양이가 주변 환경과 유사한 보호색을 띄고 있다고 가정해보자.

이 때는 배경과 고양이를 구분하기 어려울 것이다.

그럼에도 우리의 알고리즘은 분류해낼 수 있어야 한다.

5. illumination changes

알고리즘은 빛 조건에 취약하지 않아야 한다.

즉, 이미지를 밝은 환경에서 찍든, 그렇지 않든 이미지의 의미는 "고양이"여야 한다.

6. deformation

고양이는 액체다.

따라서 고양이를 담는 그릇에 따라 고양이의 형태가 변한다.

이 때는 알고리즘이 고양이를 고양이로 인식하기 어렵다.

그럼에도 우리의 알고리즘은 고양이에게 속으면 안된다.

7. occlusion

고양이가 자기가 펀치를 날린 강아지가 쫓아와 몸을 숨기고 은폐하고 있는 상황을 찍은 사진을 생각해보자.

이 때 만약 고양이의 꼬리가 밖으로 나와있다면, 우리의 알고리즘은 꼬리만 보고도 고양이임을 알 수 있어야 한다.

이미지 분류의 유용함

이미지 분류는 그 자체로도 매우 유용하다.

예를 들면, 피부 사진을 보고 피부 질환을 분류해내거나, 우주 사진을 보고 어떤 현상이 일어나는지 분류하는 등의 작업을 쉽게 수행할 수 있다.

하지만 중요한 점은, 이에 그치지 않는다는 것이다.

즉, 이미지 분류는 컴퓨터 비전에서 수행하고자 하는 다른 알고리즘의 기초가 될 수 있다.

몇 가지 예를 들어보자.

1. Object detection

Object detection은 이미지 내의 여러 객체를 사각형으로 둘러 표시해, 그 객체가 무엇인지 뿐만 아니라 어디에 있는지도 표현한다.

Object detection을 구현하는 방법 중 하나로, 이미지 분류가 사용될 수 있다.

예를 들어, 하늘과 지평선이 맞닿는 배경에 사람이 말을 타고 있는 이미지가 있다고 가정할 때, 이미지 내의 ‘부분’인 배경, 말, 사람 등에 대해 분류하는 식으로 말이다.

2. Image captioning

Image captioning은 이미지가 주어지면, 그 이미지에 대해 설명하기 위한 설명을 출력하는 것이다.

설명을 위해선 이미지 분류를 통해 객체와 행위 등을 분류해내야 한다.

3. Playing go

바둑 같은 게임을 하는 인공지능 시스템에도 이미지 분류가 적용될 수 있다.

현재 바둑판의 상태를 이미지로 입력받아, 해당 바둑판에서 다음 수를 어디에 둘 지를 출력하는 식으로 말이다.

이미지 분류가 뭔진 알겠는데, 왜 인공지능이 필요할까?

앞에서 말한 이미지 분류기가 갖춰야 할 조건을 다시 보자.

어떤 조건에도 올바른 출력값을 내는 알고리즘을 일반적인 프로그래밍 방식으로 구현하는 것은 매우 어렵다.

예를 들어 보자면, 다음과 같은 기능들을 직접 구현해야 한다.

이미지 내의 고양이의 ‘테두리’를 인식하는 알고리즘을 통해 테두리를 얻는다.

이후 고양이의 귀는 각도가 어느 정도이며, 어느 위치에 수염이 있고… 등

심지어 이걸 '하나하나 직접 작성’해야 한다.

운 좋게 올바르게 동작하는 알고리즘을 구현했다고 해도, 다른 형태의 고양이 이미지에 대해선 매우 “취약한” 알고리즘일 것이다.

배경과 색이 유사해 고양이의 테두리를 추출하지 못할 수도 있고, 고양이의 귀가 접혀 있을 수도 있다.

이런 이유로 “머신 러닝”이 등장했다.

머신 러닝은, 사람이 가진 고양이에 대한 지식을 명시적으로 코딩하는 대신, 데이터를 중심으로 이미지에 접근하는 방식이다.

학습 데이터를 통해 여러 타입의 객체를 인식하는 방법을 배우는 것이라고 할 수 있다.

머신 러닝 방식으로 이미지 분류기를 어떻게 만들까?

기존의 프로그래밍에도 특정 문제를 풀기 위한 알고리즘이나 디자인 패턴이 있다.

인공지능도 마찬가지로 이미 개발된 여러 알고리즘(모델)이 있다.

그 중 처음으로 배울 것은, Nearest Neighbor 알고리즘이다.

영상 속 교수님 말로는 학습 알고리즘이라는 이름을 붙이지 않아도 될 만큼 간단하다고 하니 간단하게 알아보자.

우선, 머신 러닝 알고리즘은 Train과 Predict 두 부분으로 나뉜다.

Nearest neighbor의 train 알고리즘은 매우 간단한다. 단순히 모든 데이터와 라벨을 기억하는 방식이다. 특별한 처리가 필요하지 않다.

predict 알고리즘은, 새로운 이미지를 입력 받아, 기억한 이미지 데이터들과 비교해 가장 유사한 데이터를 찾아 그 데이터의 라벨을 출력한다.

Nearest neighbor 알고리즘을 구현하기 위해선 ‘비교’를 위한 함수가 필요 하며, 이때 사용하는 방식은 Distance Metric이다. 

이는 크기가 동일한 이미지들을 입력으로 받고, 두 이미지가 ‘얼마나 유사한지’ 출력하는 방식이다.

구체적인 방법으로 가장 많이 쓰이는 방식은 L1(또는 Manhattan) distance이며,  두 이미지의 각 픽셀 값 사이의 차이의 절대값을 구한 후 이들의 합을 구하는 방식이다.

단, 모든 학습 이미지 데이터와 새로 입력된 이미지 데이터를 비교해 출력하는 방식은 시간 복잡도가 O(n)이다. (학습 데이터의 개수가 n개일 때)

이는 매우 비효율적인 방식이다.

학습은 모델의 크기와 유용성에 따라 오래 걸릴 수도 있지만, 해당 모델을 실제로 사용하거나 테스트할 때는 이보다 훨씬 빠른 응답 속도를 보여야 한다.

이를 해결하기 위한 많은 fast / approximate nearest neighbors 알고리즘들이 있다고 하니 알아보자.

Nearest neighbors 알고리즘의 예제로 Decision Boundaries 문제가 있다.

점들이 학습 데이터 셋이고, 영역의 색은 학습 데이터에 대한 라벨이다.

즉, 학습데이터가 무엇인지에 따라 주변 영역의 색이 정해진다.

이 때, 동그라미 친 부분들은 noise로 볼 수 있다. 예를 들어 노란 점 하나 때문에 그 주변의 영역이 노란색이 된다. 이는 좋은 상황일 수도 있고 그렇지 않을 수도 있지만 어쨌든 noise다.

이 noise를 제거하는 방법이 없을까?

이를 해결하기 위한 방법으로, K-nearest neighbor 알고리즘이 있다.

k-nearest neighbor 알고리즘은 가장 유사한 하나의 라벨을 출력하는 것이 아니라, 유사한 k개의 라벨을 조합해 결과를 출력한다.(가장 많은 라벨값 또는 평균값 등)

KNN으로 noise를 제거하고 각 영역의 경계를 부드럽게 만드는 것은 가능했지만, K가 1보다 큰 경우, 유사한 k개의 학습 데이터 라벨을 조합하는 과정 중에, 동점이 있을 수 있다.

이런 경우엔 흰 영역이 생긴다. 따라서 k-nearest neighbors 알고리즘은 동점 상황을 해결하기 위한 알고리즘이 필요하다고 한다.

L1 distance 방식 외에 다른 방식도 알아보자.

L2(Euclidean) distance 방식을 알아볼 것이다.

L1과 유사하게 픽셀 간의 차이를 계산하는데, L2 방식은 Euclidean distance를 계산한다. 이는 두 점 사이의 거리를 구하는 방식으로, 피타고라스 정리를 이용하는 방식이다.

L1 distance 방식을 사용하면 영역이 x축, y축 또는 y = x 등에 평행한 직선들로 구분되는데, L2 방식도 여전히 직선적으로 구분되지만, x축, y축, y = x 이외에 좀 더 다양한 직선과 평행한 직선들로 구성된다.

참고할 점은, nearest neighbor의 한계를 해결하기 위한 kNN도 현업에서는 많이 사용되지 않는다는 것이다.

그 이유는 다음과 같다.

1. 학습에 필요한 시간은 매우 짧지만, 평가에 필요한 시간이 매우 길다.

nearest neighbor와 kNN은 학습 데이터를 그대로 저장한다.

이후 평가를 위해 새로운 이미지를 전달하면, 저장한 모든 학습 데이터 하나하나와 유사성을 측정해 가장 유사한 데이터의 라벨을 출력한다.

위에서도 말했듯, 학습 데이터에 대한 레퍼런스를 그대로 저장하므로 학습에 필요한 시간은 O(1)이지만, 데이터가 n개 있을 때 평가에 필요한 시간은 O(n)이다.

2. 픽셀 값 간의 차이를 활용하는 방식은 두 이미지 간의 "의미있는" 유사성을 측정하는 방식이 아니다.

다음 사진을 보자.

오른쪽 세 이미지를 맨 왼쪽 이미지와 L2 distance로 유사성을 측정했을 때, 모두 같은 정도의 유사성을 보인다.

우리가 볼 땐 Shifted 이미지가 가장 유사하지만, “전체” 픽셀 값의 차이에 따라 계산하는 방식이므로 결과가 같으면 모두 유사한 이미지로 판단하는 것이다.

즉, L1 또는 L2 방식으로 유사성을 측정하는 것을 "의미있다"고 할 수 없다.

그렇다면, K-nearest neighbors(KNN) 알고리즘의 K값과, distance metric은 어떤 것을 사용하는게 가장 좋을까?

이들은 학습 데이터로부터 학습할 수 없는 값으로, hyperparameter라 한다.

이들은 학습 과정의 시작부터 직접 설정해줘야 하며 최적의 값을 찾기 위한 방법은 그다지 알려지지 않았다.

현재로선, 직접 여러 값들을 적용해 보고 최선의 값을 찾아야 한다.

값을 찾기 위한 방법으로 다음을 생각해볼 수 있다.

1. 학습 데이터에 대해 가장 잘 동작하는, 예측 정확성이 가장 높은 hyperparameter 값을 설정한다.

이는 최악의 선택이다.

결국 우리의 모델이 잘 동작하는지를 평가하는 것은 학습 데이터가 아니라 테스트 데이터다.

학습 데이터에 너무 잘 맞춰진 모델은 overfitting이 발생할 수 있다.

2. 데이터를 학습 데이터와 테스트 데이터로 나누어 테스트 데이터에 대해 예측 정확성이 가장 높은 값으로 설정한다.

이 또한 좋은 선택은 아니다.

테스트 데이터 이외의 또 다른 새로운 데이터에 대해선 알고리즘이 어떻게 동작하는 지 알 수 없기 때문이다.

즉, 모델은 테스트 수행 전에 테스트 데이터에 대해 알지 못해야 하며, 테스트 데이터는 테스트 수행 시, 그 한 번만 사용되어야 한다.

3. 데이터를 학습, 검증, 테스트 데이터로 나누어 학습데이터로 학습하고, 검증 데이터로 적절한 hyperparameters의 값을 설정하고 테스트 데이터로 테스트를 한다.

올바른 방법이다.

테스트 데이터는 딱 한 번만 모델을 테스트하는 용도로 쓰여야 하기 때문이다.

4. Cross-validation

데이터를 여러 folds와 하나의 test 데이터로 나누고, 학습 – 검증 과정을 여러 번 수행하며 각 fold를 각 과정마다 검증 데이터로 사용한다.

이후, 각 단계 별 최선의 hyperparameters 설정 값의 평균 또는 최선의 값을 사용한다.

이 때도 물론 test 데이터는 모델을 테스트하는 딱 한번의 용도로만 사용해야 한다.

이론 상 가장 올바른 방법이지만, 학습은 비용이 많이 들기 때문에 현업에서 많이 사용되는 방법이 아니다. 
단, 데이터 셋이 작을 땐 유용

Universal Approximation

학습 데이터셋이 충분히 많다고 가정할 때, 알고리즘이 어떠한 형태의 함수든, 그 함수를 표현할 수 있다는 것을 의미한다.

즉, 학습 데이터가 충분할 수록 모델이 올바른 값을 낸다는 뜻이다.

Curse of dimensionality


차원이 높을수록 동일한 밀도로 공간을 채우기 위해선, 학습 데이터 셋이 지수승으로 필요하다는 것이다.

쉽게 말해, 입력 데이터의 차원이 높아질수록 학습 데이터가 미친듯이 많이 필요하다는 뜻이다.


이미지 출처
https://pixabay.com/ko/photos/%EA%B3%A0%EC%96%91%EC%9D%B4-mieze-2306185
관련 유튜브 링크
Michigan Online / Lecture 3: Image Classification

profile
공부하고 정리하는 블로그입니다.

0개의 댓글