이미지 데이터 처리를 위한 CNN 완벽 가이드 - 가위바위보 데이터셋 분류 CNN 모델 구현

2022. 3. 14. 16:34·프로젝트/코드프레소 체험단

기존에는 numpy 형태로 이미 처리된 이미지 데이터를 사용했기 때문에, 파일 형태의 이미지 데이터을 분석하는 실무 적용에는 한계가 있었다. 이번 시간에는 ImageDataGenerator  API를 이용하여 이미지 파일을 load하여 전처리 작업 후 모델의 학습에 사용하는 실습을 진행한다.

 

 - CNN 모델을 이용하여 분류 분석 모델을 만든다.

 - 앞선 Cat&Dog 데이터 셋(2개의 클래스)과 다르게 3개의 클래스로 구성되어 있다.

 

 

가위바위보 데이터셋

 - 구글 AI 팀의 연구원 Laurence Moroney 이 딥러닝 교육용으로 수집한 데이터 셋

 - 3000여 장의 300x300 픽셀의 24bit 컬러로 구성되어 있는 데이터셋

 

 

 

import tensorflow as tf
from tensorflow import keras
import os

""" Step 1. Input tensor 와 Target tensor 준비(훈련데이터)
    Step 1-(1) 가위-바위-보 데이터셋 다운로드
"""

train_url = 'https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip'
test_url = 'https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip'

# 수강생 작성 코드
# 1. tensorflow.keras.utils 모듈의 get_file API를 이용하여 가위-바위-보 학습 데이터 셋 다운로드
keras.utils.get_file(fname='rps.zip', origin=train_url, extract=True, cache_dir='/content')

# 수강생 작성 코드
# 1. tensorflow.keras.utils 모듈의 get_file API를 이용하여 가위-바위-보 테스트 데이터 셋 다운로드
keras.utils.get_file(fname='rps-test-set.zip', origin=test_url, extract=True, cache_dir='/content')

""" Step 1-(2) ImageDataGenerator를 이용해 이미지 파일을 load 하기 위한 경로 지정"""

# 수강생 작성 코드
# 1. 저장된 학습, 테스트 데이터를 읽어 오기 위한 경로 정보 생성
#   - hint : os.path.dirname() 메서드를 이용하여 데이터 셋이 저장된 경로 추출
#     => /root/.keras/datasets/rps_test-set.zip => /root/.keras/datasets/
train_dir = os.path.dirname('/content/datasets/rps.zip')
test_dir = os.path.dirname('/content/datasets/rps-test-set.zip')

""" Step 1-(3) ImageDataGenerator 객체 생성  
    - 객체 생성 시 rescale 인자를 이용하여 텐서 내 원소의 범위를 [0 ~ 255] => [0 ~ 1] 로 ReScaling 진행
    - featue 이미지의 size를 (150, 150) 으로 resize 수행
    - label 데이터는 one-hot-encoding 수행
"""

# 수강생 작성 코드
# 1. ImageDataGenerator API 를 이용하여 학습 데이터와 테스트 데이터를 읽어오기 위한 객체 생성
#   - feature 데이터를 [0, 1] 사이로 scailing을 수행하세요
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

""" - flow_from_directory() 메서드를 이용하여 학습데이터와 검증데이터를 위한 DirectoryIterator 객체 생성 """

# 수강생 작성 코드
# 1. ImageDataGenerator 객체의 flow_from_directory 메서드를 이용하여 데이터를 읽어오기 위한 정보 설정
#   - featue 이미지의 size를 (150, 150) 으로 resize 수행하세요
#   - label 데이터는 one-hot-encoding 수행하세요
train_generator = train_datagen.flow_from_directory(directory=train_dir,
                                                    target_size=(150, 150),
                                                    batch_size=20,
                                                    shuffle=True,
                                                    class_mode='categorical')

test_generator = test_datagen.flow_from_directory(directory=test_dir,
                                                  target_size=(150, 150),
                                                  batch_size=20,
                                                  class_mode='categorical')
                                                  
""" Step 2. CNN 모델 디자인"""

# 수강생 작성 코드
# 1. Sequential API를 이용하여 가위-바위-보 데이터셋 을 분석 하기 위한 CNN 모델을 디자인 하세요
#   - label 데이터를 one-hot-encoding 한 것을 반영 하여 모델을 디자인 하세요
from tensorflow.keras import models, layers

model = models.Sequential()
model.add(layers.Conv2D(filters=32, kernel_size=(3, 3),
						activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3),
						activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=128, kernel_size=(3, 3),
						activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=128, kernel_size=(3, 3),
						activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))

model.add(layers.Flatten())

model.add(layers.Dense(units=512, activation='relu'))
model.add(layers.Dropout(0.3))
model.add(layers.Dense(units=2, activation='softmax'))

""" Step 3. 모델의 학습 정보 설정"""

# 수강생 작성 코드
# 1. tf.keras.Model 객체의 compile 메서드를 이용하여 학습을 위한 정보들을 설정하세요
#   - optimizer
#   - loss : label 데이터를 one-hot-encoding 한 것을 반영 하여 지정하세요
#   - metrics : 체점 기준인 accuracy 로 설정
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

""" Step 4. 모델에 데이터 generator 연결 후 학습"""

# 수강생 작성 코드
# 1. tf.keras.Model 객체의 fit 메서드를 이용하여 모델을 학습하세요
#   - fit 메서드의 verbose=2 로 설정 하세요
history = model.fit(train_generator,
                    steps_per_epoch=len(train_generator),
                    epochs=20, verbose=2,
                    validation_data=test_generator,
                    validation_steps=len(test_generator))
                    
import matplotlib.pyplot as plt

# 모델의 학습과정 시각화
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.show()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

 

 

'프로젝트 > 코드프레소 체험단' 카테고리의 다른 글

이미지 데이터 처리를 위한 CNN 완벽 가이드 - Transfer Learning  (0) 2022.03.14
이미지 데이터 처리를 위한 CNN 완벽 가이드 - DataAugmentation  (0) 2022.03.14
이미지 데이터 처리를 위한 CNN 완벽 가이드 - CNN 모델을 이용한 Cats & Dogs 분류 분석  (0) 2022.03.10
이미지 데이터 처리를 위한 CNN 완벽 가이드 - ImageDataGenerator API  (0) 2022.03.08
이미지 데이터 처리를 위한 CNN 완벽 가이드 - CIFAR-10-codepresso 분류 CNN 모델 구현  (0) 2022.03.07
'프로젝트/코드프레소 체험단' 카테고리의 다른 글
  • 이미지 데이터 처리를 위한 CNN 완벽 가이드 - Transfer Learning
  • 이미지 데이터 처리를 위한 CNN 완벽 가이드 - DataAugmentation
  • 이미지 데이터 처리를 위한 CNN 완벽 가이드 - CNN 모델을 이용한 Cats & Dogs 분류 분석
  • 이미지 데이터 처리를 위한 CNN 완벽 가이드 - ImageDataGenerator API
KimCookieYa
KimCookieYa
무엇이 나를 살아있게 만드는가
  • KimCookieYa
    쿠키의 주저리
    KimCookieYa
  • 전체
    오늘
    어제
    • 분류 전체보기 (576)
      • 혼잣말 (88)
      • TIL (3)
      • 커리어 (24)
        • Sendy (21)
        • 외부활동 기록 (2)
      • 프로젝트 (186)
        • 티스토리 API (5)
        • 코드프레소 체험단 (89)
        • Web3 (3)
        • Pint OS (16)
        • 나만무 (14)
        • 대회 (6)
        • 정글 FE 스터디 (16)
        • MailBadara (12)
        • github.io (1)
        • 인공지능 동아리, AID (5)
        • 졸업과제 (18)
        • OSSCA 2024 (1)
      • 크래프톤 정글 2기 (80)
      • IT (169)
        • 코딩 (4)
        • CS (18)
        • 에러 (5)
        • 블록체인 (23)
        • Front-End (40)
        • 알고리즘&자료구조 정리 (3)
        • 코딩테스트 (3)
        • BOJ 문제정리 (41)
        • WILT (12)
        • ML-Agents (4)
        • 강화학습 (1)
        • Android (0)
        • LLM (2)
      • 전공 (1)
        • 머신러닝 (1)
      • 자기계발 (20)
        • 빡공단X베어유 (2)
        • 독서 (15)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Velog
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    react
    핀토스
    RNN
    docker
    졸업과제
    사이드프로젝트
    자바스크립트
    알고리즘
    Pint OS
    NEAR Protocol
    코드프레소
    니어프로토콜
    프로그래머스
    센디
    블록체인
    리액트
    pintos
    Flutter
    나만무
    MailBadara
    딥러닝
    OS
    파이썬
    JavaScript
    부산대
    해커톤
    머신러닝
    크래프톤정글
    numpy
    글리치해커톤
  • hELLO· Designed By정상우.v4.10.3
KimCookieYa
이미지 데이터 처리를 위한 CNN 완벽 가이드 - 가위바위보 데이터셋 분류 CNN 모델 구현
상단으로

티스토리툴바