[DL4CV] First Image Classifier

Stella Kim·2021년 7월 14일
0
post-thumbnail

Deep Learning에 대해 본격적으로 공부를 시작할 때 읽었던 책의 내용을 요약하였다.

<책 정보>

제목: Deep Learning for Computer Vision with Python
출간일자: 2018
저자: Dr.Adrian Rosebrock
출판사: pyimagesearch

Working with Image Datasets

이미지 데이터셋 작업 시 byte 단위로 데이터셋의 총 크기를 고려해야 한다. 즉, 이미지 분류 알고리즘을 사용하기 전엔 항상 데이터셋 크기를 인식해야 한다. 이번 챕터에서는 Animals 데이터셋을 사용해 간단한 이미지 분류기를 구현했다. 개, 고양이, 팬더 총 3개의 클래스로 구성되어 있으며 각 클래스마다 1000장의 이미지를 갖는 데이터셋이다. 본격적인 CNN 모델을 구현하기에 앞서 k-NN 분류기를 활용해 raw pixel 강도만을 사용해 이미지에서 올바르게 클래스를 분류하는 코드를 구현해볼 것이다.

A Basic Image Preprocessor

k-NN, SVM, CNN과 같은 머신러닝 알고리즘은 데이터셋의 모든 이미지가 고정된 벡터 사이즈일 것을 요구한다. resizing, scaling, ranging을 수행하는 방법에는 여러 가지가 있다.

class SimplePreprocessor:
	
    '''중략'''
	
    def preprocess(self, image):
    	return cv2.resize(image, (self.width, self.height), interpolation=self.inter)

파이썬에서는 보통 cv2를 import한 후 resize를 cv2에서 제공하는 resize를 사용해 이미지의 크기를 조정한다. interpolation은 크기를 조정할 때 사용되는 보간 알고리즘을 제어하기 위해 사용하는 선택적 파라미터이다. 사이즈를 줄일 땐 INTER_AREA, 사이즈를 크게 할 땐 INTER_CUBIC, INTER_LINEAR를 사용한다.

Building an Image Loader

숫자 처리를 위한 NumPy 패키지 이미지 경로에서 하위 디렉터리의 이름을 추출할 수 있는 os 패키지를 가져온다. 구현 시 Keras를 사용할 것이기 때문에 초기값 설정 시 전처리기를 단일 값이 아닌 리스트로 지정한다. 이후 cv2의 imread로 각 이미지를 디스크에서 로드하고 split을 사용하여 파일 경로에 따라 클래스 라벨을 추출한다. 이미지가 전처리되면 data와 label을 append하여 업데이트한다. 지금까지 이미지를 전처리하고 디스크에서 이미지를 로드하는 방법에 대한 코드를 공부해보았고, 이미지 분류에 대한 코드를 이어서 학습해보도록 하겠다.

k-NN: A Simple Classifier

k-NN 알고리즘은 k개의 근접한 이웃들 중 가장 일반적인 클래스를 찾아 임의의 데이터포인트를 분류하는 알고리즘이다. k개의 근접한 데이터 포인트의 각 데이터 포인트는 투표를 통해 가장 많은 표를 얻은 클래스가 이기게 된다.

k-NN 알고리즘이 동작하기 위해, 시각적으로 유사한 이미지가 n차원 공간에 서로 가깝게 배치된다고 가정한다. 이때 x축은 동물의 털의 촉감을, y축은 동물의 털의 밝기를 의미한다. 예를 들어, k=3일 때 팬더 2마리와 고양이 1마리를 발견한다면, 팬더 클래스가 다수표를 가져 입력 데이터에 대해 팬더로 분류할 것이다. 이런 식으로 k-NN 분류기를 적용하려면 몇 가지 고려해야 할 하이퍼 파라미터가 있다.

k-NN Hyperparameters

k-NN 알고리즘을 실행할 때에는, k의 값과 어떠한 거리 미터법을 사용할지를 결정해야 한다. k=1과 같이 k의 값이 너무 작으면 효율성은 향상되지만 노이즈나 특이 데이터 포인트의 영향을 받기 쉬워진다. 반대로 k의 값이 너무 클 경우 분류 결과가 over-smoothing 된다. 거리 미터법의 경우 일반적으로는 유클리드 거리 미터법을 사용한다.

Implementing k-NN

본 챕터에서는 Animals 데이터셋의 raw pixel 강도에 대한 k-NN 분류기를 훈련시키고 이를 사용해 임의의 동물 이미지를 분류하는 것을 목표로 한다. 이를 위해 4단계의 파이프라인을 사용한다.

  1. Gather Our Dataset _ 1000장씩 3000장의 RGB 이미지를 준비한다. 이후 32 x 32 크기로 전처리한다.
  2. Split the Dataset _ train set과 test set으로 분할한다.
  3. Train the Classifier
  4. Evaluate

(코드는 저작권 문제 상 기재하지 않음)

k-NN Results

k-NN으로 구현한 분류기를 학습시킨 결과 52%의 정확도를 얻어냈는데, 이는 학습을 하지 않은 분류기임을 감안했을 땐 나쁘지 않음 결과임을 알 수 있다. 세부적으로, 팬더는 79%, 개와 고양이는 각각 39%, 36%의 분류 정확도를 얻었는데 팬더는 주로 검은색과 흰색 털로 인해 확실히 구별이 되지만, 개와 고양이는 유사한 털의 음영을 갖고 있어 위와 같이 비교적 낮은 정확도를 얻어냈다.

Summary

k-NN 알고리즘의 주요 장점은 구현하고 이해하는 것이 매우 간단하다는 것이다. 또한 분류기를 훈련시키는데 전혀 시간이 걸리지 않았다. 이렇게 단순하고 직관적이라는 장점이 있지만, 아무 것도 학습하지 않는다는 치명적인 단점이 있고 알고리즘이 오류를 범했을 때 나중에는 정확히 분류할 수 있도록 스스로를 수정하고 개선할 수 있는 방법이 없다. 이러한 k-NN 알고리즘은 고차원에서 사용하기 어려울 뿐만 아니라 이론적으로도 사용하기 어렵다. 여기서 더 확장해 높은 정확도의 이미지 분류기를 구현해내야 한다.

profile
취업 준비 용으로 사용했던 기술 블로그입니다. 이제는 업로드 거의 안 할지도..

0개의 댓글