AIFFEL EP #01 Image Classification

이재준·2021년 7월 21일

AIFFEL Exploration

목록 보기
1/4
post-thumbnail

✅ 핵심내용

  • MNIST 숫자 손글씨 이미지 분류
  • 가위바위보 이미지 분류

MNIST 숫자 손글씨 이미지 분류

Tensorflow 의 표준 API 인 tf.keras 의 Sequential API 를 이용하여 숫자 손글씨 분류기를 만들어보자.

전체 과정은 다음과 같은 순서 진행되었다.

  • 1. MNIST 데이터 불러오기
    • tensorflow.keras.datasets.mnist 를 통해 MNIST 숫자 손글씨 이미지 분류
    • 60000개의 training set, 10000개의 test set 으로 이루어져있음
  • 2. 데이터 전처리
    • 0~255 사이 값으로 이루어진 픽셀 값을 0~1 사이 값으로 정규화시킴
  • 3. 딥러닝 네트워크 설계

    • Sequential API 를 이용하여 딥러닝 모델 만들기

      keras.layers.Flatten() 층은 2차원의 이미지 데이터 배열을 일렬로 변환하는 층이다.
      activation 함수 relusoftmax 에 대하여 정리할 예정이다.

      만든 딥러닝 네트워크의 정보는 다음과 같다.

  • 4. 딥러닝 네트워크 학습

    • 학습 과정 (epoch 는 10으로 지정했다.)
  • 5. 성능 평가

    • test set 에서의 정확도

  • 6. 더 좋은 네트워크 만들기

    • 하이퍼파라미터 들을 바꾸어보는면서 모델의 더 높은 정확도를 이끌어낼 수 있을 것이다.

자세한 과정은 아래의 Github Link 를 통해 볼 수 있다.

Github Link ➡ EP01_MNIST


가위바위보 분류기

Tensorflow 의 표준 API 인 tf.keras 의 Sequential API 를 이용하여 가위바위보 분류기를 만들어보자.

첫번째 시도

전체 과정은 다음과 같은 순서 진행되었다.

  • 1. 데이터 준비

    • 가위바위보 사진은 구글의 teachable machine 사이트 를 이용하여 가위,바위,보 각각 100장 씩 만들어 총 300장의 이미지을 준비
    • 가위바위보 이미지을 MNIST 손글씨 이미지와 동일한 사이즈인 28x28 사이즈로 resize
    • 라벨링시 (가위 : 0), (바위 : 1), (보 : 2) 로 라벨링
  • 2. 딥러닝 네트워크 설계

    • f.keras 의 Sequential API 를 이용하여 LeNet 이라는 딥러닝 네트워크를 설계
      만든 딥러닝 네트워크의 정보는 다음과 같다.
  • 3. 모델 학습

    • epoch 값은 10으로 지정하여 모델을 학습시켰다.
  • 4. 모델 성능 평가

    • test set 으로 성능 평가를 한 결과 약 33.3% 의 정확도가 나온다.

결과적으로 33.3% 의 정확도를 가지는 모델이 만들었다.
가위, 바위, 보 세 개의 카테고리 중 무작위로 하나를 골라도 정답일 확률이 33.3% 이므로 굉장히 안좋은 성능을 가지는 모델이라고 할 수 있다.

사실 있으나 마나 한 성능이라고 볼 수 있다.

모델이 이렇게 낮은 성능을 보이는 이유를 다음과 같이 예상하였다.

  • training set 개수의 부족
  • training set 과 test set 은 서로 다른 사람이 다른 공간에서 찍은 이미지이므로 배경, 밝기, 자세 등이 매우 다름
  • 이미지 데이터의 크기를 224x224 -> 28x28 로 변경하면서 생긴 해상도 저하
  • 최적의 하이퍼파라미터 값을 못찾음

두번째 시도

위에서 얻은 성능이 낮은 원인들을 보완하여 두번째 시도를 하였다.

이전 모델에서 보완한 점은 다음과 같다.

  • 이미지 데이터 resize 를 (224x224 -> 28x28) 에서 (224x224 -> 112x112) 로 변경
  • 더 많은 데이터 셋 확보 (여러 사람의 데이터를 가져옴)
  • 가져온 데이터 셋을 training set, validation set, test set 을 무작위로 섞어 training set, validation set 으로 모델을 학습 시킨 후 test set으로 최종 모델 성능 평가

두번째 시도는 다음과 같은 순서로 이루어졌다.

  • 1. 데이터 준비

    • 원래의 데이터와 많은 사람들의 데이터들을 가위, 바위, 보 각각 1527개 씩 모아 총 4581 개의 이미지 데이터를 준비
    • 224x224 크기의 이미지 데이터를 112x112 크기로 resize
    • 전체 데이터를 training set, validation set, test set 으로 나누었다.

      Train set, Validation set, Test set 을 통해 최적의 hyperparameter 찾기

      해당 데이터에 대한 overfitting 문제를 방지하고 한번도 보지못한 새로운 데이터에 대해 분류를 잘하기 위해서
      trainning set, validation set, test set 으로 나누는 방법__을 사용한다.

      trainning set, validation set을 통해 hyperparmeter 에 대해 실험해보고 마지막으로 새로운 데이터인 test set을 통해 평가하는 방법이다.

  • 2. 딥러닝 네트워크 설계

    • 이전 시도와 동일한 방법으로 딥러닝 네트워크를 설계
    • tf.keras 의 Sequential API 를 이용하여 LeNet 이라는 딥러닝 네트워크를 설계
  • 3. 모델 학습

  • 4. Validation set 을 이용한 모델 성능 평가

    • Validation set 을 이용한 모델 성능 평가를 실행하여 train set 에 대한 과적합(overfitting) 문제를 막고, 여러 하이퍼파라미터에 대해 조정
    • 지금의 경우는, 간단하게 epochs 값만 조정
  • 5. Test set 을 이용한 최종 모델 성능 평가

    • 최종적으로 test set 를 이용하여 모델 성능 평가

    최종적으로 모델의 성능은 약 98.47% 의 정확도를 보인다.

자세한 과정은 아래의 Github Link 를 통해 볼 수 있다.

Github Link ➡ EP01_Rock-Paper-Scissors


프로젝트 정리

간단한 딥러닝 네트워크를 통해 가위, 바위 보를 분류하는 모델을 만들보았다.

첫 시도에는 내가 찍은 가위바위보 사진 300장을 training set 으로 사용하여 모델을 학습시켰다.
이후 다른 사람이 찍은 가위바위보 사진 300장을 test set 으로 사용하여 모델의 성능을 평가하였다.

그 결과 모델의 정확도는 33.3% 가 나왔다. 세 가지 분류 중 무작위로 골라도 정답일 확률이 33.3% 이므로 아무 의미가 없는 모델을 만든 것이다.

그러한 결과가 나온 원인를 다음과 같이 정리하였다.

  • training set 개수의 부족
  • training set 과 test set 은 서로 다른 사람이 다른 공간에서 찍은 이미지이므로 배경, 밝기, 자세 등이 매우 다름
  • 이미지 데이터의 크기를 224x224 -> 28x28 로 변경하면서 생긴 해상도 저하
  • 최적의 하이퍼파라미터 값을 못찾음

이것을 바탕으로 위의 원인들을 해결하는 해결책을 다음과 같이 정하여 두번째 모델을 만들었다.

  • 이미지 데이터 resize 를 (224x224 -> 28x28) 에서 (224x224 -> 112x112) 로 변경
  • 더 많은 데이터 셋 확보 (여러 사람의 데이터를 가져옴)
  • 가져온 데이터 셋을 training set, validation set, test set 을 무작위로 섞어 training set, validation set 으로 모델을 학습 시킨 후 test set으로 최종 모델 성능 평가
  • validation set 을 통해 최적의 하이퍼파라미터 찾음

그 결과 98.47% 의 정확도를 가지는 모델을 만들어낼수 있었다.

이후 더 높은 성능의 모델을 구현하려면

  • 더 많고 다양한 데이터들을 수집
  • 적절한 hyperparameter, hidden layer 결정

등의 방법을 통해 정확도를 향상시킬 수 있을 것으로 예상한다.

profile
🏫 𝑲𝒚𝒖𝒏𝒈 𝑯𝒆𝒆 𝑼𝒏𝒊𝒗. / 👨‍🎓 𝑪𝒐𝒍𝒍𝒆𝒈𝒆 𝒐𝒇 𝑬𝒏𝒈𝒊𝒏𝒆𝒆𝒓𝒊𝒏𝒈

0개의 댓글