1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
 
 
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
 
# x_train = x_train.reshape(-1, 32, 32, 3)
# x_test = x_test.reshape(-1, 32, 32, 3)
 
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0
 
 
def make_model():
    model = Sequential()
    model.add(Conv2D(input_shape=(32323), kernel_size=(33), filters=32, activation='relu'))
    model.add(Conv2D(kernel_size=(33), filters=64, activation='relu'))
    model.add(MaxPooling2D(pool_size=(22)))
    model.add(Dropout(0.2))
 
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(10, activation='softmax'))
 
    return model
 
 
model = make_model()
model.compile(loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])
 
history = model.fit(x_train, y_train, validation_split=0.2, batch_size=64, epochs=30)
 
model.evaluate(x_test, y_test)
 
 
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train''validation'], loc='best')
plt.show()
cs

 

위 소스코드를 실행시키면 아래와 같은 출력값을 확인할 수 있다. (테스트 데이터셋, accuracy 70% 내외)

 

이미지 제너레이터 사용 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
 
 
# Augmentation을 위해 2가지 함수 사용 가능 -> flow(), flow_from_directory()
# load_img() 함수는 리턴 타입이 jpeg 이므로 numpy 타입으로 변환해주기 위해, img_to_array() 사용
 
 
## flow() ##
 
img_list = []
img_name = ['./chipmonk_1.jpg''./chipmonk_2.jpg''./tiger_1.jpg''./tiger_2.jpg']
 
imageGenerator = ImageDataGenerator(rotation_range=30, width_shift_range=0.2, shear_range=0.3, horizontal_flip=True)
batch_size = 2
 
 
for i in range(len(img_name)):
    loaded_img = load_img(img_name[i], target_size=(100100))
    load_img_array = img_to_array(loaded_img)/255.0
    img_list.append(load_img_array)
 
 
plt.figure(figsize=(66))
 
for i in range((len(img_list))):
    plt.subplot(1len(img_list), i+1)
    plt.xticks([])
    plt.yticks([])
    plt.title(img_name[i])
    plt.imshow(img_list[i])
 
plt.show()
 
 
data_gen = imageGenerator.flow(np.array(img_list), batch_size=batch_size)
# np.array(img_list) : (100, 100, 3) -> (-1, 100, 100, 3) 4차원 텐서로 변환해주기 위해서
 
gen_image = data_gen.next() # batch_size=2 개수만큼 이미지 생성
 
plt.figure(figsize=(66))
 
for i in range((len(gen_image))):
    plt.subplot(1len(gen_image), i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(gen_image[i])
 
plt.show()
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
 
 
# Augmentation을 위해 2가지 함수 사용 가능 -> flow(), flow_from_directory()
 
 
## flow_from_directory() ##
 
 
imageGenerator = ImageDataGenerator(rotation_range=30, width_shift_range=0.2, shear_range=0.3,
                                    horizontal_flip=True, rescale=1./255)
batch_size = 2
image_path = './dataset/'
 
 
# class_mode : binary, categorical, sparse
data_gen = imageGenerator.flow_from_directory(directory=image_path, batch_size=batch_size,
                                            shuffle=True, target_size=(100100), class_mode='categorical')
 
gen_image, label = data_gen.next()
 
plt.figure(figsize=(66))
 
for i in range((len(gen_image))):
    plt.subplot(1len(gen_image), i+1)
    plt.xticks([])
    plt.yticks([])
    plt.title(str(np.argmax(label[i])))
    plt.imshow(gen_image[i])
 
plt.show()
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
 
 
# 데이터셋 생성
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
 
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0
 
image_gen = ImageDataGenerator(rotation_range=30, shear_range=0.3, width_shift_range=0.3,
                               height_shift_range=0.3, horizontal_flip=True)
 
augment_size = int(1.2 * x_train.shape[0])  # 50000 * 1.2 = 60000
random_idx = np.random.randint(x_train.shape[0], size=augment_size)
 
x_gen = x_train[random_idx].copy()  # 원본 데이터 복사
y_gen = y_train[random_idx].copy()
 
x_gen, y_gen = image_gen.flow(x_gen, y_gen, batch_size=augment_size, shuffle=False).next()
 
x_train = np.concatenate((x_train, x_gen))  # 원본이미지에 생성된 이미지 합치기
y_train = np.concatenate((y_train, y_gen))
 
index_list = np.arange(x_train.shape[0])  # 데이터를 랜덤하게 섞음
np.random.shuffle(index_list)
 
x_train = x_train[index_list]
y_train = y_train[index_list]
 
 
# 모델 생성
def make_model():
    model = Sequential()
    model.add(Conv2D(input_shape=(32323), kernel_size=(33), padding='same', filters=32, activation='relu'))
    model.add(Conv2D(kernel_size=(33), padding='same', filters=32, activation='relu'))
    model.add(MaxPooling2D(pool_size=(22)))
    model.add(Dropout(0.2))
 
    model.add(Conv2D(kernel_size=(33), padding='same', filters=64, activation='relu'))
    model.add(Conv2D(kernel_size=(33), padding='same', filters=64, activation='relu'))
    model.add(MaxPooling2D(pool_size=(22)))
    model.add(Dropout(0.2))
 
    model.add(Conv2D(kernel_size=(33), padding='same', filters=128, activation='relu'))
    model.add(Conv2D(kernel_size=(33), padding='same', filters=128, activation='relu'))
    model.add(MaxPooling2D(pool_size=(22)))
    model.add(Dropout(0.2))
 
    model.add(Flatten())
 
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(10, activation='softmax'))
 
    return model
 
 
model = make_model()
model.compile(loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])
 
history = model.fit(x_train, y_train, validation_split=0.2, batch_size=128, epochs=200)
 
model.evaluate(x_test, y_test)
 
 
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train''validation'], loc='best')
plt.show()
 
cs

 

이미지 제너레이터 사용 전 : 정확도 70% 내외

이미지 제너레이터 사용 후 : 정확도 80 % 초반

 

 

반응형

+ Recent posts