บทความ

ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่

สร้าง Machine Learning โมเดลมาทำ Image Recognition

สร้าง Machine Learning โมเดลมาทำ Image Recognition

Image Recogniton คือความสามารถของโปรแกรมในการระบุได้ว่าวัตถุ สถานที่ ผู้คน หรือข้อความต่างๆ ในรูปภาพ ว่าคืออะไร อยู่ที่ไหน ใครเป็นใคร และข้อความนั้นเขียนว่าอะไร

ถ้าเราอยากจะลองสร้าง (traditional) Machine Learning โมเดลขึ้นมาสักตัวหนึ่งเอามาทำ Image Recognition เราต้องทำอย่างไรบ้างนะ? ปกติแล้วเวลานำข้อมูลเข้าไปสอนโมเดล ข้อมูลนั้นๆ จะอยู่ในรูปแบบ Tabular เนอะ คือแบ่งเป็น Column แต่ละ Column ก็จะมีค่าตัวเลขต่างๆ ทีนี้ถ้าเรามีข้อมูลเป็นรูปภาพล่ะ?

ไม่ต้องคิดมากเลยครับ เราก็แปลงรูปให้เป็นข้อมูลแบบ Tabular เลย เช่นถ้ารูปขนาด 2x2 เราก็แปลงให้เป็น Vector ขนาด 1x4 ตามรูปข้างล่างนี้เลยครับ

แปลงรูป 2x2 ให้เป็น Vector ขนาด 1x4


โดยเราจะเอาแถวที่ 2 เป็นต้นไป ขึ้นมาต่อด้านหลังของแถวที่ 1 ไปเรื่อยๆ ครับ เท่านี้เราก็จะมีข้อมูแบบ Tabular ที่ Represent รูป 1 รูปแล้วเรียบร้อย 🎉

ถ้ารูปมีขนาดไม่เท่ากัน? วิธีแก้คือเราต้องทำให้ขนาดของรูปทุกรูปเท่ากันก่อนก็พอ ทีนี้ก็แล้วแต่ว่าเราจะ Crop รูป หรือ Resize รูปครับผม

เรามาลองเล่นกันบ้างดีกว่า จะได้เข้าใจมากขึ้นครับ เราจะนำข้อมูล Optical Recognition of Handwritten Digits จากเว็บ UCI Machine Learning Repository มาสร้างโมเดลกัน

Photo by Green Chameleon on Unsplash


โหลดข้อมูลมาก่อนครับ

import pandas as pd
digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)
digits_train.head()

ข้อมูลที่ได้หน้าตาจะประมาณนี้ครับ

ลักษณะข้อมูล Optical Recognition of Handwritten Digits


จะเห็นได้ว่า UCI ได้แปลงข้อมูลให้เรามาแล้ว แต่ถ้าเราจับข้อมูลมาเรียงกลับมาเป็นรูปขนาด 8x8 จะได้แบบนี้

first_digit = digits_train.loc[0, :][:-1].values.reshape(8, 8)
first_digit
แปลงข้อมูล Tabular (Feature Vector) ให้กลับมาอยู่ในรูปขนาด 8x8


ถ้าอยากเห็นเป็นรูปจริงๆ เราสามารถใช้ Matplotlib ช่วยได้ครับ

%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(1, figsize=(3, 3))
plt.imshow(first_digit, cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()
ใช้ Matplotlib ช่วยแสดงค่าจากอาเรย์ 8x8 ออกมาเป็นรูปภาพ


ถึงแม้ว่าบทความนี้จะแปลงข้อมูลจาก Tabular เป็นรูปขนาด 8x8 แต่จริงๆ เราก็สามารถแปลงรูปขนาด 8x8 ให้อยู่ในรูปแบบของ Feature Vector ขนาด 1x64 ได้ไม่ยากครับ แปลงไปแปลงกลับไม่โกง 😝

ทีนี้ขั้นตอนการสร้างโมเดล เราก็สามารถทำตามปกติได้เลยครับ เพราะข้อมูลอยู่ในรูปแบบของ Tabular แล้ว โค้ดทั้งหมดมีตามนี้เลยครับ 👇 (ใช้โมเดล SVM)

import pandas as pd
from sklearn import svm
digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)
X_train = digits_train.drop([64], axis=1)
y_train = digits_train[64]
clf = svm.SVC()
clf.fit(X_train, y_train)
digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes', header=None)
X_test = digits_test.drop([64], axis=1)
y_test = digits_test[64]
y_pred_class = clf.predict(X_test)
clf.score(X_test, y_test)

เป็นอันเสร็จสิ้น ที่เหลือก็เป็นขั้นตอนการปรับให้โมเดลของเราเก่งขึ้นครับผม 😎

Kan Ouivirach | Machine Learning

04/05/2019