Tensorflow DATA Augmentation(이미지 증식)

텐서플로우로 이미지 증식하기(데이터 뻥튀기)

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from zipfile import ZipFile
from keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator

### 이미지 증식 전 분류하기
#zip 해제하기
directory = './'
with ZipFile('TeamA_name2.zip') as f :
x = [f.extract(file, directory) for file in f.namelist() if file.endswith('jpg')] #jpg파일만 압축 해제

# 이미지 가져오기
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(directory='./TeamA_name2/train', target_size = (24,24),
batch_size = 3, class_mode = 'categorical')
# "binary" : 1D numpy array of binary labels .
# "categorical" : 2D numpy array of one-hot encoded labels. Supports multi-label output.
# "sparse" : 1D numpy array of integer labels.
test_datagen = ImageDataGenerator(rescale =1./255)
test_generator = test_datagen.flow_from_directory(directory='./TeamA_name2/test', target_size = (24,24),
batch_size = 3, class_mode = 'categorical')

#모델 세팅
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(24,24,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(optimizer='adam', loss = 'categorical_crossentropy', metrics =['accuracy'])
model.fit(
train_generator,
steps_per_epoch=15,
epochs=30,
validation_data=test_generator,
validation_steps=5)
scores = model.evaluate(test_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))
# 100%


########## 이미지 증식하여 시도
#이미지 증식
train_datagen = ImageDataGenerator(
rescale=1./255, # rescale, fill_mode를 제외한 변수는 설정한 n값에 대해 -n ~ +n의 랜덤값을 가집니다
rotation_range=10, # 회전 범위 -10~10
width_shift_range=0.2, # 가로 방향으로 이미지 이동
height_shift_range=0.2, # 세로 방향으로 이미지 이동
shear_range=0.7, # 찌그러짐(이미지 밀림)
zoom_range=[0.9, 2.2], # 확대 범위
horizontal_flip=True, # 가로 반전
vertical_flip=True, # 세로 반전
brightness_range=(0.1, 0.9), # 이미지 밝기
fill_mode='nearest') # 이미지를 회전, 이동하거나 축소할 때 생기는 공간을 채우는 방식
# fill_mode 에는 아래 4종류가 있으며 nearest를 가장 많이 사용
# 'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k)
# 'nearest': aaaaaaaa|abcd|dddddddd
# 'reflect': abcddcba|abcd|dcbaabcd
# 'wrap': abcdabcd|abcd|abcdabcd

#이미지 불러오기
train2_generator = train_datagen.flow_from_directory(
'./TeamA_name2/train',
target_size=(24, 24),
batch_size=3,
class_mode='categorical') #2배로 증식되었으나 메시지로는 안나옴
test2_datagen = ImageDataGenerator(rescale=1./255.)
test2_generator=test2_datagen.flow_from_directory('./TeamA_name2/test',
target_size=(24,24),
batch_size=3,
class_mode='categorical')

#모델은 기존의 모델과 동일
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(24,24,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(optimizer='adam', loss = 'categorical_crossentropy', metrics =['accuracy'])

#학습(기존과 동일)
model.fit(
train2_generator,
steps_per_epoch=15,
epochs=30,
validation_data=test2_generator,
validation_steps=5)

scores = model.evaluate(test2_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))
# 66%나옴. 이미지 증식도 알맞게 세팅을 해야할 것 같다.



### 따로 이미지 1장으로 평가하고 싶을 경우
from tensorflow.keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

# 파일 불러오기
def load_image(filename):
img = load_img(filename, target_size=(24, 24))
img = img_to_array(img)
img = img.reshape(1, 24, 24, 3)
img = img.astype('float32')
return img

# 평가 예측 함수
def run_example():
img = load_image('file_name.png') #파일 이름 입력
result=model.predict(img)
ans = [k for k, v in test_generator.class_indices.items() if v == np.argmax(result[0])][0]
print(f'{max(result[0])*100}% 확률로 "{ans}"가 작성한 signature 입니다.')

run_example()
Author

InhwanCho

Posted on

2022-12-15

Updated on

2022-12-15

Licensed under

Comments