Load Image From Directory

บทความโดย อ.ดร.ณัฐโชติ พรหมฤทธิ์
ภาควิชาคอมพิวเตอร์
คณะวิทยาศาสตร์
มหาวิทยาลัยศิลปากร

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator

from sklearn.metrics import classification_report

import plotly
import plotly.graph_objs as go

import numpy as np
batch_size = 2
num_classes = 2
epochs = 10

img_rows, img_cols = 28, 28
input_shape = (img_rows, img_cols, 1)
datagen = ImageDataGenerator(rescale=1.0/255.0)
# color_mode='rgb'
# color_mode='grayscale'

train_it = datagen.flow_from_directory('data/train/', target_size=(28, 28), batch_size=batch_size, class_mode='categorical', shuffle=True, color_mode='grayscale')
val_it = datagen.flow_from_directory('data/validation/', target_size=(28, 28), batch_size=batch_size, class_mode='categorical', shuffle=True, color_mode='grayscale')
batchX, batchy = train_it.next()
batchy
print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max()))
#Feature Extraction
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Dropout(0.25))

#Image Classification
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(num_classes, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

model.summary()
STEP_SIZE_TRAIN=train_it.n//train_it.batch_size
STEP_SIZE_VALID=val_it.n//val_it.batch_size
his = model.fit(train_it,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=val_it,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=epochs
)
h1 = go.Scatter(y=his.history['loss'], 
                    mode="lines", line=dict(
                    width=2,
                    color='blue'),
                    name="loss"
                   )
h2 = go.Scatter(y=his.history['val_loss'], 
                    mode="lines", line=dict(
                    width=2,
                    color='red'),
                    name="val_loss"
                   )
                   
data = [h1,h2]
layout1 = go.Layout(title='Loss',
                   xaxis=dict(title='epochs'),
                   yaxis=dict(title=''))
fig1 = go.Figure(data, layout=layout1)
plotly.offline.iplot(fig1, filename="Classification")
predicted_classes = model.predict(val_it, steps=STEP_SIZE_VALID)
predicted_classes
predicted_classes = np.argmax(predicted_classes,axis=-1)
predicted_classes
true_classes = val_it.classes
true_classes
class_labels = list(val_it.class_indices.keys())  
class_labels
report = classification_report(true_classes, predicted_classes, target_names=class_labels, digits=4)
print(report)