Search
▪️

Lecture 02: Image Classification Pipeline

Assignment
1.
KNN(K-Nearest Neighbor)
2.
Linear Classifiers: SVM, Softmax
3.
Two Layer Neural Network
4.
Image Features
→ All of these are using Python and NumPy
** NumPy는 Vectorized된 연산을 수행하는데 있어서 굉장히 중요한 역할을 한다.
Image Classification을 수행하기 위해서는 컴퓨터로 고려해야 하는 일들이 있다.
1.
물체를 인식할 수 있도록 뇌의 복잡한 시각 처리 과정을 나름의 Label로 구현해야 한다. 이미지를 인식했다면 이미지의 각 픽셀은 3 Channel의 RGB값으로 되어 있고 각 색은 0~255 사이의 값을 갖게 된다.
2.
만일 움직이는 이미지라고 가정 했을 때, 카메라가 움직이면 이 픽셀의 값도 다 바뀌기 때문에 움직이는 물체에 대해서는 별도의 처리가 필요할 정도로 까다롭다. 혹은 움직이는 물체가 아니더라도 빛의 영향을 받아서 이미지의 픽셀 값이 바뀔 수 있다. 더 나아가 물체 스스로가 움직인다거나 위장을 한다면 물체를 인식하기 더 어렵다.
3.
서로 다른 물체라도 같은 종류로 분류할 수 있다면 그 물체도 인식할 수 있어야 한다.
그렇다면 위와 같은 고려 사항들을 모두 만족하는 체계를 만들었다면 사람의 시각 체계와 다른 점은 무엇인가? → 일단 컴퓨터로 물체에 대한 구분만 가능하다면 제한적인 상황에서도 사람이 빠르게 인식하는 것 이상으로 동작할 수 있다.
위에서 제시된 고려 사항들을 만족하도록 가장 먼저 해줘야하는 일은 Edge Detection이다. 이런 Edge를 찾기 위해서 가장 필요한 것은 많은 데이터이다. (즉, Data Driven Approach이다.)
1.
Collect a Dataset of Images and Labels
2.
Use Machine Learning to Train a Classifiers
3.
Evaluate the Classfiers on New Images
** 기본적으로 Data Driven Approach는 Deep Learning보다 더 보편적인 성질을 갖는다.
일반적으로 학습에 이용되는 데이터들은 CIFAR-10 (10 Classes / 50,000 Training Images / 10,000 Test Images)
추론 과정에서 Similarity 측정하는 Compare는 무엇으로 하는가? → 여러 방법으로 가능하지만 해당 강의에서 소개된 방법은 L1 Norm(Manhattan Distance)이다. 이 방법은 서로 차를 매긴 것을 절대값을 취하여 모두 더하는 방식이다.
Nearest Neighbor의 Image Training or Image Prediction API는 다음과 같이 생겼다.
def train(image, labels) ⇒ model
→ 위 방법은 Memorize all data and labels이고 O(1)이다.
def predict(model, test_images) ⇒ test_labels
→ 위 방법은 Predict the label of the most similar training image이고 O(n)이다.
그렇다면 Nearest Neighbor에 쓰인 알고리즘은 바람직한가? → Time Complexity가 바람직하지 않다.
학습은 오래 걸려도 무방하지만 추론은 실제로 사용해야 해서 빨라야 한다. 이는 Browser, Mobile 환경에서도 이용해야 하는 것을 감안하면 필수불가결한 것이다.
Time Complexity외에도 Image Classification이 제대로 되지 않는 문제점도 발견할 수 있다.
K-Nearest Neighbor에 대해 살펴보자.
Instead of copying label from nearest neighbor, take majority vote from K closest points (K ≥ 1)
White Space means that there's no majority among the K nearest neighbors
여기서 중요한 포인트는 모델을 Robust하게 만드는 적절한 K값을 찾는 것이다.
모델을 Robust하게 만들기 위해서는 비교 방법을 어떤 것으로 사용하는가도 중요하다. (이전에 소개했던 것이 L1 Norm을 썼다면 L2 Norm(Euclidean Distance)를 쓸 수도 있음)
L1: Coordinate Frame이 바뀌면 Distance가 바뀐다.
L2: Coordinate Frame이 바뀌어도 크게 영향 받는 것이 없다.
서로 다른 Distance Metrics들이 굉장히 중요하지만 왜 그런가? → Images or Vectors가 아닌 단순 Text Classification을 하고 싶다면 L1으로 충분히 Paragraphs, Sentences들을 분류할 수 있다. 이렇듯 특성마다 효율적인 Metric이 있기 때문이다.
** L1은 Vector의 Individual한 Element들 각각이 의미를 갖고 있다고 하면, 더 좋은 선택일 수 있다는 소리이다. 즉, Coordinate Frame 변화에 Dependent하므로 변화에 민감한 것에 사용하면 좋다는 것이다. 예를 들면, 연봉 계산이나 근속 연차 계산 등..이 있다.
하이퍼 파라미터들이라 함은 학습으로 정할 수 없는 인자들을 의미한다.
예를 들면 KNN에서 K 값을 무엇으로 정할지 혹은 Distance Metrics는 어떤 것으로 사용할지는 학습을 통해서 얻어지는 것이 아니라 학습 이전에 사람이 직접 정하는 값들이다.
그렇다면 좋은 값을 써야하는데... 어떤 값들이 좋은지 어떻게 알고 예측하는가? → Problem에 굉장히 Dependent한 문제이다.. Thus, must try them all out and see what works best
하이퍼 파라미터를 정하는 방법들
1.
Choose hyper parameters that work best on the data ⇒ BAD
K = 1 always works perfectly on training data
only training data
2.
Split data into train and test, choose hyper parameters that work best on test data ⇒ BAD
No idea how algorithm will perform on new data which do not belong to test data
training data and test data
3.
Split data into train data, validation data, test data, choose hyper parameters on validation data and evaluate on test data ⇒ BETTER
training data, test data, and validation data
4.
Split data into folds, try each fold as validation and average the results ⇒ Cross Validation
주로 적은 양의 데이터가 있을 대 사용되는 방법이라 Deep Learning에서는 잘 사용하지 않는다.
다시 말하지만 Deep Learning과 같이 학습의 cost가 비싼 학습 방법에는 이용하지 않는다.
Validation Data와 Training Data의 차이?
학습 데이터들은 이미지의 모든 Label들을 Memorize하여 Predict 시에 가장 유사한 Label을 찾아 내기 위한 것으로 활용된다. 즉, 학습에서는 Label에 대한 직접적인 접근 권한이 있다. (Label을 직접 볼 수 있다.)
검증 데이터들은 학습 데이터와 달리 Label에 대한 직접적인 접근이 불가능하다. 오로지 이 데이터는 검증에 이용되고 있는 Algorithm이 잘 동작하고 있는지 확인용도로만 사용된다.
Test Data가 실제로 모든 데이터를 대표하지 않을 수도 있지 않은가?
실제로 Super Representative 하지 않게 들어올 수도 있다.
데이터의 Creator와 Curateor가 생각해 놔야 하는 부분이다.
데이터를 수집한 후, 예외 케이스에 대해서 잘 학습할 수 있도록 적절하게 시험 데이터와 학습 데이터를 나누는 것이 중요하다. 그냥 시간 순서대로 쌓아서 먼저 쌓인 걸 학습 데이터, 나중에 모인 것을 시험 데이터로 하면 문제가 생길 수 있기 떄문이다. 무작위 샘플링을 통해서 해결 가능하다.
그래서 결과적으로 Image Classification에서는 KNN을 이용하지 않는다.
1.
Test Time에 굉장히 느리기 때문이다. Dimension이 증가함에 따라서 처리량과 처리 시간이 Exponential 하게 증가함
2.
Distance Metrics on pixels are not infomative (서로 같은 사진에 색감을 바꿔도 같은 사진은 바뀌지 않는다. 여전히 같은 L2 Norm을 가질 수 있다는 것을 의미한다.) 즉, pixel의 값이 서로 달라도 L2 Norm이 같을 수 있어서 비효율적이다.
학습의 결과로 가장 적절한 하이퍼 파라미터를 찾았다면 다시 학습을 시키기도 하는가?
Performance가 중요하여 이를 높이기 위해서는 재학습을 하기도 한다.
하지만 데이터가 매우 크고 학습을 시키는데 너무 오래 걸리게 됐는데 차이는 크게 없다면 그냥 써도 무방하다.
Linear Classification을 수행하는 Neural Network는 일종의 Linear Classifier라는 Block들이 있을 때, 그것들을 합친 것이라고 생각해도 된다.
CIFAR-10을 기준으로 32x32x3 총 3072개의 색상 데이터가 있을 때, 이를 Input X라하자.
또한 Weight Parameters W를 주어, Output으로 10 Numbers Giving Classes Scores를 얻는 작업을 할 수 있다.
이전 KNN에서는 별도의 Parameter가 없어도 이용이 가능했던 방면, 이번 이미지에 대해서 Linear Classification을 수행하는 Neural Network는 Paremetric Method를 이용한다.
Linear Classification을 수행하는 Neural Network에서 사용하는 가장 간단한 함수로 Affine Transformation을 살펴보지. (f(x, W) = Wx + b)
10x1 = 10x3072 dot 3072x1 + 10x1로 Vectorized 하여 10x1의 Form을 만들 수 있다.
이런 개념으로 특정 Threshold를 주어 물체가 무엇인지 구분하게 된다.
다음 장에서 할 것?
1.
좋은 W란?
2.
Random W에서 시작하여 Loss 값을 줄여가며 W를 얻는 방법
3.
Tweak the Functional Form of f