개발/머신러닝

파이썬 머신러닝 - CNN 러닝 , 이미지압축풀기 , 이미지 증강, 이미지(jpg,png등)를 변환하기

웅'jk 2022. 12. 30. 17:54

이번에는 직접 CNN을 해보겠습니다.

 

1. 연습용 이미지 파일 다운로드

!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip

2. 이미지 압축 풀기

import zipfile

# 코랩에 tmp 경로에 파일을 읽어옵니다.
file = zipfile.ZipFile('/tmp/cats_and_dogs_filtered.zip')

# tmp 경로에 압축해제합니다.
file.extractall('/tmp')

3. cnn 모델링을 만듭니다

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Conv2D , MaxPooling2D , Flatten , Dense

def build_model() :
  model = Sequential()
  # 필터는 16개의 3x3 으로 진행, 이미지는 150 x 150 으로 받겠습니다.
  model.add(Conv2D(filters=16 , kernel_size=(3,3) , activation = 'relu' , input_shape = (150,150,3)  )  )
  # pooling 은 max 로 진행되며 2x2의 사이즈로 진행합니다.
  model.add(MaxPooling2D((2,2),2))
  model.add( Conv2D(32,(3,3),activation='relu') )
  model.add(MaxPooling2D((2,2),2))
  model.add( Conv2D(64,(3,3),activation='relu') )
  model.add(MaxPooling2D((2,2),2))
  
  # ANN 과정 
  model.add(Flatten())
  model.add(Dense(units = 512, activation = 'relu'))
  model.add(Dense(units=1 , activation = 'sigmoid'))

  model.compile(optimizer = 'rmsprop',loss='binary_crossentropy',metrics=['accuracy'])

  return model

 

4. 이미지를 증강하여 가져와 학습.

 - 이미지 증강이란 학습할 데이터의 부족으로 내가 가진 데이터들의 특성을 아주 약간씩 변형시켜서 학습에 이용하도록 하는 방법입니다. 우리가 눈에 볼때는 같은 사진이지만 사진의 방향을 바꾸거나 확대하여 데이터를 늘리게 됩니다.

 

from keras.preprocessing.image import ImageDataGenerator
# 이미지( jpg , png 등등 ) 를 학습할 수 있게 하기위해 변환

# 이미지의 좌표
base_dir = '/tmp/cats_and_dogs_filtered'
train_dir = '/tmp/cats_and_dogs_filtered/train'
test_dir = '/tmp/cats_and_dogs_filtered/validation'

# 이미지 변환 제네레이터
# - train 은 증강을 위한 width , rotation , height , shear 등이 있습니다.
train_datagen = ImageDataGenerator(rescale = 1/255.0, rotation_range = 30,
                                   width_shift_range= 0.4,
                                   height_shift_range= 0.2,
                                   shear_range= 0.3,
                                   zoom_range=0.5, 
                                   horizontal_flip=True )

test_datagen = ImageDataGenerator(rescale = 1/255.0 )

# 디렉토리에 있는 이미지를 가져온다.                                  
train_generator = train_datagen.flow_from_directory(train_dir , target_size = (150,150), class_mode = 'binary' ,batch_size = 20 )
test_generator = test_datagen.flow_from_directory(test_dir , target_size = (150,150), class_mode = 'binary' ,batch_size = 20 )

# 학습
epoch_history = model.fit(train_generator , epochs=15 , validation_data = (test_generator) , steps_per_epoch=100 )