검색어를 입력해 주세요.
MachineLearning / 03 3월 2021
[CS231N] Lecture2.

2.1 이미지 분류

컴퓨터는이미지를 어떻게 인식할까요?  컴퓨터는 이미지를 0~255 사이의 정수들로 이루어진  숫자배열(가로픽셀 X 세로픽셀 X 색상 채널값)으로 인식합니다. 컴퓨터로 이미지 분류를 하기위해서는 다음과 같은 문제가 있습니다.

– Viewpoint variation : 같은 사진이라도 사진을 찍는 방향에 따라 다르게 보인다.

– interclass variation : 같은 카테고리 내의 사물이라도 생김새가 모두 다르다.

– Fine-Grained variation: 한 카테고리 내의 사물이라도 미세한 차이가 있다.

– Background clutter: 배경색과 사물의 색이 비슷하면 구분하기 어렵다.

– Illumination conditions: 조명의 변화에 따라 사물이 다르게 보인다.

– Deformation: 사물의 모습이 변형되는 경우도 있다.

– Occlusion: 사물이 가려져 일부만 보이는 경우도 있다.

 

강의에서는 이러한 이미지 분류의 문제점을 언급하며, 그럼에도 불구하고 이미지 분류가 유용한 기술이며, 이미지 분류의 필요성을 강조합니다.  이미지 분류는 이미지 캡셔닝으로부터 자연어 문장을 추측해내고, 분류해내는 단계까지 발전하였다는것을 설명합니다.그러나 이러한 특징들을 명확하게 분류해내는 알고리즘 작성방법은 없으며, 그러한 특징들에 대하여 정확한 알고리즘을 작성하고 코드로 구성하는것은 좋은 방법이 아니라고 설명합니다. 무슨 설명을 하려고 이렇게 포석을 많이 깔까요?

이 모든 내용은 다음 내용으로 이어집니다.

 

2-2.데이터 중심의 접근(Data-driven approach)

 

여기서 잠시, 머신러닝의 장점이 데이터에서 자동으로 특성을 학습하는 능력이라는 것을 기억해야 합니다. 앞서 강의에서 말했듯이 숫자들을 정렬(sorting)하는 알고리즘과는 달리 이미지 속 고양이를 분간 할 수 있는 알고리즘을 작성하는것에는 명확한 해법이 없습니다. 다만, 이미지의 특징을 일일이 코딩하고 사람이 관여하는 기술을 사용하는 대신,  수많은 데이터를 컴퓨터에 입력하고, 컴퓨터는 이러한 예시들을 보고 각각의 클래스에 대한 시각적인 외형(visual appearance)을 익히는 방법으로 학습하는 머신러닝이 이미지 분류에 사용됨으로써 컴퓨터 비젼에 매우 강력한 발전을 가져올 수 있었습니다.

다시말해 이미지 분류에 있어서 머신러닝은, 이미지를 수집하여 라벨링하고, 머신러닝 기법으로 분류 모델을 학습시키고, 새로운 이미지를 활용하여 모델의 성능을 평가하고, 실제 사용가능한 모델로 완성하는 방법입니다. 이것이 데이터 기반 접근법(Data-Driven Approach)입니다. 이미 우리가 LMS학습을 통하여 많이 알고 있는 방법일 수 있습니다.

 

 

이러한 머신러닝의 방법은 (딥러닝이 아님에 유의해야 합니다. 우리는 지금 머신러닝을 통한 이미지 분류에 대하여 학습함으로써 딥러닝에 사용될 기술과 용어들을 배워 나갈 것입니다.) 분류대상이나 카테고리를 변경하더라도, 새로운 분류대상의 이미지 데이터셋을 모으로 것만으로 새로운 분류 알고리즘을 만들 수있다는 것입니다.

 

이것은 머신러닝이란 데이터를 기반으로 특징(feature)을 학습시켜(생체학적 원리에 영감을 받아 이미지를 분류해내는 방식으로 학습합니다.), 무엇인가를 예측하게 하는 강력한 기법이라는 것을 강조합니다. 그리고 이미지 분류에 있어서 이러한 데이터기반의 머신러닝 기법이 정착해 있다고 강의에서 설명하네요.

(이미지 분류에 쓰이는 대표적인 데이터셋: MNIST, CIFAR10, CIFAR100, ImageNet..등)

 

2강의 15분을 설명하는데, 너무 길어졌네요. 이 후 부터는 빠르게 점프해 보겠습니다.

제가 작성하는 CS231n 노트는 강의를 번역하는것이아니라, 부족하지만 노베이스인 제가 여러 학습 자료를 통해 이 강의를 이해한 내용을 정리해 두고자 함입니다.

따라서 어려운 개념의 수식이나, 이야기를 길어지게하는 디테일은 되도록 생략하려 합니다.  이후 부터는 이해한 개념만 빠르게 정리하고 넘어가겠습니다. More information parhaat casinot netissä.

 

2-3.이미지 분류를 위한 첫 번째 알고리즘 : Nearest neighbor

 

CS231n 준비단계에서 공부했던 머신러닝 알고리즘 분류 그림 생각나시나요? 지도학습->분류->아래 KNN과 SVM 머신이 있었습니다. 즉, 머신러닝 알고리즘 중에 이번강의에서는 KNN과 SVM을 배울 예정입니다.  (딥러닝이 아니라는것을 각성!!)

 

KNN분류기에 들어가기 앞서 nearest neighbor (NN) 방법을 간략히 살펴보면, 학습 데이터셋을 저장한 후에, 예측 단계에서는 투입된 이미지와 가장 가까운 데이터의 레이블을 통해 예측 하는 방법입니다.

 

머신러닝 이미지 분류기를 구성할 때, 위의 슬라이드에서 두 가지 파이썬 함수를 구현해야 한다는 것을 알았습니다.

하나는 train함수, 하나는 predict함수 입니다. 훈련( train)함수로 만들어진 라벨은 어떻게 예측(predict)함수에서 이미지에 맞는 라벨로 분류할까요?

이미지간의 유사도를 데이터간의 거리값으로 측정하는 것입니다.  비슷한 이미지 일수록 데이터 좌표상에서 비슷한 위치에 있을것이고, 그 좌표간의 거리가 가까울수록 같은 이미지일 확률이 높다고 예측하는 것입니다. 강의에서는 좌표상의 거리가 아닌, 데이터 픽셀값의 차를 구해서 모두 합한 값으로 근접도를 예상했습니다.

 

Q1.거리가 유사하다는것은 무엇일까요?

Q2.이미지와 이미지의 가까운 정도 (distance) 는 어떻게 구할 수 있을까?

여기서 잠깐 김성훈 교수님의 선형회귀 강의를 듣고 오기를 추천합니다.

** 개인적으로는, 김성훈 교수님강의를 함께 공부하는것이 이해가 쉬웠으나, 전체적인 머신러닝의 그림이 그려지지 않았다면 혼란 스러울 수 있습니다. 김성훈 교수님의 머신러닝 강의 2~3강의 20여분 정도의 강의로 cs231n의  3강까지 나오는 용어와 개념을 이해할 수 있습니다. 차이점만 확실히 기억해 두세요. cs231n은 선형분류의 예를 가지고 머신러닝을 설명하는 강의이고, 김성훈 교수님은 선형회귀로 머신러닝의 개념을 설명하는 것입니다.

데이터의 형태는 다르지만, 머신러닝의 기본 개념을 설명하는 부분에 있어서 우리는 근접하다는것! 그리고 거리값을 제곱평균을 사용한다는 것! 을 이해하기 위해 이 강의를 듣는것을 추천합니다.

  • 김성훈 교수 ML-lec02 [링크](13분)
슬라이드 2-41

위의 빨간 박스에 있는 파이썬 코드를 그림으로 설명하면 아래와 같습니다.

슬라이드 2-38

CIFAR10 데이터셋을 예로 들어 위의 두 슬라이드를 이해해 보도록 하겠습니다.

왼쪽 사진은 train데이터 셋입니다. 이미지별로 라벨링을 해둔 데이터 셋입니다.  오른쪽 사진은 test데이터셋 이미지를 입력했을때, 머신러닝 모델이 근접하다고 예측한 각 test이미지에 대한 10개의 이미지를 보여줍니다.  트럭을 말이라고 예측하기도하고, 말을 개로 예측하기도한 결과물들이 보이네요.

 

이러한 예측은 (위) 슬라이드 28번의 과정을 거쳐서 나온 예측입니다. 입력된 테스트 이미지는 왼쪽의 테스트 이미지들과 하나 하나  거리값을 계산하여서, 그 행렬의 합이 가장 낮은 10장의 이미지가 결과물로 나온 것입니다.

각 픽셀별로 뺄셈(차)을 해서 절대값을 취한 후 모두 더하는 방법으로, 이것을 L1 distance라고 합니다.

거리값이 낮을 수록 유사한 이미지라고 판단한 것이겠죠?

슬라이드 2-41의 파이썬 코드를 이용해서 테스트셋에 대한 성능을 평가하면 정확도(accuracy) 38.6 % 정도의 성능을 보인다. 앞으로 우리가 배울 CNN( Convolutional Neural Network) 기반 모델의 성능 (95 %) 과 비교하면 매우 낮은 수치입니다. 왜 이미지 분류알고리즘이 딥러닝으로 정착했는지 확실히 감이 오나요?

 

이 거리를 계산하는 방식이 한가지 더 있습니다. 바로 L2 distance입니다.

  • p-norm계열이 무슨말이지? [링크]

2-4.k-최근접 이웃 분류기(k – Nearest Neighbor Classifier)

nearest neighbor (NN) 은 단점이 많은 알고리즘입니다. 먼저, NN 은 단 하나의 label 만 prediction 에서 고려하기 때문에 안정성이 떨어지는 결과를 보여줍니다. 한 마디로 성능이 떨어지는거죠. 아래 슬라이드를 보면 각 영역의 경계선이 복잡하거나, 초록색카테고리안에 노란 점과 같이 이상치의 영향을 받아 성능이 떨어지는 것을 알수 있습니다.

nearest neighbor (NN) 분류 시각화

이를 보완하기 위해 k-nearest neighbor (KNN) 를 활용할 수 있습니다.  아이디어는 매우 간단합니다: 트레이닝셋에서 하나의 가장 유사한 이미지를 찾는 대신, 상위 k개의 유사한 이미지들을 찾아서 그것들이 테스트 이미지의 라벨에 다수결 투표(majority vote)하도록 합니다.

 

위 그림은 빨강, 파랑, 초록의 3개의 분류를 갖는 2차원 점 데이터로 NN분류기와 K(K=5)NN분류기의 차이를 나타낸 그림입니다. 색상으로 구분된 영역은 L2 distance에 의해 분류된 경계입니다. 5NN의 흰색 영역은 투표에 의해 적어도 2개의 클래스가 비기는 경우를 나타냅니다. NN에서 보이는 이상치와 복잡한 경계가 KNN에서는 보다 일반화되어 분류가 좀더 정확해진것(강의에서는 ‘경계가 부드러워졌다’라고 설명합니다.)을 확인 할 수 있습니다.

 

마지막으로 k-Nearest Neighbor의 k를 어떻게 정할것인가는 또 다른 문제가 됩니다.

 

K의 갯수는 입력데이터와 비교할 대상을 몇 개로 볼 것이냐는 의미입니다. K=1이면 입력데이터와 가장 가까운 트레인 데이터 1개만 비교하여 분류하겠다는 것이며, K=3이면 입력데이터와 거리가 3번째까지 가까운 것을 비교하여 입력데이터를 분류하겠다는 의미입니다.

2-5.하이퍼파라미티 조정을 위한 검증셋(Validation sets for Hyperparameter tuning)

**이렇게 길게 정리할 생각이 아니었는데.. 정말 슬라이드가 많은 강의네요. 다음 강의부터는 핵심만 3~5개 정도로 요약할 수 있기를 바래봅니다.

 

머신러닝의 성능을 높이는것이 우리의 최종목적입니다. 그것이 딥러닝을 통해서 가능했다는 얘기를 할 예정이지만, 일단은KNN의 성능을 높이는 방법으로 K를 어떻게 정하느냐 문제부터 해결해 보겠습니다.

K가 높으면 좋겠지요. 비교 데이터가 많을 수록 정확할 확률이 높아질테니까요. 하지만 무조건 K를 높이면 트레이닝 단계에서 계산량이 많아져 컴퓨팅파워가 부족하거나 속도가 매우 느려질 수 있습니다. 머신러닝에 사용할 데이터셋은 일단 대용량일테니까요.

 

Validation set 을 통한 Hyperparameter tuning

KNN 에서 우리가 정해야할 하이퍼파라미터(hyperparameter)는 k 와 distance function 이다.  이를 조정하는 방법을 hyperparameter tuning 이라고 합니다. 머신러닝에서 hyperparameter tuning 을 하는 주 방법은 여러번 해봐서 가장 좋은것을 찾는 것입니다. 하지만 이것은 별다른 아이디가 없을 때 좋은 방법이다. 훈련이 끝낸 모델에 테스트 셋을 입력하여 모델의 성능을 평가하지만, 하이퍼 파라미터를 조정하기 위해 테스트 셋을 사용할 수없고, 훈련을 끝내기전 하이퍼 파라미터를 조정하여 최적화된 모델을 구성해야 합니다.

이게 무슨 말이냐구요? 우리는 앞서 데이터를 트레이닝 데이터와 테스트 데이터로 나누어서 사용했습니다. 슬라이드2-41의 코드를 보면 train함수와 predict함수에 들어있는 저 X라는 녀석이 입력데이터입니다. 60000개의 데이터가 있다면 8:2 정도의 비율로 트레이닝셋과 테스트셋을 나누어서 사용하고 있었던 것입니다. 이 테스트 셋은 모델의 가장 마지막 단계에 단 한번만 사용할 수있습니다. 그래야 모델의 성능을 정확하게 평가할 수 있습니다.

이해가 안된다면 일단 데이터의 테스트셋트는 성능을 평가하는 것 이외에 다른 목적으로 쓰일 수 없다. 는것만 기억하죠!!

(테스트셋으로 hyperparameter tuning을 하면 모델이 테스트셋에 과적합 (overfitting) 되며, 다른 처음보는 데이터에 적용했을 때 상당히 성능이 떨어지는 문제를 겪게 된다.)

validation셋으로 하이퍼 파라미터를 구한 후 적정한 K값으로 다시 세팅하여 테스트셋으로 모델을 평가합니다.

따라서 방법은 트레이닝 셋의 일부를  hyperparameter tuning 을 위하여 분할하여 사용하는 것이다. 이를 validation set 이라고 부른다. validation set 을 통한 hyperparameter tuning 은 머신러닝에서 중요한 개념 중 하나입니다. Validation set 을 통한 Hyperparameter tuning 을 아래와 같은 파이썬 코드로 구현해볼 수 있습니다.

  •  강의 2의 과제에서 전체코드 확인[링크]

이렇게 여러개의 K의 경우로 교차검증을 한 후  나온 결과를 그래프로 표현해보면, 아래와 같습니다.

https://github.com/ubamba98/CS231n-2019/blob/master/assignment1/knn_solution.ipynb

약 K=10에서 정확도가 가장 높아보이네요.

이렇게 교차 검증을 한 후 나온 값을 바탕으로 K값을 설정하여 test셋을 모델에 입력합니다.

best+k = 10

이렇게 하이퍼 파라미터를 조정했음에도 불구하고 정확도(accuracy)가 0.28%정도입니다. 약 30%의 정확도라고 볼 수 있네요.

 

눈치가 빠르신 분은 짐작하셨겠지만, 이렇게 열심히 2강을 공부했지만, KNN분류기를 실제로 이미지 분류에 적용되지 않는 분류기 입니다. KNN분류기는 이해하기 쉽고, 간단한 알고리즘인 반면, 아래와 같은 단점이 있습니다.

1) training단계에서 시간이 오래 걸린다.

모든 N개의 트레이닝 데이터에 대해서 거리를 구해야 하가 때문에O(n) 의 복잡성을 갖습니다. 이 부분에서도 계산의 복잡도를 줄이기 위한 연구가 여전히 활발히 이루어지고 있다고 하네요.

 

2) 유사한 이미지에 대한 인식이 어렵다는 단점이 있습니다.

위 사진들은 오리지널 데이터와 유사한 거리값을 가지도록 변환한 이미지입니다. 예를 들어 우리가 original 과 shifted 이미지를 인식할 때, 피사체의 위치에 차이만 있을 뿐 물체에는 아무런 차이가 없다. 하지만 단지 물체가 옆으로 이동한 것만으로도 상당한 distance 가 생기게됩니다. 다른 이미지로 분류가 될 확률이 높아지는 것입니다.

왜 이런 문제가 생길까요?

문제는 물체의 특성이 아닌 각 픽셀을 기준으로 차이를 비교한다는 것이다. 물론 픽셀이 이미지의 특성을 반영하지만, 픽셀 값의 많은 부분이 물체 인식과 크게 관련이 없습니다. 단지, nearest neighbor 뿐 아니라 raw-pixel 을 output 으로 direct mapping 하는 대부분의 머신러닝 알고리즘은 같은 이유로 이미지 데이터에 효과적으로 적용되기 어렵습니다.

바로 이것이 이미지 분류에 딥러닝이 효과적인 핵심이유입니다. 이 한마디를 설명하기위해서 참 많은 슬라이드를 지나왔네요.

 

어떻게 이미지를 ‘우리의 인식과 관련 있는 특성’ 으로 요약할 수 있을지에 관해 생각해보며, CNN을 향해 3강 cost function의 긴 슬라이드의 장벽도 넘어가 보도록 하겠습니다.

 

참고블로그

1.Deep Play [3months.tistory.com/2.512]

2. sangminwoo.github.io

출처 : https://sunnyyanolza.tistory.com/19

Copyright © 2020 eloicube inc. All rights reserved.