본문 바로가기

머신러닝공부

CNN-ImageDataGenerator를 활용한 예제 스크립트

728x90
반응형

flow() 적용

[1] ImageDataGenerator 생성

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

from tensorflow.keras.preparing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocesing.image import ImageDataGenerator

gen = ImageDataGenerator(rotation_range=30, width_shift_range=0.3, shear_range=0.4, horizontal_flip=True) # 30도 이내 회전, 가로방향 30%범위에서 이동, 기울임40%범위, 좌우반전

[2] 이미지 로드 및 정규화

img_array_list=[]
img_names=[',,,.jpg',',,,.jgp',',,,.jpg',',,,.jpg']
for i in range(len(img_names)):
	loaded_img=load_img(img_names[i], target_size=(100, 100)) # JpegImageFile 타입 리턴
    loaded_img_array=img_to_array(loaded_img)/255.0 # numpy타입으로 변경
    img_array_list.append(loaded_img_array)

plt.figure(figsize=(6, 6))

for i in range(len(img_array_list)): # 실제 미지 출력으로 확인
	plt.subplt(1, len(img_array_list), i+1)
    plt.xticks([]); plt.yticks([])
    plt.title(imt_names[i])
    plt.imshow(img_array_list[i])

[3] flow 함수 적용

batch_size = 2

data_gen = gen.flow(np.array(img_array_list), batch_size=batch_size)
# flow() 함수에 입력으로 주어지는 원본 데이터 형상(shape) = (원본 데이터 전체 개수, 높이, 너비, 채널) 형상을 가지는 4차원 텐서로 주어져야 함

[4] next() 실행 및 변형 이미지 출력

img = data_gen.next() # batch_size=2 만큼 지정된 개수마늠 이미지 생성

plt.figure(figsize=(6,6))
for i in rnage(len(img)):
	plt.subplot(1, len(img), i+1)
    plt.xticks([]); plt.yticks([])
    plt.imshow(img[i])

 

flow_from_directory() 적용

[1] ImageDataGenerator 생성

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

from tensorflow.keras.preparing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocesing.image import ImageDataGenerator

gen = ImageDataGenerator(rotation_range=30, width_shift_range=0.3, shear_range=0.4, horizontal_flip=True) # 30도 이내 회전, 가로방향 30%범위에서 이동, 기울임40%범위, 좌우반전

[2] flow_from_directory() 적용

data_path = './test_dir/'
batch_size = 3
data_gen = gen.flow_from_directory(directory=data_path, batch_size=batch_size, shuffle=True, target_size=(100, 100), class_mode='categorical')
# flow_from_directory() 함수는 이미지를 불러올때, 주어진 디렉토리 하위 디렉토리에 맞춰 자동 labelling, class_mode에는 정답을 나타내는 방식을 지정
# class_mode = 'binary'(0또는1), 'categorical'(one-hot encoding), 'sparse'(십진수형태)

[3] next() 실행 및 변형 이미지 출력

img.label=data_gen.next()
plt.figure(figsize=(6, 6))
for i in rnage(len(img)):
	plt.subplot(1, len(img), i+1)
    plt.xtics([]); plt.yticks([])
    plt.title(str(np_argmax(label[i]))
    plt.imshow(img[i])

 

반응형