Cactus classification with fast Ai

Fosacius Lapis
3 min readJun 21, 2022

สวัสดีครับผมปัณณธร กรุดทองวันนี้ผมจะมาแชร์ประสบการณ์ที่ได้รับมาจากการเข้าร่วมโครงการAi buildersกันนะครับ ต้องเกริ่นก่อนว่าAi buildersเนี่ยคือโครงการที่ได้ทำให้ผมได้รู้จักกับMachine LearningหรือMLนั่นเองครับซึ่งเป็นโครงการที่ทำให้ผมได้รู้จักกับเพื่อนๆในโครงการ ทุกคนน่ารักมากๆเลยครับเป็นกันเองและยังช่วยให้คำปรึกษาได้เป็นอย่างดีเลยครับในโครงการเนี่ยก็จะให้เราได้ทำโปรเจคเกี่ยวกับ MLครับ งั้นทุกคนมาทำความรู้จักกับโปรเจคของผมกันดีกว่า

น่ารักใช่ม้าาาาา

เรื่องวุ่นๆวัยรุ่นปลูกแคคตัส

กระบองเพชรหรือแคคตัสจัดอยู่ในพืชวงศ์cactacea เป็น1ในพืชเศรษฐกิจที่มีเสน่ห์เป็นอย่างมากครับ เสน่ห์ที่น่าดึงดูดของมันก็คือหนามของมันนั่นเองครับซึ่งมันคือใบที่เปลี่ยนรูปมาเป็นหนามเพื่อลดอัตราการเสียน้ำนั่นเอง แต่ก็ไม่ใช่ว่าแคคตัสทุกต้นจะต้องมีหนามนะครับนอกจากนี้ทุกคนคงต้องเคยทานผลของแคคตัสกันมาบ้างแล้วแหละครับ นั่นก็คืออออ~แก้วมังกรนั่นเองงง แก้วมังกรจัดเป็นแคคตัสที่อยู่ในสกุลhylocereusครับ(อึ้งใช่ป่าวผมก็อึ้ง)กระบองเพชรนั้นมีหลายชนิดหลายหน้าตาหลายสายพันธุ์หลายสกุล เนื่องจากสายพันธุ์ของกระบองเพชรนั้นเยอะมากมายมหาศาล ผมจึงเลือกที่จะเน้นไปที่สกุลครับ;-; ปัญหาของมือใหม่ที่ปลูกแคคตัสส่วนใหญ่ก็คือไม่รู้ว่ากระบองเพชรของตนจัดอยู่ในสกุลไหนผมจึงได้พัฒนา ML ตัวนี้ขึ้นมาเพื่อตอบโจทย์นั้นนั่นเอง โดยผมจะแยกแคคตัสทั้งหมด5สกุลนั่นคือ

Ariocarpus

Astrophytum

Echinopsis

Gymnocalycium

Ophuntia

แก้วมังกร hylocereus

Ai คืออะไร

AI ย่อมาจาก Artificial Intelligence คือ ปัญญาประดิษฐ์ โปรแกรมที่ถูกเขียนและพัฒนาให้มีความฉลาด มีความสามารถคิด วิเคราะห์ วางแผน และตัดสินใจได้ จากการประมวลผลของฐานข้อมูลขนาดใหญ่ และยังสามารถดัดแปลงการประมวลผล ประยุกต์ ให้เป็นไปตามสถานการณ์ต่างๆ ในที่นี้เราใช้ deep learningสร้าง image classification model มาแยกสกุลแคคตัสน้อยของเรากัน

Deep Learning คือวิธีการเรียนรู้แบบอัตโนมัติด้วยการ เลียนแบบการทำงานของโครงข่ายประสาทของมนุษย์ (Neurons) โดยนำระบบโครงข่ายประสาท (Neural Network) มาซ้อนกัน หลายชั้น (Layer) และทำการเรียนรู้ข้อมูลตัวอย่าง ซึ่งข้อมูล ดังกล่าวจะถูกนำไปใช้ในการตรวจจับรูปแบบ (Pattern) หรือจัด หมวดหมู่ข้อมูล (Classify the Data)

Image Classification

เราใช้ Deep learning แยกสกุลของแคคตัส ในที่นี้เราเลือกใช้ high-level-api ที่ชื่อว่า Fastai v2 ซึ่งเป็นเครื่องมือที่ง่ายในการเรียนรู้เหมาะกับผู้เริ่มต้น แถมยังมีคุณภาพ ทั้งการปรับแต่ง และการเทรนโมเดลได้ง่าย ซึ่งเปรียบเทียบให้เห็นภาพง่ายๆ Image Classififation ก็เหมือนการสอนเด็กๆให้เห็นว่าอันไหนคือหมูอันไหนคือหมา

Dataset

ในการสอนAi เราต้องมีสื่อการสอนเราเรียกสื่อที่นำมาสอนAiว่า ชุดข้อมูล(Dataset)ในเคสนี้เป็น Image Classification ชุดข้อมูลที่ต้องการก็คือรูปกระบองเพชรสายพันธุ์ต่างๆ แต่ยังไม่มีใครทำ ผมจึงต้องสร้างเองโดยอ้างอิงจากจากหนังสือ Cactus ของคุณภวพล

มีหลากหลายวิธีมากในการรวบรวม dataset เช่นการออกไปถ่ายรูป การเขียนโปรแกรมแคปภาพจากKeyword ซึ่งสถานการณ์โควิด19จึงไม่สามารถออกไปถ่ายรูปได้ เราจึงใช้วิธีการเขียนโปรแกรมแคปภาพจากKeyword

C.Gymnocalycium

Train-Validation-Test Split คืออะไร

หลังจากได้datasetมาแล้วเราจะแบ่งออกเป็น3ประเภท

Train set ชุดข้อมูลที่ไว้ฝึกโมเดล

Validation set ชุดข้อมูลสำหรับเลือโมเดลที่ดีที่สุดโดยเราจะเลือกโมเดลที่ดีที่สุดในการเทรนข้อมูลครบ1รอบ(1 epoch)

Test set ชุดข้อมูลที่ใช้ทดสอบว่าโมเดลทำงานได้ดีแค่ไหนเมื่อเจอกับชุดข้อมูลที่ไม่เคยเห็นมาก่อน

โครงสร้างdataset

datasetของเราจะมีโฟลเดอร์หลัก1โฟลเดอร์แล้วข้างในจะสร้างโฟลเดอร์แบ่งตามคลาสที่เราต้องการแยก ในที่นี้มี5โฟลเดอร์ คือ Ariocarpus Astrophytum Echinopsis Gymnocalycium และ Ophuntia เพื่อเก็บรูปภาพตามสกุลของกระบองเพชร ซึ่งเราจะไม่แยก train-test-valid ตรงนี้ เพราะเราจะกำหนดสัดส่วนที่หลัง หลังจากนั้นเราจะนำไปเก็บไว้ใน Google-Drive เตรียมเอาไปเรียกใช้ใน Google Colab ต่อไป

ในการเตรียมข้อมูลของผมนั้นผมใช้ระบบแรงงานคนครับ5555+เนื่องจากผมมีความรู้เรื่องแคคตัสเป็นDomain knowledgeแยู่แล้วผมเลยต้องนั่งแยกเองเผื่อว่าจะมีข้องผิดพลาดอย่างมีสกุลอื่นหลุดเข้ามาในโฟลเดอร์ของอีกสกุลหนึ่ง

สร้างdatablock

หลังจากเราดึงข้อมูลจากโฟลเดอร์มาแล้ว เราจะสร้างdatablockเพื่อใไว้ใช้ในการเรียกใช้ข้อมูลมาเทรน โดยมีรายละเอียดดังนี้

Training Model

หลังจากเราได้datablock มา เรานำdatasetไปเทรน โดยผมเลือกใช้ resnet50ซึ่งมีความละเอียดและคุณภาพสูง และใช้เวลาไม่นาน

ต่อไปเราใช้คำสั่งinterp.plot_confution_matrix()เพื่อดูผลงานของโมเดล

จะเห็นว่าผลออกมาค่อนข้างใช้ได้ แต่รูปไหนกันที่ทายผิดกันล่ะ

เราใช้คำสั่ง interp.plot_top_losses(5, nrows=5) ในการหารูปที่ผิดพลาดเยอะที่สุด เห็นได้ว่ารูปเหล่านั้นแยกยากจริงๆ บางรูปมีลักษณะที่ไม่ชัดเจนบางรูปไม่ชัดบางรูปไม่เห็นต้นเห็นแต่ดอกบางรูปมีหลายต้นจนโมเดลแยกไม่ออก

Deploy model

หลังจากเราเทรนโมเดลเสร็จแล้ว เราจะนำโมเดลไปdeployออกมาเป็นweb appง่ายๆด้วยstremlitกัน

เราใช้คำสั่ง learn.export เพื่อexportออกมาเป็นไฟล์ .pkl ก่อนหลังจากนั้นสร้างapp.pyแล้วเขียนคำสั่งpythonเพื่อโหลดโมเดลแล้วนำรูปภาพมาclassifier แล้วใส่เข้าไปในไฟล์pklของเรา อย่าลืมสร้างRepositoryเพื่อให้อัพโหลดขึ้นstreamlit cloudได้

จากนั้นก็เข้าstremelit cloud แล้วอัพโหลดเลยยย

ผลที่ได้

Future plans

ตอนนี้โมเดลสามารถทำนายผลได้ในระดับหนึ่ง ซึ่งอนาคตคิดว่าจะพัฒนาให้สามารถทำนายได้แม่นยำขึ้นหลังจากนั้นจะค่อยเพิ่มclassต่อๆไปเพื่อให้สามารถแยกสกุลได้มากยิ่งขึ้นเพื่อให้คนรักกระบองเพชรกระบองเพชรได้นำไปใช้กัน และหลังจากนี้ผมคิดเอาไว้ว่าจะทำ Google form เพื่อมาทดสอบว่าคนกับโมเดลนี้อันไหนจะแยกได้ดีกว่ากัน สมมติฐานของผมผมเชื่อว่าในกรณีที่มีคลาสให้แยกน้อยคนอาจทำได้ดีกว่าแต่ในกรณีที่มีคลาสต้องแยกมากกว่า 20 คลาสขึ้นไปผมคาดว่า Ai จะสามารถทำหน้าที่ได้ดีกว่ามนุษย์ครับ ผมจะพยายามพัฒนาโปรเจคนี้ต่อไปครับ

สิ่งที่ได้รับจากค่ายนี้

ผมไม่เคยคาดคิดเลยจริงๆว่าจะมายืนในจุดนี้ได้ ผมเคยได้เขียนเว็บอยู่บ้างแต่ไม่เคยได้เกี่ยวข้องกับสิ่งที่เรียกว่าAiเลยด้วยซ้ำ ในค่ายนี้ไม่ได้สอนผมแค่ว่า Ai ทำงานอย่างไรกลับสอนทั้งวิชาการหลักการรวมไปถึงจริยธรรมปัญญาประดิษฐ์อีกด้วย ทั้งพี่ๆเพื่อนๆที่ได้เจอในค่ายนี้ทุกคนเฟรนด์ลี่มากช่วยให้คำปรึกษาได้เป็นอย่างดี อีกทั้งพี่mentorที่คอยติดตามงานและให้คแนะนำที่มีประโยชน์ในการทำโปรเจคนี้เป็นอย่างมากรวมทั้งมีTAที่พึ่งพาได้มากๆ ผมเชื่อว่าการได้มาเข้าร่วมค่ายAi Buildersในครั้งนี้จะเป็นประสปการณ์ที่ดีและน่าจดจำของผมครับ

ปัณณธร กรุดทอง

--

--