티스토리 뷰
clssification 할 떄 이미지들에서 고려할 점.
1. 우리는 이미지를 바로 인식할 수 있지만, 컴퓨터에서 이미지는 전부 숫자로 이루어져 있다.
rgb를 뜻하는 코드[0~255]와 800*600*3 channel RGB 즉, 빨강, 초록, 파랑 채널의 숫자들을 각각 가지고 있다.
2. 만약 카메라의 방향이나 각도를 바꾼다면 픽셀의 값은 매우 많이 변동한다.
이 점에서 로봇들이 어떻게 대응할 것인지 생각해 볼것.
만약 같은 물체지만 색깔이 다른 경우, 전부 다른 픽셀값을 가지므로 그 방안에 대해서도 고려해야 한다.
4. 카테고리 안에서도 분류되는 경우가 있다. ex) 고양이의 종류.
5. background color에 대해서도 고려해야 한다.
6. 조명이나 일루미네이션에 대해서도 인식할 수 있을정도로 가지고 있어야 한다. ex) 검은 고양이에 검은 배경
7. Occlusion : 소파 안에 숨은 고양이. 꼬리만 나와 있는 걸 과연 고양이라고 인식할 수 있을까?
위 모든 문제를 극복하고 할 수 있는 알고리즘을 만드는 게 중요하다.
이미지 분류 모델의 기본
중요한 건, 이미지 분류라는 건 컴퓨터 비전의 가장 기본적인 구성 요소라는 것이다.
-> 일단 분류를 해야, 사람과 말라는 단어를 만들어 낼 수 있고, 그 사람이 말 위에 올라타 있다는 문장을 만들어 낼 수 있다.
def classify_image(image):
#Some magic here?
return class_label
함수를 만들 때 직관적이지 않으므로, 인간적인 직관으로 분류하는 방법을 먼저 사용한다.
find edge -> find corners.
하지만 이런 방식은 모든 특징을 기록해야 하므로, 시간도 많이 들고 힘들다.
그래서
1. collect a dataset of images and labels(라벨로 이미 분류된 이미지를 수집)
2. Use Machine Learning to train a classifier(분류기를 머신 러닝으로 학습시키기)
3. Evaluate the classifier on new images (분류기를 새 이미지로 평가)
기본적인 파이프라인은 다음과 같다.
따라서 API에서 def train(학습 함수) 과 def predict(예측) 라는 두 가지 함수가 머신 러닝의 기본적인 원리이다.
이 자체가 프로그램을 만드는 것과 조금 다르다.
대표적인 분류 데이터 셋 : mnist 데이터 셋
CIFAR100
ImageNET = 이미지 데이터 세트의 표준
만약에 이미지 분류 알고리즘의 연구 논문을 작성하려면 이미지 넷의 결과를 표시하지 않으면 리뷰어들이 불만을 품을 수있다(2020년 때라서 그런건지? 최근 것을 찾아봐야한다)
아주 중요하게 여겨진다.(130만 훈련이미지)
그러나 이 클래스에서는 cifar을 사용한다(시간비용적 측면)
특수 : omniglot : few shot learning을 위한 데이터 셋
first classifier : Nearest Neighbor
이건 너무 쉬운 알고리즘이라서 의미가 없다.
train에서 모든 데이터를 학습.
predict에서 label이 유사한 것들을 나열한다.
즉, 유사도를 예측할 수 있는 함수를 짜는 것이 필요하다.
ex) test와 training 이미지의 숫자를 빼서 얼마나 차이가 나는지 구함
여기서 N 예제는 학습 시키는데 O(1), 테스트 하는데 O(N)의 시간 복잡도를 가진다.
엄청 나쁜 알고리즘(머신 러닝에선 테스트(사용) 할 때 빠른 걸 원하는 건데, 정확히 정 반대임)
하지만 대규모 브루트 포스보다는 빠르니 알아두는 것도 좋다.
분류기 평가에선 Decision Boundaries 평가를 사용하는데, 영역 전부 noisy 하다.
이 noise를 완화하려면 어떻게 해야 할까?
1. 더 많은 분류 함수를 짜면 된다.(거름망)
경계가 점차적으로 smooth 해진다.
그러나 문제는 label 간에 완전히 Tie 한 공간이 생길 수 있다는 것이다.(연산이 계속되어서 0이 됨)
2. Distance Metric을 바꾼다.
Manhattan distance에서 유클리드 distance로( or 최소 제곱법, adam 등등..)
tf-idf
Nearest Neighbor는 상대적으로 단순해보이지만 가끔은 강력해진다.
Hyperparameters
어떤 K(함수(거름망)의 개수)를 쓰는 게 좋을까?
어떤 distance metric을 쓰는 게 좋을까?
하이퍼 파라미터는 학습 데이터에서 직접 학습할 수 없음
하이퍼 파라미터는 다양한 값을 시험해보고 뭔지 확인해봐야 함.
그럼 도대체 어떻게 결정해야 하냐?
setting Hyperparameters.
1. 학습 알고리즘이 훈련에서 가장 높은 정확도를 제공하도록 하는 하이퍼 매개변수 값 선택하기.
-> 합리적으로 보이나 아주 끔찍한 생각이다. 그러면 무조건 K=1이 된다. 훈련 데이터만 잘 인식.
더 나은 건 두번째 방법.
2. 데이터 셋을 두 가지로 분류
-> 90%의 값을 데이터 셋으로, 나머지 10%의 값을 테스트 값으로 만든다.
그리고 마지막.
3. 데이터 셋을 3개로 분류 -> best
train, test, 그리고 validation으로 분류
validation은 hyperparameter를 검증하는 용도로 사용
테스트 세트를 한번만 사용하게 될 것이므로 아주 정확해진다.
train 70%, vailidation 20%, test 10% 정도.
아주 좋지만 튜닝하는 과정에서 테스트 세트를 활용해볼 기회가 없다(랜덤이므로)
몇 달 동안 테스트 했는데 만약 결과가 잘 안나오면? 끔찍하다.
그러나 이게 기계 학습을 수행하는 가장 올바른 방법이다. 잘못하면 프로젝트가 망가진다.
이게 끔찍하더라도 무조건 이렇게 해야 한다.
그러면 더 좋은 방법은 없을까?
4. cross-validation(교차 검증)
데이터 셋을 6개로 나눴을 때, 6구역은 테스트로 두고, 5구역을 validation으로 학습해보고, 4구역을 학습해보고, 3구역을 학습해보고..그런 방식에서 정확도를 나열하여 가장 좋은 hyperparameter를 얻으면 된다.(노가다)
가장 정확한 작업이지만 훈련 비용 때문에 대부분의 기계 학습에서는 실행되지 않음.
Universal Approximation
만약 K의 수를 무한대로 늘리면 늘릴수록 더 성능이 좋아진다.(즉, 거름망의 수를 늘린다)
그러나 문제는..만약 거름망을 늘리고 싶다면 기본 데이터 셋에서 K 만큼의 차원수가 필요하다.(특징으로 분류되는 정보가 필요)
curse of dimensionality = number of possible 32*32 binary images = 10^308승의 공간..
우주의 입자 수보다 더 크다.
K-Nearest Neighbor on raw pixels is seldon used.
-very slow at test time
-Distance metrics on pixels are not inforamtive
그러나 nearest Neighbor는 ConvNet features에서는 잘된다.