ตัวช่วยแยกขยะง่าย ๆ ด้วย Machine Learning

Kulyarat L.
5 min readAug 29, 2020

--

Credit: ภาพถ่ายโดย Suzy Hazelwood จาก Pexels

Botnoi Data Science Essential กลุ่ม 3 ก้าวที่สองกับการทำ Machine Learning

Objective:

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

หลังจากงานชิ้นแรกที่เราทำส่วนของ Data Analytic เกี่ยวกับข้อมูลการแจ้งซ่อมบ้านกันไปแล้ว Project ต่อมาของคลาสเรียนนี้คือให้ใช้ Machine Learning สร้าง Prediction Model ขึ้นมาหนึ่งตัว

สรุปย่อๆ ของกระบวนการทำ Machine Learning ก็คือการหา Data มาป้อนให้ Machine เรียนรู้ผ่าน Algorithm ตัวหนึ่งที่เราสร้างขึ้นมา… ยิ่ง Data ที่เอามาให้มันเรียนมากขึ้น Machine จะยิ่งเก่งขึ้นตามไปด้วยนะ พอมันเก่งมากพอ เราก็จะนำความรู้ของมันตรงนี้ไปต่อยอดได้ในหลายๆด้าน ไม่ว่าจะเป็นการคาดการณ์ยอดขายหรือกำไรทางธุรกิจ การตรวจจับภาพแล้วทำนายว่านี่คือภาพอะไร การสร้าง recommendation system บน platform ต่างๆ แบบที่เราคุ้นเคยกัน เช่น การแนะนำวิดีโอของ Youtube แนะนำซีรี่ย์หรือภาพยนตร์ของ Netflix หรือการแนะนำคนที่เราอาจรู้จักของ Facebook

ทีนี้ลองมาดูกระบวนการทีละ Step กันว่าการสร้าง Prediction Model ด้วย Machine Learning เนี่ยมีอะไรบ้าง

ขั้นที่ 1. Get Data ก็คือเก็บข้อมูล เราต้องแบ่งข้อมูลเป็น 2 ชุดคือ Training Set และ Test Set โดยสัดส่วนอาจเป็น 70:30, 80:20 หรือ 90:10 แล้วแต่ขนาดของข้อมูลที่เรามี

ขั้นที่ 2. Extract Features เป็นการคัดกรองปัจจัยที่สำคัญออกมาจากข้อมูล โดยที่ Feature นี่ก็หมายถึงปัจจัยที่เราคิดว่าสำคัญกับการทำนายผลนั่นแหละ เช่น ความถี่ในการออกกำลังกายมีผลแบบชัดเจนแน่ ๆ สำหรับโมเดลทำนายน้ำหนักของคน

ขั้นที่ 3. Train Model ใช้ข้อมูลหลังจากสเตป 2 ไป train model ซึ่งเราจะใช้แค่ Training Set เพื่อให้ Model เรียนรู้ ยิ่งข้อมูลมากมักจะยิ่งทำให้ Model เราเก่งขึ้นด้วยนะ

ขั้นที่ 4. Test Model ในขั้นนี้เราจะใช้ Test Set ที่เราเหลือไว้ให้ Model เราลองทำนายผลว่ามันทำงานได้ดีมากน้อยแค่ไหน ถ้ามันไม่เวิร์คก็ต้องวนกลับไปคิดสเต็ป 2 ใหม่ รัวๆไปเรื่อยๆจนกว่า Model เราจะเจ๋งไปเลย

ขั้นที่ 5. Evaluation ขั้นตอนนี้เป็นการเอาโมเดลที่เราเทรนมาแล้ว มาลองหาค่าพวก Accuracy, Precision, Re-call ดู ว่าโมเดลของเรามีความแม่นยำมากน้อยแค่ไหน

ขั้นที่ 6. Deploy Model หลังจากผ่านศึกหนักวนลูปของ 2 ถึง 4 มา Model เราน่าจะเก่งพอเอาไปใช้งานจริงได้แล้วนะ ฮ่าๆ

และเพื่อไม่ให้เสียเวลา(บรรทัด) ไปมากกว่านี้ เรามาดูกันเลยดีกว่า ว่าในงานชิ้นที่สองของเรา… เราได้ทำอะไรกันไปบ้าง

Let’s go!!

First of all… อะแฮ่ม! หมายถึงอย่างแรกเลย ก่อนที่เราจะไปทำการสร้างโมเดล หรือทำอะไรก็ตาม… เราต้องมี Data ที่จะใช้ทำก่อน แน่ล่ะ… ไม่อย่างงั้นจะทำได้ยังไง ใช่มั้ยล่ะ?

ก็เหมือนกับงานแรก เริ่มจากมีสมาชิกถามความเห็นในกลุ่มว่าเราควรจะเลือกหัวข้อไหนดี จากนั้นก็เริ่มมีคนมาเสนอหัวข้อ… ไม่ว่าจะเอางานชิ้นแรกมาต่อยอด หรือการวิเคราะห์รูปอาหาร แต่สุดท้าย… หัวข้อที่ทุกคนเห็นตรงกันว่าควรเป็นอันนี้ มันใช่เลย! ก็คือ…!

คือ…. การวิเคราะห์รูปภาพขยะรีไซเคิลนั่นเอง!!

(ถ้าพูดให้ละเอียดก็คือเอารูปภาพขยะรีไซเคิลมา Train เพื่อให้มันบอกเราได้ว่า รูปที่เราใส่ไปให้เป็นขยะรีไซเคิลประเภทแก้ว, พลาสติก, กระดาษ, อลูมิเนียม หรือกระดาษแข็ง นั่นแหละขอรับ 😝)

ทีนี้เราก็มาเริ่มทำงานตามขั้นตอนของ Pipeline กันเลย (ขั้นตอนตามรูป)

Step 1 Collect Data

โดยข้อมูลที่ได้มาจากเว็บพวกนี้…

ก่อนอื่น import library ที่เราต้องใช้ก่อน

ทีนี้รูปที่สมาชิกหามาได้ ถูกดาวน์โหลดมาเป็นไฟล์ zip เพราะฉะนั้น… อันดับแรกเราต้อง Extract รูปพวกนั้นออกมาก่อน

ก็จะได้ result ประมาณนี้

Note: ใน zip file มีการแยกรูปสำหรับ Train model ไว้เป็นโฟลเดอร์ ตามประเภท ซึ่งจะมี cardboard, glass, metal, plastic, paper และ trash

ปล. trash อันนี้อาจจะต้องตัดออก ในขั้นตอนการ Train Model เพราะอยู่ในประเภทขยะทั่วไป ไม่ใช่ขยะ recycle

ปล2. ปกติก่อนทำการ Fit Model เราจะต้องทำการ Clean Data และลองทำ Data Visualization เพื่อเช็คความถูกต้องของข้อมูลก่อน แต่ข้อมูล (รูปภาพ) จากแหล่ง Data ของเราสะอาดปิ๊งพร้อมใช้ ดังนั้นก็…

ไปต่อเลยจ้า 👼

ต่อมาเราก็มาทำการแบ่งDataset ให้เป็น Train Data และ Test Data

ในกรณีที่ Data ของเราเป็นรูปภาพ ถ้าเราดึงรูปมาใช้เลยขนาดมันคงจะใหญ่มาก แล้ว RAM ในเครื่องเราก็คงจะรับไม่ไหว ดังนั้นจึงต้องใช้ Image Generator โดยเรียกจาก Keras class ใน Tensorflow มาใช้

จากรูปนี้ จะเห็นว่าตอนแรกเราทำการกำหนด Argument ต่าง ๆ ที่เราต้องการให้รูปภาพทั้งหมดที่เราเลือกมีขนาด หรือหน้าตาแบบนั้นโดยที่รูปสำหรับ Train เราจะกำหนดแบบนึงแล้วเก็บไว้ใน train_datagen ส่วน Test ก็กำหนดอีกแบบ แล้วเก็บไว้ใน test_datagen

จากนั้นเราก็เรียกใช้มันตอนที่เรา Generate Test และ Train โดยชุดข้อมูลที่ได้เก็บไว้ในตัวแปรชื่อ train_generator (มี 1600 รูป และ 6 คลาส) และ validation_generator (มี 927 รูป 6 คลาสเช่นกัน)

เช็คกันสักหน่อยว่า ใน train_generator 6 คลาส มีคลาสอะไรกันบ้าง

Note: สิ่งที่เราทำกันจริงๆจะเหลือ 5 คลาส เนื่องจาก Trash เป็นขยะทั่วไป ไม่ใช่ขยะ Recycle ที่เป็นเป้าหมายของเรา

Step 2 & Step 3: Extract Features + Train Model

เนื่องจากทีมงาน Coding ของเรารวบขั้นตอนนี้ไว้ด้วยกัน เพราะงั้นอธิบายไปด้วยกันเลยย 😜

เราเลือกใช้ CNN (Convolutional Neural Network) Model

[CNN เป็นคอนเซ็ปต์ที่จำลองการมองเห็นของมนุษย์ ที่จะเห็นเป็นพื้นที่ย่อย ๆ แล้วเอามามองรวม ๆ ผสานพื้นที่ย่อยนั้นเข้าด้วยกันดู ว่าสรุปแล้วเรามองเห็นอะไร 😯]

เอ…ถ็าดูอันนี้ดูออกมั้ยน้า ว่ารูปเต็มมันเป็นรูปอะไร ไม่หรอ? งั้นดู…
รวมกับอันนี้ล่ะ พอเดาออกมั้ย? ยังหรอ?
งั้นดูอันนี้ไปอีก
อันนี้อีก
ดูส่วนนี้ด้วย
แล้วส่วนนี้ล่ะ

เป็นยังไงเอ่ย? พอรวม ๆ กันแล้ว พอจะเดาออกกันบ้างหรือยังน้าา… ถ้างั้นเราไปดูรูปเต็มกันเลยดีกว่า! แล้วรูปนี้ก็คือ….

.

.

.

รูปกระต่ายนั่นเอง!! 😶 😯 😮

ถ้าดูแบบง่าย ๆ กรอบสีเหลืองแสดงจุดสนใจในการมองแบบ Feature Extraction หรือเป็นการมองแบบแยกคุณลักษณะ ก็คือคนเราเนี่ย จะมองเห็นเส้น เห็นสี เรามองแล้วรู้ว่าตรงนี้มันเป็นเส้นตรง เส้นตัด หรือสีตัดกัน เพราะเราจะมองทั้งจุดที่เราสนใจ แล้วก็บริเวณรอบ ๆ ประกอบกันไป

พูดกันง่าย ๆ คือ ตอนนี้สายตาเราจ้องที่พื้นที่ในกรอบสี่เหลี่ยม (หรือไม่ก็จ้องรูปเล็ก ๆ ที่ตัดแยกออกมาจากรูปนี้ ที่เราให้ทายกันทางด้านบน ☝️) แต่ไอ้พื้นที่ตรงนั้นมันมีเส้นโค้ง ๆ สีตัด ๆ กัน แค่นั้นเราไม่รู้หรอกว่ามันคืออะไร แต่เราจะรู้ว่ามันเป็นรูปกระต่าย (หรือไม่รู้เพราะรูปมองไม่ออก 😏) จากการที่เรามองทั้งในจุดสนใจ และบริเวณรอบ ๆ รวมกัน

รูปนี้เป็นการเรียกใช้ Class ของ Tensorflow ในการสร้าง CNN Model เนื่องจากเรากำลังทำงานกับรูปภาพ บน layer ที่ใช้ Conv2D จึงมีการกำหนด Padding= ‘same’ เพื่อให้รูปภาพมีขนาดเท่า ๆ กันก่อนนำไปเข้า Model ด้วย

จากรูปนี้ คือ เราใช้ mobilenet (เป็นโมเดลขนาดเล็กที่มี Latency ต่ำ ใช้การประมวลผลน้อย เหมาะสำหรับงานที่มีทรัพยากรจำกัด สามารถทำงานได้ทั้ง Classification, Detection, Embededding และ Segmentation) ในการ Classify รูปภาพ

จากนั้นก็ใช้ Flatten ในการแปลงภาพจากหลาย Channel ให้เป็น Vector เพื่อส่งต่อให้ layer ถัด ๆ ไป

เสร็จแล้วก็สั่ง Complie Model… ทีนี้พอเราสร้าง และตั้งค่าโมเดลเรียบร้อย เราจะใช้ model.fit เพื่อ Train Model โดยที่เราจะส่งตัว train_generator และ epochs (คือจำนวนรอบที่โมเดลจะถูก Train) เข้าไป

เป็นอันเสร็จสิ้นภารกิจของ Step 2 และ Step 3!! 👍 👍 👍

Step 4: Test Model

หลังผ่านการฝึกฝนมาอย่างหนัก ถึงเวลาทดสอบความสามารถ Model เราแล้วในขั้นตอนนี้

เริ่มจากเรารับ Input ของรูปภาพที่ต้องการจะ Predict เข้ามา แล้วจัดการ Resize มันเสียให้เรียบร้อยก่อน แล้วค่อยสั่ง Predict

ซึ่งมันก็จะให้ผลลัพธ์ออกมาเป็น Array ว่า มันมี probability ที่จะอยู่คลาสไหนเท่าไหร่ แต่ดูแบบนี้ก็จะงง ๆ เพราะฉะนั้น… ก็มาทำให้มันดูง่ายขึ้นแบบนี้

รูปก็คือเอา ค่าที่ได้มาเป็น Array เมื่อกี้นี่แหละ มาทำเป็น Bar Chart แล้วจากรูปเราก็จะเห็นว่า โมเดลของเราทำนายว่ารูปที่ใส่เข้ามาเป็นกระดาษมากที่สุด ในขณะที่ Probability ของคลาสอื่น ๆ ถึงกับติดลบเลยทีเดียว 😅

ดังนั้น มันจึงบอกเราว่ารูปนี้ คือกระดาษ… แล้วมันใช่มั้ยนะ? ลองเช็คดูหน่อยซิ

Bingo!! 😆

รูปที่เราใส่เข้ามาเป็นกระดาษจริง ๆ ด้วย!! แบบนี้ก็ถือว่า มันโมเดลของเราพอใช้ได้ในระดับหนึ่งล่ะนะ

ทดสอบไปหนึ่งรูป Model เราตอบถูก แต่นายยังต้องโดนทดสอบอีกเยอะเจ้า Model

Step 5 Evaluation

ขั้นต่อไปคือการทำ Model Evaluation ซึ่งจะประเมินผลว่า Model เราเก่งจริงรึเปล่า เมื่อเจอ Test Set ที่เราเตรียมไว้ให้มันลองตอบในตอนแรก ตัววัด Performance หลักของ Classification Model ก็คือการวัดความถูกต้องในการทำนาย (Accuracy) ของมันนั่นเอง

ค่า Accuracy เป็นค่าที่แสดงความแม่นยำของโมเดล

Training Loss เป็นการคำนวนค่า Loss จากข้อมูลที่ใช้ในการ Train Model

Validation Loss เป็นการทดสอบดูว่าถ้าเราเอาโมเดลไปใช้งานจริง แล้วมาเจอกับข้อมูลที่โมเดลไม่เคยเห็นมาก่อน จะยังทำงานได้ตรงตามที่เราต้องการหรือเปล่า

ค่า Loss จะลดลงเรื่อย ๆ ตามรอบคำนวณ (หรือ Iteration) ที่เพิ่มขึ้น

จากกราฟ จะเห็นได้ว่าค่า Accuracy ยังอยู่แค่ประมาณ 40–50% ไม่ถือว่าสูงมาก แต่ค่า Accuracy และ Loss เป็นไปในทิศทางเดียวกัน (แม่นยำเพิ่มขึ้น Loss น้อยลง) ดังนั้น น่าจะยังไม่มี Overfit (หมายถึงการที่โมเดลเริ่มเทรนข้อมูลที่ไม่ถูกต้อง มีการถูกรบกวน หรือเรียกว่า noise ส่งผลให้โมเดลไม่สามารถทำนายข้อมูลอย่างถูกต้องได้) เกิดขึ้น เพราะฉะนั้นเราน่าจะเพิ่มรอบการเทรนข้อมูล เพื่อความแม่นยำที่มากขึ้นได้

แต่โมเดลของเราก็ไม่ได้แย่นะ เพียงแค่เราต้องรวบรวมข้อมูลสำหรับส่วนของ Train และ Test ให้มากขึ้น แล้วเทรนโมเดลให้หลายรอบมากขึ้น มันก็น่าจะนำไปพัฒนาต่อ ยอดได้ดีเลยทีเดียว

และแล้วก็จบ Step ที่ 4 ไปแบบสวยงาม ต่อไปก็…

Step 6 Deploy Model

เมื่อโมเดลของเราฉลาดพอที่จะนำไปใช้งานได้แล้ว เราก็จะมาทำการ Deploy Model หรือทำเป็น API ไว้ใช้งานกับหน้า Interface ต่าง ๆ หรือ แอปต่าง ๆ ต่อไป

โดยเริ่มจากเขียนหน้า API แบบนี้

จากนั้นก็ทำการ run API บน localhost ดูก่อนว่าใช้งานได้ตามที่คิดไว้ จากนั้น ก็อัพโหลด API ขึ้นไปบน Server ของ Heroku โดยทำตามขั้นตอนในบทความนี้

จากนั้นก็เรียบร้อย เราสามารถ ใช้งาน API บน Server ของ Heroku ได้แล้ว!

นี่เป็นรูปที่เราอัพโหลดให้โมเดล ในคลิปด้านบนขอรับ 😆

In Conclusion

สรุปเรื่องที่เราได้เรียนรู้จากการทำงานชิ้นนี้ หลัก ๆ ก็คือ Concept ของการทำ Machine Learning และการทำ Pipeline แล้วยังได้เรียนรู้วิธีการสร้าง API รวมไปถึง Deploy Model ขึ้น Public Server ด้วย

Moreover

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

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

ในกรณีที่มันฉลาดมากพอจะแยกแยะขยะได้หลายประเภทแล้ว เราอาจจะสามารถทำตู้ขยะอัตโนมัติที่สามารถแยกขยะตามประเภทให้เราได้เอง โดยที่เราไม่ต้องยืนงงว่าควรทิ้งลงช่องไหนดี อืม… ถ้ามีอะไรแบบนั้นให้ใช้จริง ๆ

มันก็คงเจ๋งไปเลยใช่มั้ยล่ะ!

Consequently

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

THE END… 👏 👏 👏

--

--