개발공부

JPG나 PNG와 같은 이미지 파일을 학습 데이터로 만드는 방법 본문

Python/Deep Learning

JPG나 PNG와 같은 이미지 파일을 학습 데이터로 만드는 방법

mscha 2022. 6. 15. 11:51

아래와 같이 tmp 폴더의 horse-or-human, validation-horse-or-human 폴더에는 horses와 humans, 두 개씩의 폴더가 있고 그안에는 각각 말과 사람의 이미지가 들어있다.

이런식으로 분류되어 있는 폴더의 이미지들을 학습데이터화 해주는 텐서플로우의 라이브러리가 존재한다.

그 코드는 아래와 같다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 이미지를 0 - 1 사이의 값으로 피처스케일링 한다.
train_datagen = ImageDataGenerator(rescale= 1/255.0)
validation_datagen = ImageDataGenerator(rescale= 1/255.0)

# 변수로 만들어 줬으면, 그다음 할 일은,
# 이미지가 들어있는 디렉토리의 정보, 이미지 사이즈 정보, 분류할 개수 정보를 알려줘야 한다.
# target_size : image 크기, 원본 크기가 다르더라도 target_size에 지정된 크기로 자동 조절 됩니다
# target_size 와 model의 input_shape 은 가로, 세로가 같아야 한다.
# 2개 분류		  class_mode = 'binary
# 3개 이상 분류	class_mode = 'categorical'
train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human', 
					target_size = (300, 300), class_mode= 'binary')
                    
validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human', 
						target_size = (300, 300), class_mode = 'binary')

아래는 모델의 학습에 적용을 시키는 예제이다.

import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPool2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import RMSprop
def build_model() :
    model = Sequential([
                        Conv2D(filters = 16, kernel_size = (3,3), 
                        		activation = 'relu', 
                                input_shape = (300,300,3)),
                        MaxPool2D((2, 2),2),
                        Conv2D(32, (3,3), activation = 'relu'),
                        MaxPool2D(2,2),
                        Conv2D(64, (3,3), activation = 'relu' ),
                        MaxPool2D(2,2),
                        Flatten(),
                        Dense(512, activation = 'relu'),
                        Dense(1, activation = 'sigmoid')
    ])
    return model

model = build_model()

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=0.001),
              metrics=['accuracy'])
# train_generator 는 X와 y의 값을 모두 가지고 있어서
# X, y 대신 train_generator만 적으면 된다.              
epoch_history = model.fit(train_generator, epochs = 15, 
				validation_data = (validation_generator))

# validation_generator 는 X와 y의 값을 모두 가지고 있어서
# X, y 대신 validation_generator만 적으면 된다.    
model.evaluate(validation_generator)