Image classification
image classification은 컴퓨터 비전의 핵심적인 작업 중 하나입니다. image classification이 가능하면 Detction, Segmentation, Image captioning 같은 작업들은 수월하게 진행할 수 있다고 합니다.
이미지를 분류하는데 있어서 문제점이 하나 있는데 바로 컴퓨터가 이미지를 볼때 3차원 배열의 값으로 인식하면서 생기는 semantic gap 문제입니다.
- Viewpoint variation: 보이는 각도에 따라 달라질 수 있는 문제
- Illumination: 조명에 따라 픽셀 값의 변형
- Deformation: 객체의 형태가 변형될 때
- Occlusion: 객체가 숨어있어 일부분의 특징만 보일
- Background clutter: 주변 배경색과 객체가 비슷해 알아보기 힘들 때
- Intra-class variation: 고양이 클래스 내에 하위 분류는 어떻게 할 것인지(다양한 종류의 고양이가 있음)
- Scale variation: 객체들의 크기 변화로 인한 문제
Image classifier은 이미지를 받아 예측을 진행하여 레이블을 알려주는 형태입니다. 위에 문제점들 말고도 많은 문제들이 존재했습니다. 어떤 숫자를 정렬하는 알고리즘과는 다르게 고양이를 인식하는 것과 같은 문제는 명백한 알고리즘이 존재하지 않았습니다. 물론 역사적으로 볼 때 오랜 기간동안 이미지를 보고 이미지의 특징적인 edge를 찾아 라이브러리화 하여 이미지의 배열 상태를 비교해 탐색하는 과정 등, 이미지안에 작은 부분들을 특징적으로 찾아내 다른 이미지가 들어오면 작은 부분들을 비교하여 이미지를 분류하려고 했었습니다. 하지만 이 방법에는 많은 한계가 존재했습니다.
이러한 문제점들을 해결한 방법이 이미지와 레이블로 된 data set을 사용하여 우리의 Image classifier을 학습시키는 이였습니다. 학습 때는 이미지와 레이블을 받아서 모델을 만들고 test 단계에서는 모델과 test 이미지를 넣어주면 레이블을 반환하도록 한 것입니다.
이러한 이미지 분류의 첫 번째 방법을 통해 nearest Neighbor classifier을 학습해 보겠습니다. 모든 train 이미지와 레이블을 메모리에 전부 올리고 예측에서 test 이미지와 모든 train 이미지를 전부 비교하여 가장 비슷한 train 이미지의 레이블을 test 이미지의 레이블이라고 예측합니다.
- 학습에 사용되는 data set은 cifar-10을 사용하여 학습을 진행합니다.
- 각각의 이미지 사이즈는 $32 \times 32$로 굉장히 작고 10개의 레이블과 50000개의 train set과 10000개의 test set이 존재합니다.
다음과 같이 학습을 하고 예측을 했을 때 test 이미지에 가장 가깝다고 생각하는 train 이미지들이 파란색 네모에 있는 이미지들입니다.
여기서 test 이미지 하나씩 모두 train 이미지와 비교를 진행하는데 그 비교 방법이 이미지간의 distance를 비교하는 것입니다. 이미지 간의 거리를 계산하여 비슷한 공간상에 존재할 경우 같은 클래스로 분류하는 방법입니다.
- L1-distance를 사용해보겠습니다. (Manhattan distance라고도 합니다.)
- test 이미지가 $4 \times 4$로 구성되어 있을 때 pixel wise, 각 픽셀들 끼리 빼주고 절대값을 씌워준 형태입니다.
- 그 다음 값들을 전부 더해주어 456, L1-distance가 나오게 됩니다.
이러한 과정을 코드로 표현해보자면 다음과 같습니다.
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, X, y):
"모든 학습 데이터셋을 메모리에 올려 기억함"
self.Xtr = X
self.ytr = y
def predict(self, X):
num_test = X.shape[0]# 테스트할 이미지 셋을 넣음
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)# 데이터 갯수만큼 레이블을 만듬
for i in range(num_test):# 데이터 갯수 만큼 반복
distances = np.sum(np.ads(self.Xtr - X[i, :]), axis = 1)# 학습 이미지 전체 - 테스트 이미지 한 장
min_index = np.argmin(distances)# 브로드 캐스팅으로 계산된 것중 가장 작은 것을 찾음
Ypred[i] = self.ytr[min_index]# 레이블 수정
return Ypred
distance는 L1, L2 2가지 종류가 있습니다. 두 개중 하나를 선택하는 것은 하이퍼 파라미터입니다. 위에서 사용한 알고리즘은 가장 가까운 레이블을 골랐습니다. (nearest Neighbor classifier)
다음 방법으로는 knn (K-Nearest Neighbor) 으로 k개의 가장 가까운 이미지를 찾고 그 중 가장 많은 레이블을 자기 레이블로 설정하는 알고리즘입니다. k는 하이퍼 파라미터로 사용자가 설정해야합니다.
두 가지 알고리즘을 비교해봤을 때 knn은 조금 더 부드럽게 clasification이 진행이 됩니다. k는 주어진 상황에서 각각의 파라미터들을 실험해보고 가장 퍼포먼스가 높은 설정을 사용해야합니다.
- test set은 함부로 학습해서는 안됩니다. (추론을 위한 최후의 보루)
- 그렇기에 우리는 validation data를 마련해놔야 합니다. (최적의 하이퍼 파라미터를 찾기 위한 실험용)
nn은 절대 현실에서 사용해서는 안됩니다. test에서 성능이 매우 안좋고 distance라는 것이 현실적으로 정확한 예측을 하기 어렵다는 것입니다. 위의 사진 처럼 동일한 사진에 다음과 같이 변형을 줬을 때 이 사진 모두 오리지널 이미지와 동일한 L2-distance를 가지게 됩니다. 이런 이유로 잘 사용하지 않습니다.
- 요새는 경량화를 위해서 conv 계층에서 곱연산 보다 distance를 계산하는 뺄셈을 진행하던데 이러한 문제점을 해결한 방법인가?
Q1. train 데이터의 사이즈와 학습 속도의 관계
- 선형적, 사이즈가 2배 늘면 학습 시간도 2배 늘게 됩니다, 학습 속도는 느리지만 추론 속도는 빠릅니다.
- conv 처럼 내적으로 진행하는게 아니라 뺄셈으로 진행하기 때문에 연산량이 적어서 입니다.
Q2. nn으로 학습된 모델에서 학습 데이터에 대한 추론 작업을 실행한다면 그 정확도는 몇 퍼센트가 될 것인가?
- 100%, train 데이터와 동일한 이미지가 존재하기에 distance는 0이 됩니다.
Q3. knn으로 학습된 모델은 어떨까
- 1등 클래스를 정확하게 지적하더라도 나머지 클래스를 이상하게 선택한다면 예측이 이상하게 나올 수 있습니다.
- 같은 이미지를 넣어도 상황에 따라 다르게 나옵니다. 위에 그림을 보면 알 수 있듯이 nn은 모든 데이터를 포함하는 형태이지만 knn은 일부 데이터는 버리면서 일반화 성능을 올리는 모습처럼 보여집니다.
Linear classification
neural network은 여러 층을 블록 처럼 쌓는 과정을 통해 만들어집니다. 이 방법을 통해서 image captioning을 학습할 수 있습니다. image captioning은 이미지에 있는 object들을 classifier 한 다음 그것을 텍스트로 표현하는 것입니다.
이런 결과를 만들기 위해서 CNN과 RNN을 연결하여 사용합니다. CNN으로 분류를 진행하고 RNN으로 문장을 구성합니다. 이전 방법들은 파라미터가 들어가 있지 않았는데 지금부터의 접근법들은 파라미터들이 존재합니다.
다음과 같이 파라미터 W가 붙습니다. 여기서 x는 input 값으로 바꿀 수 없기 때문에 학습을 위해서는 W를 바꿔야 합니다. 위 사진에서는 3072개의 픽셀을 받아서 10개의 클래스로 분류하는 문제를 풀고 있습니다. 이 3072픽셀을 1차원으로 나열한 다음 파라미터를 곱해줍니다. 그리고 1차원 데이터를 10개의 클래스로 출력해야하니 데이터에 조금 더 손을 대야합니다.
- $(10 \times 1) = (10 \times 3072) (3072 \times 1)$
다음과 같이 데이터를 수정합니다. 이러한 접근 방식은 parmeter approach라고 합니다.
고양이 사진을 3클래스 분류를 한다고 하면 parameter W가 이미지 shape에 맞춰져야합니다. parameter의 1행은 공양이와 같은지 비교하는 과정으로 cat score를 결정하는 cat classifier입니다. 나머지 행들도 각자의 class의 score을 결정해주는 classifier 역할을 합니다.
classifier가 무엇인가요?
classifier = 이미지의 모든 픽셀 값들에 대해서 가중치를 곱해서 처리한 값의 합
각각 다른 위치에 있는 컬러를 카운팅 한 것입니다. (컬러가 중요)
학습된 가중치들을 시각화 해봤을 때 다음과 같이 색깔로 어느정도 형상을 알 수 있습니다. 맨 왼쪽 트럭 가중치를 보면 빨간색이 강하게 나오는 것을 볼 수 있는데 이것은 학습 데이터들 중 빨간색 데이터가 많다고 생각할 수 있습니다. 개구리의 가중치는 노란색을 띄는데 이런 경우 노란색 트럭의 경우 트럭으로 분류되는 것보다 개구리로 분류될 확률이 높습니다. (Linear classifier은 색상에 너무 의존적이다.) 그렇기 때문에 Linear classifier만을 사용하는 것은 성능에 좋지 않습니다.
- Linear classifier는 이미지의 특징을 찾기보다는 이미지의 색상을 찾는다.
- convolution neural network에서는 conv layer에서 이미지의 특징을 찾고 마지막 fc layer에서 이미지 색상을 찾는 건가?
Linear classifier가 데이터를 분류하는 방법을 시각적으로 표현해본 것입니다. 각각 벡터 공간상에서 Linear하게 데이터를 분류하는 모습입니다.
- Linear하게 분류하다. 픽셀의 강도에 따라 이미지가 분류된다. 색상에 따라 이미지가 분류된다, non-linear 같은 경우 색상뿐만 아니라 다른 요소에도 신경을 써야되기 때문에 픽셀 강도에 맞춰 저렇게 선형적으로 분류되는 것이 아니라 여러 기준을 포함하면서(구불구불하게) 나눔, 색상만이 기준이 아니기 때문에 non-linear 하게 나누는 것 인가?
Linear classifier로 학습하기 어려운 데이터는 gray 색상의 이미지들 = 색상보다는 텍스쳐나 형상이 중요한 데이터들
이렇게 우리가 추론해서 얻은 score에 대해 어느정도 좋거나 나쁜지도 정의해야합니다. 지금까지는 score function을 사용하여 score을 만들었고 이제는 loss funciton을 사용하여 loss을 만들어야합니다.
'cs231n' 카테고리의 다른 글
4. Training Neural Networks part 1 (0) | 2021.11.04 |
---|---|
3. Backpropagation and Neural Networks part 1 (0) | 2021.10.12 |
2. Loss function and Optimization (0) | 2021.10.11 |