본 포스팅은 Standford University의 'CS231n' 강의로 공부한 것을 정리했습니다.
Lecture 2 | Image Classification
다음과 같은 변화가 발생했을 때 Image Classification이 어렵다.
- Viewpoint Variation
- Illumination
- Deformation
- Occlusion
- Background clutter
- Intraclass variation
Image Classification을 위한 방법은 다음과 같다.
이미지의 특징적인 edge, shape, junction 등을 찾아 라이브러리화 하고 이미지의 배열 상태 등을 비교하여 탐색한다. 그리하여 다른 이미지가 들어왔을 때 전반적인 상태를 비교하고 그것을 통해 분류하는 시도이다.
수많은 데이터를 수집해야 한다는 문제점이 있으나 하드웨어의 발전으로 성능이 좋아졌다.
Train 함수로 학습된 이미지를 모두 기억하고, Predict 함수로 새로운 이미지를 받아 학습된 데이터 중 가장 비슷한 이미지(레이블)를 찾는다.
def train(train_images, train_labels):
# build a model for images -> labels...
return model
def predict(model, test_images):
# predict test_labels using the model...
return test_labels
크게 두 가지 과정을 거친다.
import numpy as np
class NearestNeighbor(object):
def __init__(self):
pass
def train(self, X, y):
""" X is N x D where each row is an example. Y is 1-dimension of size N """
# train 함수: 학습 데이터를 기억
self.Xtr = X
self.ytr = y
def predict(self, X):
""" X is N x D where each row is an example we wish to predict label for """
# predict 함수: 이미지를 입력 받고, L1 distance로 비교
num_test = X.shape[0]
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for i in range(num_test):
# i번째 테스트 이미지와 가장 가까운 학습 이미지를
# L1 거리(절대값 차의 총합)를 이용하여 찾는다.
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # 가장 작은 distance를 가지는 인덱스
Ypred[i] = self.ytr[min_index] # 가장 가까운 이웃의 라벨로 예측
return Ypred
Nearest Neighbor 구현에 사용된 거리 측정 함수로, 이미지를 Pixel-wise로 비교한다. 두 이미지 간의 차이를 어떻게 측정할 지에 대한 구체적인 방법을 제시한다.

Q) Trainset 이미지가 총 N개라면 Train/Test 함수의 속도는?
A) Train Time은 O(1), Test Time은 O(N)입력된 데이터를 기억하는 Train 함수에 반해, Test 함수는 N개의 데이터 전부를 테스트 이미지와 비교하여야 하기 때문에 상당히 오랜 시간이 걸린다.
Decision Region은 각 좌표가 어떤 학습 데이터와 가장 가까운지 계산한 뒤, 해당 클래스의 색으로 칠한 것이다. 중앙을 보면 대부분이 초록색 점인데 중간에 노란색 점이 끼어있음을 알 수 있다. NN 알고리즘은 "가장 가까운 이웃"만을 보기 때문에 발생하는 현상이다. 이를 잡음(noise) 또는 가짜(spurious)라고 부른다. 이러한 현상을 해결하기 위해 생긴 것이 NN의 일반화 버전인 K-NN 알고리즘이다.
Distance Metric을 이용해 가까운 이웃을 K개 만큼 찾고 이웃끼리 투표하는 방식이다. 가장 높은 득표수를 획득한 레이블로 예측한다. 여러 방법이 있으나 득표수만 고려하는 방법이 가장 쉽고 잘 동작한다.



what is the best value of k to use?
what is the best distance to use?
학습을 하는데 영향을 미치는 Parameter. 데이터 분석을 통해 얻어지는 값이 아니기 때문에 학습 전 사용자가 직접 정해야 한다. 경험에 의해 정해지는 경우가 많아 여러 번 수행해보며 최적의 값을 찾는다. 예제에서는 K와 거리 척도에 해당한다.
BAD 해당 데이터에서만 완벽하게 적용됨
BAD 알고리즘이 새 데이터에서 어떻게 수행되는지 알 수 없음
Better val에 대한 하이퍼 파라미터 선택 및 테스트에 대한 평가
Better 데이터를 여러 개의 fold로 나눔

k-Nearest Neighbor on images never used.

Linear Classification은 Neural Network를 구성하는 가장 기본적인 요소로, "parameter model"의 가장 단순한 형태이다.

x: input image
W: 가중치(Weight). 트레이닝 데이터의 정보가 요약된 벡터
b: 바이어스. 곱을 끝내고 더하는 역할을 수행. training data와 상호작용 하지 않는 상수로, 데이터에 무관하게 특정 클래스에 우선권 부여
이 함수는 data x와 parameter W을 가지고 10개의 숫자(각 10개 카테고리의 스코어)를 출력한다. 고양이 카테고리의 스코어가 높으면, 입력값 x가 고양이일 확률이 높음을 의미한다.
방학에 진행한 인공지능 스터디가 도움이 되었다. 교수님께서 PPT 외적으로 설명해주시는 내용을 쫓아가기 위해 강의를 여러 차례 반복하여 듣기도 하였다. 실제 대학교에서 실제로 진행한 과제이다보니 학생을 대상으로 한 과제도 있는데, 시간이 나면 풀어봐야겠다.