ส่งคุกกี้เสี่ยงทาย ให้ AI ทำนายสายพันธุ์มะม่วงกัน

DSE4 G.6
botnoi-classroom
7 min readSep 5, 2021

--

Objective: บทความนี้เป็นส่วนหนึ่งของ Data Science Essential ของ Botnoi Classroom หัวข้อ Machine Learning & Prediction Model

กลุ่ม DSE4_G6

จากภาพมะม่วงละลานตาแบบนี้ ถ้าไม่มีป้าย ก็ตอบไม่ได้นะ ต่อให้มีป้ายก็ยังงงๆว่ามะม่วงพันธุ์ไหนเป็นพันธุ์ไหน และพันธุ์ไหน หวาน มัน อมเปรี้ยวนิดหน่อย หรือเปรี้ยวมากแบบเอาไปกินกับน้ำปลาหวาน เวลาไม่มีพนักงานให้ถามซื้อไปมั่วๆ ก็ได้มะม่วงไม่ตรงใจอยาก ปวดใจกันไปอีก

จากการหาค้นคว้าหาข้อมูลของเรา พบว่ามะม่วงในบ้านเรามีถึง 174 สายพันธุ์ และ ไม่ได้มีแค่พวกเราเท่านั้นที่มีปัญหา ยังมีอีกหลายคนที่โพสต์ถามผู้เชี่ยวชาญในกระทู้ต่างๆ

นอกจากนี้เรายังค้นพบว่าที่มันมีความใกล้เคียงกัน และดูยาก เพราะเป็นพันธุ์ที่มีความคล้ายกัน สามารถแบ่งตามทรงพุ่ม ต้น ใบ ช่อดอก และ ผล ได้ถึง 8 กลุ่ม คือ กลุ่มแก้ว กลุ่มเขียวเสวย กลุ่มดอกไม้ กลุ่มหนังกลางวัน กลุ่มอกร่อง กลุ่มพราหมณ์ กลุ่มผลกลม และ อื่นๆ

เราเลยเอาปัญหาของคนรักมะม่วง แต่ก็ยังสับสนกับพันธุ์มะม่วง มาลองทำ Model กัน สอน AI ให้สามารถแยกพันธุ์มะม่วง เพื่อช่วยเราเลือกพันธุ์มะม่วง ให้ได้กินสมใจอยาก โดยไม่ต้องเดาสุ่มอีกต่อไป

โจทย์ปัญหาที่มอบให้กับ AI

โจทย์ปัญหาที่เรามอบให้กับ AI ช่วยตอบคือ จากรูปภาพ (รูปภาพมะม่วง) คือมะม่วงพันธุ์อะไร? เมื่อ AI ได้โจทย์ปัญหาแล้ว ต่อไปเราก็จะสร้างมันสมองให้กับ AI ของเรากัน

ML ที่ใช้เป็นมันสมองให้กับ AI

จากโจทย์ปัญหาคือการแยกสายพันธุ์ของมะม่วงจากรูปภาพ และเราสามารถรวบรวมภาพของมะม่วงเพื่อนำมาสอน Model ได้ จึงเลือกใช้ ML แบบ Image Classification ซึ่งเป็นหนึ่งใน ML ประเภท Supervised Learning มาใช้เป็นมันสมองให้กับ AI ของเรา

Machine Learning ประเภทต่าง

Algorithm ที่ใช้ในการสร้าง Image Classification Model

เราเลือกใช้ Convolutional Neural Network (CNN) ซึ่งเป็นหนึ่งใน Algorithm ของ Deep Learning ที่นิยมใช้สำหรับทำ Image Classification

CNN จะจำลองการมองเห็นภาพจาก โดยแบ่งภาพออกเป็นพื้นที่ย่อยๆ ซึ่งพื้นที่ย่อยๆแต่ละพื้นที่จะถูกแบ่งแยกด้วยคุณลักษณะหรือ Feature เช่น ลายเส้น การตัดกันของสี เป็นต้น สุดท้ายก็นำกลุ่มของพื้นที่ย่อยๆมาผสานกัน เพื่อแยกว่าสิ่งที่เห็นอยู่เป็นอะไรกันแน่

CNN Architecture : https://medium.com/@natthawatphongchit/%E0%B8%A1%E0%B8%B2%E0%B8%A5%E0%B8%AD%E0%B8%87%E0%B8%94%E0%B8%B9%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%84%E0%B8%B4%E0%B8%94%E0%B8%82%E0%B8%AD%E0%B8%87-cnn-%E0%B8%81%E0%B8%B1%E0%B8%99-e3f5d73eebaa

ขั้นตอนการทำงาน (Workflow)

1. Get Data

จาก research เบื้องต้นพบว่า มะม่วงในไทยที่ขายๆกันอยู่มีถึง 174 พันธุ์ แต่ด้วยเวลาในการทำโปรเจ็คที่จำกัด เราเลยตกลงใจเลือกมาแค่ 4 สายพันธุ์ เพื่อใช้ในการทดสอบ คือ เขียวเสวย ฟ้าลั่น แก้วขมิ้น และ มันขุนศรี เพื่อให้ง่ายต่อการสอนและทดสอบ Machine learning เราจึงได้เก็บภาพแยกเป็น Folder ละ 1 สายพันธุ์ โดยเก็บรวบรวมภาพให้ได้มากที่สุดเท่าที่รวบรวมได้ ซึ่งมีทั้งภาพที่นำมาจากอินเทอร์เนตและภาพถ่าย

ภาพที่แนะนำให้เก็บ : ภาพต้องมีความชัด Object ที่ต้องการทำนายต้องชัด มี Noise น้อย มีหลากหลาย background หลากหลายแสงเงา เพื่อให้ AI ได้เรียนรู้ภาพหลากหลายรูปแบบ ใกล้เคียงกับความเป็นจริงมากที่สุด หรือหากภาพที่หาได้มีไม่เพียงพอ เราก็สามารถเอาภาพทีมีมาหมุนปรับองศา หรือเพิ่มลดความเข้มแสงได้

ภาพที่ไม่แนะนำ : มีจำนวนผลเยอะเกินไป พื้นหลังรก มุมมองจากระยะไกล มีหลายพันธุ์ใน 1 ภาพ ผลที่อยู่ในสภาพไม่สมบูรณ์ มีการแปรเปลี่ยนรูปร่าง หรือมีองค์ประกอบในภาพเยอะเกินไป

มาเริ่ม coding กันเลย 👇

ก่อนอื่นติดตั้ง Library ที่ต้องใช้กันก่อน
ต่อมานำเข้าชุดข้อมูลจาก Cloud drive

สร้าง data frame ของชุดข้อมูลจาก Cloud ที่ประกอบด้วย Path ของรูปภาพแต่ละรูปและติด label ตามชื่อ Folder ให้กับภาพทั้งหมดเพื่อระบุสายพันธุ์

จาก data frame มีจำนวนรูปของ 4 สายพันธุ์ คือ
1) ฟ้าลั่น จำนวน 108 รูป
2) แก้วขมิ้น จำนวน 63 รูป
3) เขียวเสวย จำนวน 104 รูป
4) มันบางขุนศรี จำนวน 140 รูป

ปรับแต่งชุดรูปภาพที่ใช้สำหรับ Train, Validate, Test ให้มีคุณลักษณะที่เหมือนกัน แล้วนำไแเข้าโมเดลกันเลย

2. สกัด Feature และทดสอบการสร้าง Model ด้วย MLP Model และ CNN Model

2.1 MLP Model : เป็นการนำเอารูปภาพมาต่อกันเป็น pixel ยาว ๆ รวมเป็น 1 vector หลังจากนั้นจึงส่งเข้าไปใน Neural Network เพื่อทำการวิเคราะห์และทำนายผลในขั้นตอนต่อไป

จากการสกัด Feature ด้วย MLP Model เราพบว่า ใน 1 ภาพประกอบด้วย 150,528 pixel และเมื่อเราส่งข้อมูลเข้า Neural Network ทำให้เกิด parameter มากถึง 38.5 ล้านค่า

เมื่อลองทดสอบการสร้าง Model ด้วย MLP Model หลัง Train Model ด้วยค่า Parameter 38.5 ล้านค่า ผลจากการ Train พบว่าเกิดค่า Loss ที่สูงมาก ส่งผลให้ความแม่นยำของ Model ต่ำมาก

ซึ่งสาเหตุหลักที่ทำให้ MLP Model ทำงานได้ไม่ดี คือ

  1. สูญเสียข้อมูลตำแหน่งของรูปภาพไป ถ้าในรูปภาพ มะม่วงถูกย้ายตำแหน่งไปเพียงนิดเดียวก็ส่งผลให้การทำนายคลาดเคลื่อนแล้ว ซึ่ง Model รูปแบบนี่ต้องการตำแหน่งที่แน่นอน ของวัตถุที่ต้องการทำนายในรูปภาพ
  2. ตัวแปรที่ต้อง Train Model มีค่อนข้างมาก ทำให้เกิดความซับซ้อนในการหาผลการทำนายที่เหมาะสมของ Model

ด้วยเหตุนี้ จึงนำมาซึ่งการทดสอบการสร้าง Model ด้วย CNN Model ในหัวข้อถัดไปจ้า

2.2 CNN Model

Coding กันรัว ๆ

เราทำ Convolution และ Max Pooling ซ้ำ 5 รอบ เพื่อลดจำนวน parameter ที่ใช้ Train Model ลง

ลองมาดูตัวแปรที่ CNN Model ต้องทำการปรับค่าว่ามีกี่ตัวแปรบ้างและคำนวนอย่างไร

วิธีการคำนวนตัวแปรของชั้น Convolutional ทำได้ด้วยการใช้สูตรดังนี้

in_channels = 3 (จำนวนชุดข้อมูลขาเข้า)

out_channels = 32 (จำนวนชุดข้อมูลขาออก)

kernel_h = kernel_w = 3 (ขนาดของช่องที่กรองข้อมูล)

number_parameters = 32(3*3*3 + 1) = 896 (จำนวนตัวแปร)

Number_parameters = out_channels*(in_channels*kernel_h*kernel_w+1)

วิธีการคำนวนตัวแปรของชั้น Dense ทำได้ง่ายๆ

Input_node = 6,400

Output_node = 256

คูณกันตรงๆ เลย 6,400 x 256 = 1638400 อ้าวทำไมไม่เท่ากัน !

อย่าลืม Bias node ด้วย 256 nodes 6,400 x 256 + 256 = 1638656 อ้าวเท่ากันแล้ว !

และผลลัพธ์จากการทำ Convolution เราได้จำนวนของตัวแปรทั้งหมด 2,065,028 ซึ่งสอดคล้องกับการคำนวณตามที่อธิบายไว้ด้านบน

จากนั้น Train Model เพื่อสร้างกระบวนการเรียนรู้ให้ Machine Learning ของเรา

ทำการ Train Model ทั้งหมด 40 ครั้ง เพื่อดูความผิดพลาดและความแม่นยำของ model

จากนั้นนำผลการ Train มาสร้างเป็นกราฟ ช่วยให้เราเห็นเทรนด์ ของการ Train Model ซึ่งสามารถ สรุปผลได้ว่า เมื่อเราทำการ Train Model มากครั้งขึ้นเรื่อย ๆ จะทำให้ความคลาดเคลื่อนของ Model ลดลง หรืออีกนัยหนึ่งคือ Model มีความแม่นยำมากยิ่งขึ้นนั่นเอง

ในส่วนของความแม่นยำนั้น เมื่อเรานำผลการ Train ทั้ง 40 ครั้ง มาสร้างเป็นกราฟ ช่วยให้เราเห็นเทรนด์ของความแม่นยำจากการ Train Model ในลักษณะที่ผกผันกับความคลาดเคลื่อนที่กล่าวไปก่อนหน้า

จากนั้นประเมินความแม่นยำของ Model ออกมาเป็นตัวเลขด้วย coding นี้

ผลออกมาก็เป็นที่น่าพอใจ เพราะความแม่นยำของ Model อยู่ที่ 96.83% เลยทีเดียว เย้!

แถมอีกนิดเพื่อความเข้าใจในขั้นตอนการสกัด Feature จากรูปภาพของ CNN Model

Coding การแสดงผลลัพธ์จากการสกัด Feature

ผลลัพธ์แบบค่าตัวเลข

ผลลัพธ์แบบรูปกราฟฟิคแต่ละรอบ จากการ Convolution จากทั้งหมด 5 รอบ

ท้ายที่สุดทำการทดสอบแบบจำลองหรือ Test Model กัน

กำหนดค่าอินเด็กซ์ของผลลัพธ์

ทดสอบ Model ด้วยชุดข้อมูลทดสอบที่ได้เตรียมไว้ ซึ่งผลจากการทดสอบพบว่า Model สามารถทายชื่อพันธุ์มะม่วงได้ถูกต้องตรงตามสายพันธุ์นั้น ๆ

สร้างผลการทดสอบในรูปแบบ Confusion Matrix จะเห็นได้ว่า ผลการทำนายของ Model ยังมีความคลาดเคลื่อนอยู่บ้าง คิดเป็น 3.17% แต่เป็นสัดส่วนที่เรายอมรับได้ หรืออีกนัยหนึ่ง Model มีความแม่นยำถึง 96.83% เลยทีเดียว ว้าว! 😊😊😊

สาธยายผลลัพธ์ของการทำนายกันอีกซักหน่อยดีกว่า

Precision = ค่าความแม่นยำ (ทายมะม่วงพันธ์ X ว่าเป็นมะม่วงพันธ์ X ได้จริงเท่าไร)

Recall = ค่าความถูกต้อง ทายว่าเป็นมะม่วงพันธ์ X จากมะม่วงพันธุ์ที่มีทั้งหมดได้ถูกต้องไหม

F1-Score = เป็นค่าเฉลี่ยระหว่าง Precision และ Recall ถ้าสูงแปลว่ามีทั้งความแม่นยำและความถูกต้อง

ซึ่งจะเห็นได้ว่า Model ของเราทำนายพันธุ์เขียวเสวยได้ถูกต้องต่ำที่สุด (ทำนาย 16 รูปผิด ไป 2 รูป) ส่งผลให้พันธ์ฟ้าลั่นกับแก้วขมิ้นมีความแม่นยำลดลงด้วย (ที่ผิดไป 2 คือไปทำนายเป็นฟ้าลั่นกับแก้วขมิ้นอย่างละ 1 รูป)

ทำการหารูปที่ CNN Model ทายผิดพลาดโดยกำหนดสีชื่อของพันธุ์มะม่วง
โดยที่ สีเขียว หมายถึง ทายถูก และสีแดง หมายถึง ทายผิด

จากรูป CNN model ทายผิดไปเพียงแค่ 2 รูปเอง… เก่งนะเนี่ย 😎

3.Dirty Hand กันฮะ! ทดสอบการทำนายจริงของ Model กันหน่อยดีกว่า

ลองหารูปจากอินเทอร์เนตมาทำนายผลดู

ที่มาของรูป: https://pbs.twimg.com/media/E2naXyeUYAInxA7.jpg

ผลการทำนายออกมาเป็นพันธุ์ “ มันบางขุนศรี ” เจ๋งอะ! ใช้ได้ 😊

4.Deploy เผยแพร่ในรูปแบบ API บน Heroku: Cloud Application Platform

ทีมเราเลือกใช้ Flask Framework ในการพัฒนาและเผยแพร่ให้อยู่ในรูปแบบ API เพื่อนๆสามารถเลือกลิ้งค์รูปมะม่วงจากอินเตอร์เน็ต (ขอให้นามสกุลไฟล์อยู่ในรูปแบบ .jpg จะดีนะ) ลองทดสอบและเรียกใช้งานได้ผ่านเครื่องมือที่เพื่อนๆ คุ้นเคยได้เลย ไม่ว่าจะเป็น PAW, Postman หรือเรียกผ่าน Curl ก็ไม่มีปัญหาใดๆ อย่าลืมส่งพารามิเตอร์ url มาด้วยนะ

ภาพแสดงการทดลองเรียกใช้งานผ่านเครื่องมือ PAW
(https://dse4-project.herokuapp.com/mango-prediction)

5.เราได้เผยแพร่และทำการลงทะเบียนไว้บน BOTNOI Open AI API ด้วย

BOTNOI Open AI API คืออะไร?

มันคือ platform ที่จะรวบรวม API ต่าง ๆ ไว้ เน้น API ที่เป็น AI โดยในระยะแรก API ที่สร้างขึ้น จะมาจากทีมงาน BOTNOI แต่จุดประสงค์ที่แท้จริงคือ อยากจะเชิญชวนนักพัฒนา AI มาฝาก API ที่ตัวเองสร้างขึ้น และหากมีคนใช้งานเยอะ ก็จะเปิดสิทธิ์ให้ขาย API ของตัวเองได้ ซึ่งน่าจะเป็นช่องทางในการสร้างรายได้ให้กับนักพัฒนา AI

https://medium.com/botnoi-classroom/botnoi-openai-api-opensource-afd33531c0bb#:~:text=%E0%B8%A1%E0%B8%B1%E0%B8%99%E0%B8%84%E0%B8%B7%E0%B8%AD%20platform%20%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%88%E0%B8%B0,%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%99%E0%B8%B1%E0%B8%81%E0%B8%9E%E0%B8%B1%E0%B8%92%E0%B8%99%E0%B8%B2%20AI

เข้าสู่ API ของ BOTNOI
รายละเอียด API ของการทำนายมะม่วงของทีมเรา

ลิ้ง Colab ของเรา ตามไปดูกันได้เลย: https://bit.ly/3jIXfTO

สุดท้ายก็หวังว่า ทุกคนกำลังเดินออกไปซื้อมะม่วง… ไม่ใช่สิ! 🙃

หวังว่าคนที่เข้ามาอ่านบทความนี้จะได้ความรู้เกี่ยวกับ Machine Learning ไปจนถึงการนำไปใช้งานและพัฒนาให้เกิดประโยชน์ และถ้ามี Developer มาอ่าน สามารถเอา Model ของเราไป Develop ต่อให้ครบทุกสายพันธุ์ก็จะยอดเยี่ยม เพื่อสร้างประโยชน์ให้กับคนรักมะม่วงต่อไป 😊😊😊

ทีม avenger DSE4_G6

Credit:
vector png from pngtree.com
mango png from pngtree.com

--

--