본문 바로가기

Deep Learning/Tensorflow

Tensorflow - 이미지 파일을 학습데이터로 만드는 방법

반응형
ImageDataGenerator

 

 

 

모델링

 

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

def build_model() :
  model = Sequential()
  # CNN
  # input_shape은 이미지의 해상도가 다 다르기 때문에 고정시켜 줘야 한다.
  model.add( Conv2D( filters = 16, kernel_size = (3, 3), activation='relu', input_shape = (300, 300, 3) ) ) # 첫 레이어는 input_shape이 들어가야 함
  model.add( MaxPooling2D( pool_size = (2,2), strides = 2 ) ) # pool_size = 2행 2열 중 가장 큰 숫자로 다운사이징 하겠다. strides 는 2칸씩 이동하겠다.
  model.add( Conv2D( filters = 32, kernel_size = (3, 3), activation='relu') )
  model.add( MaxPooling2D( pool_size = (2,2), strides = 2 ) ) 
  model.add( Conv2D( filters = 64, kernel_size = (3, 3), activation='relu') )
  model.add( MaxPooling2D( pool_size = (2,2), strides = 2 ) )
  # ANN
  model.add( Flatten() )
  model.add( Dense(units = 512, activation = 'relu') )
  model.add( Dense(units = 1, activation = 'sigmoid') )
  return model
  
model = build_model()

 

 

 

 

 

컴파일

 

from tensorflow.keras.optimizers import RMSprop

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=0.001),
              metrics=['accuracy'])

 

 

 

 

 

Data Preprocessing

 

 

ImageDataGenerator를 이용해 학습

 

# model.fit()안에는 X_train과 y_train이 들어가야하는 데 numpy array가 들어가야 한다.
# 현재 우리는 png파일만 준비가 되어있다.
# 따라서 이미지파일을 넘파이로 바꿔주는 라이브러리를, 텐서플로우가 제공해준다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# ImageDataGenerator 사용법

# ImageDataGenerator라이브러리를 training용과 validation용 변수로 만든다.
# 파라미터는 (rescale = 1 / 255.0 이미지파일을 가져올때 이미지는 0부터 255까지니깐 255로 나눠서 가져와라 라는 뜻)

# 학습용
train_datagen = ImageDataGenerator( rescale = 1 / 255.0 )

# validation 용
validation_datagen = ImageDataGenerator( rescale = 1 / 255.0 )

# 변수로 만들어 줬으면, 그 다음 할 일은,
# 이미지가 들어있는 디렉토리의 정보, 이미지 사이즈의 정보, 분류할 갯수의 정보를 알려줘야 한다.
# target_size는 input_shape과 같아야 한다. 다만, input_shape은 컬러이기때문에 300,300,3이라고 기재했지만 target_size는 자동으로 컬러로 인식하기때문에 300,300까지만 기재하면 된다.
# class_mode = 기본적으로 Categorical로 되어있는데 이는 3개 이상 분류한다는 의미이다. 2개일땐 binary 이므로 데이터에 맞게 적용해 준다.

train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human', target_size = (300,300), class_mode = 'binary' )

# 위의 train_generator는, numpy array와, 해당이미지의 정답지도 가지고 있는 변수이다.
# 즉, X_train과 y_train을 모두 한꺼번에 가지고 있다.

# validation data도 똑같이 만들어 준다.
# 즉, X_val과 y_val을 만들어 준다.
validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human', target_size = (300,300), class_mode = 'binary' )

 

 

# train_generator는  X_train과 y_train을 모두 한꺼번에 가지고 있기때문에 train_generator 하나만 써주면 된다.
# validation_generator 도 X_test, y_test를 모두 한꺼번에 가지고 있기 때문에 validation_generator 하나만 써주면 된다.
epoch_history = model.fit( train_generator, epochs = 20, validation_data = (validation_generator) )

 

# 모델 평가
# 학습 정확도와 밸리데이션 정확도 차트로 그리기

model.evaluate(validation_generator)

 

 

plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.legend(['train', 'validation'])
plt.show()

 

 

반응형