fruit Image Classification

Beer Paksasin
4 min readAug 11, 2020

--

“ 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 รูป

ตัวอย่างรูปใน Drive apple เป็น .jpg ทั้งหมด

เมื่อเราเตรียมรูปภาพเรียบร้อยแล้ว เปิด Colab ขึ้นมา

เริ่มต้นด้วยเช็คกันก่อนว่า GPU พร้อมใช้งานหรือเปล่า ด้วยคำสั่ง

!nvidia-smi -L
GPU พร้อมใช้งาน

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’)
เมื่อรันแล้วจะมี Link ขึ้นมาให้กด Link นั้นเพื่อนำไปสู่การเชื่อมกับ 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)
มีไฟล์ทั้งหมด 159 แบ่งเป็น 4 Class

หากเราอยากตรวจสอบว่ามี Class อะไรบ้าง

class_names = train_ds.class_names
print(class_names)
มี 4 Class ได้แก่ apple banana grape orange

แสดงข้อมูลพร้อมชื่อ 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
ผลลัพธ์ที่ออกมาเป็น จำนวน batch_size ,img_rows,img_cols,Color Channel ค่าสีของรูป เป็น RGB

สร้าง Model

num_classes คือ จำนวน Class ในที่นี้ของเราก็คือ [‘apple’, ‘banana’, ‘grape’, ‘orange’]

epochs คือ จำนวนรอบที่ต้องการให้ Train model

num_classes = 4
epochs=20
model = 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()
output ที่ออกมา

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”)
แสดงค่า Loss กับ จำนวนในการ Train
model ที่ save ไว้

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 batch
predictions = 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

นี่คือรูปที่เราจะนำมา Predict

และผลลัพธ์คือ !!!!!

Model คาดว่าเป็น Apple 99.58%

ขอจบเพียงเท่านี้ ขอบคุณค่าาาาาา

--

--

Beer Paksasin
Beer Paksasin

No responses yet