fruit Image Classification
“ Classification ” คืออะไร ?
Classification เป็น Model ประเภทต้องมีข้อมูลให้เรียนรู้และจะจำแนกออกมาเป็น กลุ่ม หรือ Class
ซึ่ง Image Classification ก็คือการนำรูปภาพไปให้คอมพิวเตอร์เรียนรู้แล้วจำแนกออกมาเป็น Class
เหมือนกับเรายื่นรูปแอปเปิ้ลให้คอมพิวเตอร์ของเรา จนคอมพิวเตอร์สามารถรู้แล้วว่าภาพนี้คือแอปเปิ้ล
โดยใช้กระบวนการที่เรียกว่า “CNN” ( Convolutional Neural Networks)
CNN จะช่วยนำภาพไปผ่าน Layer ซึ่งภายใน Layer นั้นจะมีอัลกอลิทึมต่างๆช่วยในการจำแนก
หลังจากที่อธิบาย Image Classification คร่าวๆแแล้ว มาเริ่มการทำ Image Classification กันเลย
เราทำใน Colab ซึ่งเป็น aas ของ Google นั่นเอง ใช้ฟรีผ่าน Web Browser
เตรียมข้อมูล
เราเก็บรูปไว้ใน Drive มีผลไม้ทั้งหมด 4 ชนิด ได้แก่ แอปเปิ้ล กล้วย องุ่น ส้ม เก็บรูปขั้นต่ำชนิดละ 30 รูป
เมื่อเราเตรียมรูปภาพเรียบร้อยแล้ว เปิด Colab ขึ้นมา
เริ่มต้นด้วยเช็คกันก่อนว่า GPU พร้อมใช้งานหรือเปล่า ด้วยคำสั่ง
!nvidia-smi -L
improt Libary
Import Libary ต่างๆ ที่จำเป็นเข้ามา
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import plotly
import plotly.graph_objs as go
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import load_model
from tensorflow.keras.models import model_from_json
from tensorflow.keras import layers
import pickle as p
เชื่อมกับ Drive เพื่อให้สามารถเรียกใช้งานรูปภาพที่เราโหลดมาได้
from google.colab import drive
drive.mount(‘/content/drive’)
เมื่อเรากดเข้ามาแล้วจะมีให้เลือกบัญชีที่เราต้องการเชื่อมกับ Drive เมื่อกดอนุญาตให้เข้าถึงแล้ว
จะให้ Link มาในลักษณะนี้ copy แล้วใส่ในช่อง Enter your authorization code ได้เลย
Dataset Preparation
รูปที่เรานำมามีขนาดแตกต่างกัน เราต้องกำหนดให้ขนาดรูปเท่ากันก่อนไปทำการ Training ดังนี้
batch_size = 16
img_rows = 150
img_cols = 150
dataset_dir = (“/content/drive/My Drive/data_train”)
batch_size คือ ค่าที่กำหนดขนาดของการอ่านข้อมูล
img_rows คือ ความสูงของรูปภาพ
img_cols คือ ความกว้างของรูปภาพ
dataset_dir คือ คือที่อยู่ Dataset ของเราที่อยู่ใน Drive
แบ่งข้อมูล training และ ข้อมูล validate
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
dataset_dir,
validation_split=0.2,
subset=”training”,
seed=123,
image_size=(img_rows, img_cols),
batch_size=batch_size)val_ds = tf.keras.preprocessing.image_dataset_from_directory(
dataset_dir,
validation_split=0.2,
subset=”validation”,
seed=123,
image_size=(img_rows,img_cols),
batch_size=batch_size)
หากเราอยากตรวจสอบว่ามี Class อะไรบ้าง
class_names = train_ds.class_names
print(class_names)
แสดงข้อมูลพร้อมชื่อ Class ขนาดรูป 10 * 10 มา 9 รูปเพื่อง่ายต่อการดู
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
plt.imshow(images[i].numpy().astype(“uint8”))
plt.title(class_names[labels[i]])
plt.axis(“off”)
เช็คว่ารูปภาพตรงกับขนาดที่เราตั้งไว้หรือไม่
for image_batch, labels_batch in train_ds:
print(image_batch.shape)
print(labels_batch.shape)
break
สร้าง Model
num_classes คือ จำนวน Class ในที่นี้ของเราก็คือ [‘apple’, ‘banana’, ‘grape’, ‘orange’]
epochs คือ จำนวนรอบที่ต้องการให้ Train model
num_classes = 4
epochs=20model = Sequential([
layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_rows, img_cols, 3)),
layers.Conv2D(16, 3, padding=’same’, activation=’relu’),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding=’same’, activation=’relu’),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, padding=’same’, activation=’relu’),
layers.MaxPooling2D(),layers.Flatten(),layers.Dense(128,
activation=’relu’),layers.Dense(num_classes)])
ให้แสดงค่าความแม่นยำ
model.compile(optimizer=’adam’,
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True,metrics=[‘accuracy’])
model.summary()
Train Model
epochs ของเรากำหนดไว้คือ 20 เราจะให้ model train 20 รอบ
history = model.fit(train_ds,validation_data=val_ds,epochs=epochs)
Save Model
ช่วยให้ เก็บรูปแบบ Model โดยที่เราไม่ต้องเสียเวลา Train model ใหม่ทุกครั้ง
with open(‘history_model’, ‘wb’) as file:
p.dump(history.history, file)
filepath=’model1.h5'
model.save(filepath)
filepath_model = ‘model1.json’
filepath_weights = ‘weights_model.h5’
model_json = model.to_json()
with open(filepath_model, “w”) as json_file:
json_file.write(model_json)
model.save_weights(‘weights_model.h5’)
print(“Saved model to disk !”)
Load Model
เรียก Model ที่เรา Save มา
with open(‘history_model’, ‘rb’) as file:
his = p.load(file)
filepath=’model1.h5'
filepath_model = ‘model1.json’
filepath_weights = ‘weights_model.h5’
h1 = go.Scatter(y=his[‘loss’],
mode=”lines”, line=dict(width=2,color=’blue’),name=”loss”)
h2 = go.Scatter(y=his[‘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=”testfruit”)
predict_model = load_model(filepath)
predict_model.summary()
with open(filepath_model, ‘r’) as f:
loaded_model_json = f.read()
predict_model = model_from_json(loaded_model_json)
predict_model.load_weights(filepath_weights)
print(“Loaded model from disk”)
Predict
พยากรณ์ภาพ มาดูกันว่า Model ของเราจะคิดว่าภาพนี้ที่เราทดสอบเป็นผลไม้ชนิดใด
ด้วยคำสั่ง
import requests
from IPython.display import Image
from io import BytesIO
test_path = (“/content/drive/My Drive/data_test/testapple1.jpg”)
img = keras.preprocessing.image.load_img(test_path, target_size=(img_height, img_width))
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batchpredictions = predict_model.predict(img_array)
score = tf.nn.softmax(predictions[0])print(“apple = “,score[0],”\nbanana = “,score[1],”\ngrape = “,score[2],”\norange = “,score[3])
display(Image(filename=test_path,width=200, height=200))print(“คาดว่าเป็น {} {:.2f}%”.format((class_names[np.argmax(score)]), 100 * np.max(score)))
test_path = (“/content/drive/My Drive/data_test/testapple1.jpg”) คือที่อยู่ของรูปภาพใน Drive ของเราที่จะนำมา Predict
คือยู่ในโฟลเดอร์ชื่อ data_test ชื่อไฟล์รูปคือ testapple1.jpg
และผลลัพธ์คือ !!!!!
Model คาดว่าเป็น Apple 99.58%
ขอจบเพียงเท่านี้ ขอบคุณค่าาาาาา