Computer Vision 분야에는 많은 Task들이 있는데, Classification, Detection, Identification, Semantic Segmentation, Object Categorization, Scene Categorization, Event Recognition 등이 있다.
이들의 백본은 모두 Classification으로부터 온 것이므로 Classification이 아주 중요한 문제라고 할 수 있다.
Object Recognition/Image Classification
Object Recognition은 찾고자 하는 사물을 이미지에서 찾아내는 문제이다.
Object Recognition에서 사용할 수 있는 가장 단순한 방법은 슬라이딩 윈도우 방식으로 이미지 안을 돌면서 사물과 correlation이 높은 부분을 찾는 방법이다. 그런데 이런 방법은 엉뚱한 곳도 correlation이 높게 나와서 잘 못 인식할 수도 있다.
Challenge
엉뚱한 사물이 correlation이 높게 나오는 이유는 뭘까?
같은 사물 또는 클래스라도 이미지를 촬영한 camera position, light condition, shape parameters 등이 다르기 때문에 이미지 내부의 값이 변하는데, 컴퓨터는 이미지를 값으로 판단하기 때문이다.
Classification에서는 이런 문제들을 Challenge로 정의해놓았는데, 이는 다음과 같다.
- variable viewpoint - 같은 사물을 다른 각도에서 촬영
- variable illumination - 같은 사물을 다른 빛에서 촬영
- scale - 크기가 다름
- deformation - 같은 사물의 모양이 달라짐
- occlusion - 일부분 가려짐
- background clutter - 배경과 사물이 비슷함
- intra-class variations - 같은 클래스이지만 다르게 생김
이전에는 이런 문제들을 알고리즘적(Ruled-driven approach)으로 해결하기 위해 수많은 규칙을 만들며 Classification을 진행했는데(예를 들어 코너 검출 등을 통해 고양이의 귀는 어떻게 생겼고... 등등), 이는 다루기 힘들고 수많은 클래스에 대한 룰을 만들어야 하기 때문에 좋지 않은 방법이다. 심지어 성능도 좋지 않았다.
Data-driven approach
알고리즘적으로 수많은 규칙을 만드는 대신, 모델에게 수많은 클래스에 대한 수많은 데이터를 주면 잘은 모르겠지만 모델이 어떤 정보를 습득하고 요약해서 새로운 데이터를 봐도 잘 예측할 것이라는 취지의 개념이다. 실제로 이는 성능이 좋고, 지금 딥러닝과 같은 AI에서 주로 사용하는 방법이다.
이런 Data-driven approach로 모델을 만들면서 변한 점은 기존에는 데이터를 보고 correlation을 계산해서 바로 예측했다면, 지금은 모델을 학습하는 train 과정을 거친 후 predict을 하는 두가지 step으로 변했다는 것이다.
아래에서 이런 Data-driven approach를 K nearest neighbors, Naive Bayes에서 다뤄보자.
Bag of Words
먼저 위에서 말한 모델들을 사용하려면 데이터를 비교할 수 있게 변형시켜줘야 한다.
물론 K nearest neighbors의 경우는 이미지 픽셀별로 비교할 수 있기 때문에 BoW가 필요없을 수 있지만, 다른 두 방법은 변환이 필요하다.
이 Bow는 원래 NLP에서 제안한 방법으로 두 문서의 유사도를 측정하기 위해 제안되었다. 두 문서에서 사용된 단어들을 각 단어별로 갯수를 세고 이를 단어순으로 나열해서 BoW 벡터로 만든 후 두 벡터의 코사인 유사도를 계산하는 방식이다. (코사인 유사도가 아닌 TF-IDF를 사용하기도 한다고 한다.)
Computer Vision에서는 이를 Word가 아니라 SIFT를 통해 추출한 Feature를 사용해 BoF(Bag of Features) 벡터를 구한다.
K-means clustering
SIFT를 통해 추출한 Feature들은 비슷한 Feature들도 약간씩 다른 값을 가지기 때문에 군집화를 통해 같은 Feature들을 묶어서 단어와 같은 Visual vocabulary를 만들어야 한다. 그래야 이미지에서 Feature를 추출한 후 그와 가장 비슷한 Visual vocabulary를 찾고 이를 카운팅해서 BoF를 만들 수 있기 때문이다.
K-means clustering은 설정해둔 군집의 개수만큼 랜덤하게 중심점을 생성한다.
그리고 모든 데이터와 중심점들에 대해 거리를 계산해서 중심점과 가장 가까운 데이터를 해당 군집으로 선택한다.
그리고 선택된 군집의 중심점을 계산해 중심점의 위치를 업데이트 시킨 후 이 과정을 중심점의 위치가 업데이트 되지 않을 때까지 반복한다.
그러면 이때의 중심점들이 Visual vocabulary가 된다.
BoW를 사용한 방법의 순서
- Train data에서 SIFT를 통해 Feature를 추출한다.
- 추출된 Feature들을 토대로 군집화를 통해 Visual Vocabulary를 생성한다.
- Test data에서 SIFT를 통해 Feature를 추출하고 Visual Vocabulary 중 가장 비슷한 것으로 카운팅한다.
- 카운팅 된 Visual vocabulary들을 순서대로 나열해 BoW 벡터로 만든다.
- BoW 벡터를 통해 Classification을 진행한다.
K nearest neighbors
KNN은 K-최근접 이웃법으로 가장 인접한 K개의 데이터를 자신의 군집이라고 판단하는 알고리즘이다.
이때 가장 인접한 데이터를 찾기 위해 계산하는 거리는 일반적으로 유클리드 거리(L2)를 사용하고, L1를 사용하기도 한다.
$$ d_2(x, y) = \sqrt{(x_1-y_1)^2 + \cdots + (x_N - y_N)^2} $$
$$ d_1(x, y) = \sqrt{|x_1-y_1| + \cdots + |x_N - y_N|} $$
또한 BoW 벡터의 각 차원이 다른 스케일을 가지므로 어느 하나의 편중되지 않게 normalize를 해야 한다.
그리고 K의 값에 따라 분류기의 성능이 하락할 수 있으므로 잘 조정해야 한다.
Hyperparameters
이처럼 L1, L2 둘중에 어떤 것을 선택하느냐, K의 값을 몇으로 하느냐가 모델의 성능의 영향을 미치는데, 이러한 요소를 하이퍼 파라미터라고 한다.
이런 하이퍼 파라미터는 '어느 것이 무조건 좋다'가 없고, 문제, 데이터, 모델 등에 따라 달라진다.
Validation
기존에 우리는 데이터를 Train, Test 두가지로 나눠서 모델링을 진행한다고 했다.
그런데 Test는 정답이 없기 때문에 모델이 잘 예측하는지 판단하기도 어렵고, 실제로 테스트 상황이 아니라면 보지 못하는 데이터이므로 모델 성능을 판단하기가 어렵다.
그래서 나온 것이 Validation 방식인데, 이는 Train Data를 Train과 Validation으로 다시 나눠서 Train으로 학습한 후 Validation으로 검증할 수 있게 하는 방식이다.
이렇게 Validation set을 만들어주면 하이퍼 파라미터 튜닝시에도 어떤 하이퍼 파라미터로 학습한 모델이 성능이 좋은지 검증할 수 있다.
Cross-Validation
Cross-Validation은 Validation을 나눔으로써 Validation 크기 만큼의 Data를 학습하지 못하기 때문에 생기는 문제를 해결하는 방식이다.
Data Split시 아래의 그림처럼 5개의 fold로 나눈다고 했을 때 각 fold를 validation set으로 해서 5개의 모델을 학습시킬 수 있다.
그렇게 학습된 모델을 통해 5개의 예측을 할 수 있고 이 결과를 평균하면 Validation으로 인한 손해를 최소화할 수 있다.
KNN의 성능
Training : O(1)
Testing : O(MN) - 한 개의 Test 이미지 당 모든 N개의 point와의 거리를 계산한다.
아래의 그림을 보면 2번째는 shift, 3번째는 occlusion, 4번째는 darken이 적용된 그림인데 이 3개의 데이터는 모두 원본 이미지와 같은 L2 distance를 가진다. 또한 테스트 성능이 매우 나쁘다.
이런 점 때문에 image에서는 KNN은 절대 사용하지 않는다.
Naive Bayes
Naive Bayes는 베이즈 법칙에 기반한 분류 방법인데, Naive라는 수식어는 확률적으로 독립이라는 억지스러운 가정이 들어가서 데이터를 단순하게 보기 때문에 붙었다. 이런 단순화 덕분에 쉽고 빠르게 판단을 내릴 때 사용할 수 있지만, 가정에 위배되는 경우가 있으므로 주의가 필요하다.
우리는 이미지에서 feature들을 발견하고 이를 통해 해당 이미지가 어떤 class인지 확률을 구할 수 있다.
이를 X(feature)가 주어졌을 때, z(class)일 확률인 사후확률(posterior probability)라고 하고, $ p(z|X) $ 라고 한다.
이는 다시 $p(z|x_1, x_2, \cdots, x_n)$으로 쓸 수 있다.
즉, z가 car이면 사후확률은 n개의 feature를 본 후, car일 확률인 것이다.
이런 사후확률은 베이즈 정리에 의해 분해될 수 있다.
$$ p(z|X) = \frac{p(X|z)p(z)}{p(X)} $$
우리가 하고 싶은 것은 classification이므로 가장 높은 확률을 가진 class를 찾기만 하면 된다.
고로 $ \hat{z} = argmax p(z|X)$인 $z$를 찾으면 된다.
이는 베이즈 정리에 의해 $ \hat{z} = argmax(\frac{p(X|z)p(z)}{p(X)})$로 쓸 수 있다.
여기서 $p(X)$는 데이터에서 본 feature는 z가 달라져도 같기 때문에 지울 수 있고, $p(z)$ 또한 만약 class가 2개면 1/2, 3개면 1/3으로 z가 달라져도 같기 때문에 지울 수 있다.
고로 $argmax(p(X|z))$를 구하면 된다.
나이브 베이즈 분류기에서는 모든 feature가 conditionally independent하다고 가정하므로 $p(X|z) = p(x_1, \cdots, x_n|z) = p(x_1|z)p(x_2|z)\cdots p(x_n|z)$으로 쓸 수 있다.
고로 정답 라벨에서 해당 feature가 등장할 확률을 모두 곱하고 이를 비교하면 되는 것이다.
Example
이미지 대신 간단히 문서에 대해 예시를 들어보자.
class로 'grandchallenge', 'softrobot'이라는 문서가 있다고 하자.
count | 1 | 6 | 2 | 1 | 0 | 0 | 0 | 1 |
word | Tartan | robot | CHIMP | CMU | bio | soft | ankle | sensor |
p(x|z) | 0.09 | 0.55 | 0.18 | 0.09 | 0.0 | 0.0 | 0.0 | 0.09 |
위의 표는 'grandchallenge' 문서에서 해당 word가 나올 확률 p(x|z)와 우리가 분류하고 싶은 문서에서 얼마나 해당 단어가 자주 등장하는지를 나타낸 count가 있다.
우리는 앞에서 $p(x_1|z)p(x_2|z)\cdots p(x_n|z)$이를 구하고 비교하면 됨을 보였다.
고로 $ (0.09)^1(0.55)^6\cdots(0.09)^1$로 계산할 수 있다.
여기서 두가지 처리할 것이 있는데 먼저 p(x|z)가 0인 경우이다.
p(x|z)가 0인 경우에는 곱하면 0이 되기 때문에 이를 pseudo-counts로 매우 작은 값으로 처리해줘야 한다.
우리는 이를 0.001로 넣어줄 것이다.
두번째는 p(X|z)가 아닌 log p(X|z)를 구한다는 점이다.
p(X|z)는 확률이므로 값이 굉장히 작기 때문에 log를 취해 비교한다.
그래서 계산을 해보면 $log p(X|z = 'grandchallenge') = - 2.42 - 3.68 - 3.43 \cdots - 2.42 = -14.58$이고, 표는 없지만 softrobot은 $-37.48$이 나온다.
둘 중 'grandchallenge'의 값이 더 크므로 우리가 분류하고자 하는 문서는 'grandchallenge'로 분류된다.
Multinomial Naive Bayes
Support Vector Machine
SVM은 한개의 뉴런, 퍼셉트론과 거의 똑같다.
퍼셉트론은 Neural Net 파트에서 다룰 예정이므로 따로 설명하지는 않는다.
'대학 강의 > 컴퓨터 비전' 카테고리의 다른 글
[컴퓨터 비전] 2. Edge (0) | 2023.03.27 |
---|---|
[컴퓨터 비전] 1. Filtering (0) | 2023.03.10 |