Image Classification with Python
Image Classification
Image Classification (การจำแนกประเภทข้อมูลภาพ)หมายถึง การแยกแยะภาพที่มีคุณลักษณะเดียวกันออกเป็นกลุ่มๆ(class)
โดยทั่วไป model สำหรับงาน image classification จะประกอบไปด้วย ส่วนของ Deep Convolutional Neural Network (DCNN) หรือส่วน body ของ model ซึ่งเป็นส่วนที่สร้างขึ้นมาจาก Convolutional neural network (CNN) หลายๆ layer โดย layer ตื้นๆ จะเรียนรู้รูปทรงพื้นฐานในรูปภาพ
Convolutional Neural Network คืออะไร
Convolutional Neural Network (CNN) หรือ โครงข่ายประสาทแบบคอนโวลูชัน เป็นโครงข่ายประสาทเทียมหนึ่งในกลุ่ม bio-inspired โดยที่ CNN จะจำลองการมองเห็นของมนุษย์ที่มองพื้นที่เป็นที่ย่อยๆ และนำกลุ่มของพื้นที่ย่อยๆมาผสานกัน เพื่อดูว่าสิ่งที่เห็นอยู่เป็นอะไรกันแน่
การมองพื้นที่ย่อยของมนุษย์จะมีการแยกคุณลักษณะ (feature) ของพื้นที่
ย่อยนั้น เช่น ลายเส้น และการตัดกันของสี ซึ่งการที่มนุษย์รู้ว่าพื้นที่ตรงนี้เป็นเส้นตรงหรือสีตัดกัน เพราะมนุษย์ดูทั้งจุดที่สนใจและบริเวณรอบ ๆ ประกอบกัน
Requiment
เราจะใช้ Python และ Tensorflow ในการทำ ซึ่งมี 2 ทางเลือก คือ
- Google colab ที่มีทุกอย่างพร้อม และทำผ่าน Web browser ซึ่งเป็น Saas ของ Google นั่นเอง
- Jupyter Notebook ที่ทำใน Client ของเรา
ทั้งหมดจะทำผ่าน Jupyter Notebook ในตัวเครื่อง Local ของเรานะครับ ซึ่งจะมีสิ่งที่จำเป็น 3 อย่างดังนี้
- Cuda
- CuDNN
- Tensorflow, Tensorflow- gpu
วิธีลงมือทำ
เริ่มต้นหาข้อมูลทำ data set ด้วยการหาภาพของผลไม้ 4 ชนิด ได้แก่ ส้ม กล้วย สับประรด และ แตงโม อย่างละ 30 ภาพ
เปิดใช้โปรแกรม Jupyter notebook
- ทำการ import Libary และใช้คำสั่ง เพื่อ version ของ tensorflow
และ config tensorflowด้วยGPU
Data Preparation
เตรียมข้อมูล โดยเราจะนำโฟลเดอร์ที่เก็บรูปภาพมาใช้ โดยคำสั่งนี้จะใช้Library Pathlib ในการชี้ไปยัง Path ของ ผลไม้ต่างๆ และแสดงผลลัพธ์ว่าในโฟลเดอร์มีรูปภาพทั้งหมดเท่าไร โดยใช้ คำสั่ง
ต่อไปเราต้องกำหนดรูปภาพให้มีขนาดรูปทุกรูปเท่ากัน
batch_size คือ ค่าที่กำหนดขนาดของการอ่านข้อมูล
img_rows คือ ความสูงของรูปภาพ
img_cols คือ ความกว้างของรูปภาพ
ต่อด้วย Trainning Model
ตรวจสอบว่ามีทั้งหมดกี่ class และมีชื่ออะไรบ้าง
ต่อมาเขียนคำสั่งแสดงรูปภาพในข้อมูล Train ออกมา
ต่อไปทำการเช็กข้อมูลว่ามีขนาดเท่ากับที่เราตั้งค่าไว้หรือไม่
Normalization Color
เราจะทำการนำรูปภาพทั้งหมดมา Normalization เพื่อแปลงค่าสีจาก 255 ในแต่ละ Chanal ให้เป็นค่า 0–1
เตรียมข้อมูลได้ตามที่ต้องการก็ทำขั้นตอนต่อไป
Define Model
Train Model
Save Model
Load Model
เป็นการเรียกโมเดลมา โดยที่เราไม่ต้องทำการ Train โมเดลใหม่ทุกครั้งได้ โดยใช้คำสั่ง
ผลลัพธ์เป็นกราฟแสดงค่า Loss กับ จำนวนในการ Train
สามารถเรียกใช้ผลของการ Train ให้ออกมาเป็นภาพกราฟ หรือ Visualization ได้ดังนี้
Prediction
เป็นขั้นตอนสุดท้าย ในการพยากรณ์ ความแม่นยำของรูปภาพว่าสิ่งที่เราทำมาทั้งหมด
import requests
from IPython.display import Image
from io import BytesIO
# test_url = "https://Users/admind/Desktop/Ai/banana/120283.jpg"
# test_path = tf.keras.utils.get_file('fruit_test', origin=test_url)test_path = ("F:/code/AI/train_fruit/test/t21.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("แตงโม",score[0],"กล้วย",score[1],"สับประรด",score[2],"ส้ม",score[3])
display(Image(filename=test_path,width=180, height=180))if score[0]==np.max(score) :
fruit = "แตงโม"
elif score[1]==np.max(score) :
fruit = "กล้วย"
elif score[2]==np.max(score) :
fruit = "สับประรด"
elif score[3]==np.max(score) :
fruit = "ส้ม"print(
"มีความมั่นใจว่าจะเป็น {} {:.2f}%."
.format(fruit, 100 * np.max(score))
)
ค่าความถูกต้อง 80.45% ก็แม่นอยูนะ!!! จบการทำ Image Classification ขอบคุณครับ