ที่มา: https://inwfile.com/s-fm/q4y54w.jpg

เป็นสิวใช่ไหม? ให้ AI ช่วยคุณสิ

BOTNOICV_FUN03
BotnoiCV_fun03
Published in
7 min readMar 6, 2021

--

คุณกำลังประสบกับปัญหาสิวบนใบหน้าอยู่หรือเปล่าคะ?

สิว ปัญหากวนใจสาวๆหลายคน สารพัดคำถามยอดฮิตที่คุณยังไม่สามารถตอบได้ ไม่ว่าจะเป็น ฉันเป็นสิวรุนแรงแค่ไหนนะ? เป็นสิวแบบนี้ต้องไปหาหมอหรือเปล่า? ฉันควรใช้ยารักษาแบบไหนดี? ตอนนี้ฉันยังไม่ว่างไปหาหมอมีวิธีดูแลรักษาเบื้องต้นไหม? แต่จะดีไหมคะ ถ้าคุณสามารถสร้าง AI เพื่อช่วยวิเคราะห์ความรุนแรงของสิวคุณได้ แล้วนำไปพัฒนาต่อเป็น Chat Bot เพื่อช่วยแนะนำการดูแลรักษา พร้อมทั้งผลิตภัณฑ์ที่เหมาะสมกับความรุนแรงของสิวคุณได้ เอาหล่ะค่ะมาเริ่มสร้าง AI เพื่อบอกลาปัญหานี้ไปพร้อมๆ กันดีกว่าค่ะ

มาเริ่มต้นสอน AI ให้เป็นหมอดูกันเถอะ

AI หรือ Artificial Intelligence นี่มันไม่ได้เก่งมาตั้งแต่แรกนะคะ เราจะต้องแปลงร่างเป็นคุณครูใจดีสอนมันให้เป็นหมอดูทำนายสิวที่เก่งก่อน โดยการสอนมันผ่าน Input ซึ่งในที่นี้คือรูปสิวต่างๆ และ Output คือความรุนแรงของสิว เจ้า AI มันจะไปทำการเรียนรู้ผ่าน Algorithm ให้ตัวเองกลายเป็นหมอดูที่สามารถตอบได้ว่ารูปสิวแบบนี้ มีความรุนแรงแบบไหน เราเรียกกระบวนการนี้ว่า “Machine Learning” หรือ “การเรียนรู้ของเครื่องจักร” ค่ะ

โดยที่ Model ที่เราสนใจ จะเป็น Model ทาง “Supervised Learning” เพราะว่า ข้อมูลของเรานั้นมี Label หรือ คำตอบ นั่นเอง

ที่มา: https://miro.medium.com/max/700/1*AOh7p7f0MYj-fkHSrrNdGg.png

ซึ่งในการสร้าง Model หลักๆ จะแบ่งได้อยู่ 2 แบบใหญ่ๆ (โดยทั่วไปในฝั่ง Supervised Learning ) คือ

อยากรู้เพิ่มเติมลอง Search หาคำว่า Machine learning ดูสิคะ

  1. Classification Model
Classification Model ไว้จำแนกกลุ่ม

2. Regression Model

Regression Model ไว้ทำนายค่าในเชิงตัวเลข

ซึ่งมันแตกต่างกันตรงที่ Classification ไว้บอกหรือจำแนกว่าอยู่กลุ่มไหน เช่น จัดกลุ่มว่าเป็น ข้อมูลชุดไหน สีเหลืองหรือ สีเขียว ส่วน Regression ใช้ทำนายว่า ถ้า X เท่ากับ 10 จะได้ Y เท่ากับเท่าไหร่

โดยกระบวนการในการทำ Machine Learning จะถูกเรียกว่า Machine Learning Pipeline ค่ะ ซึ่งเป็นกระบวนการในการเก็บรวบรวมข้อมูล จัดการกับข้อมูล สร้าง Model (หมอดู) ตลอดจนนำ Model ที่ได้ไปปรับใช้ แบ่งเป็น 5 ขั้นตอนหลักๆ ด้วยกันค่ะ

1. Get Data

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

โดยรูปภาพที่ได้มีจะมีรูป สิว ระดับ 0 ทั้งหมด 387 รูป ระดับ 1 ทั้งหมด 473 รูป ระดับ 2 ทั้งหมด 139 รูป

2. Extract Feature

ในขั้นตอนนี้จะทำการสกัดคุณลักษณะ (Feature) ของรูปภาพ โดยทั่วไปก่อนการนำรูปภาพหรือข้อมูลมาใช้จะต้อง สกัด และ/หรือ เปลี่ยนให้อยู่ในรูปแบบที่สามารถใช้คำนวณได้ก่อน อาจจะเรียกขั้นตอนนี้ว่า “Data Preparation” ค่ะ

โดยทั่วไปในงาน Classification รูปภาพนั้น จะหนีไม่พ้นการใช้ model ประเภท CNN หรือ Convolutional Neural Network ค่ะ

แล้วทำไมกันหละ?

เพราะว่าในการ Extract Feature รูปภาพเพื่อใช้ใน Machine learning นั้นยากมาก ซึ่งพูดง่ายๆ ก็เหมือนกับข้อมูลมันไม่เป็น Structure Data หรือเรียกว่า “Unstructure Data” นั่นเอง

ที่มา: https://www.researchgate.net/figure/Example-of-feature-extraction-by-LIH-8-x-8-cells-8-bins_fig2_220745420

จากรูปจะสังเกตได้ว่าการจะสกัดออกมานั้นยากจริงๆ ทำให้เกิด Model ประเภท CNN ขึ้นมา

CNN คืออะไร ตามนี้เลยค่ะ

แต่ว่าของเรานั้นดีหน่อยเราใช้ Pre-train ของ Resnet50 ในการ Extract Feature

ทำให้จากเดิมที่เป็นแค่รูปภาพ ก็จะได้ Feature ตามนี้เลย

Feature คือ สิ่งที่ Resnet50 ดึงออกมาจากรูป ส่วน Label คือ บอกว่า รูปนั้นเป็นสิว ระดับไหน

3. Train Model

ในการ Train หมอดูของเรานั้น เราใช้ข้อมูลจากขั้นตอนที่แล้ว มาเข้า Model โดยที่ Model ต่างๆ ที่เราเลือกใช้เป็นประเภท Classification ดังแสดงตามรูปข้างล่างเลยค่ะ

โดยในการ Train หมอดู แต่ละครั้ง เราต้องทำการแบ่ง Train Test ก่อน การแบ่ง Train Test คืออะไรอะเหรอคะ?

“มันคือการแบ่งข้อมูลให้หมอดูไปเรียนรู้ว่าถ้าเจอสิวลักษณะแบบนี้ น่าจะเป็น สิวระดับไหน แล้วก็ให้หมอดูของเราเรียนรู้ไปเรื่อยๆ เรียกว่า Train ส่วน Test คือการสอบวัดระดับ หมอดูว่า ถ้าเจอ เหตุการณ์ หรือ รูป อื่นๆ หละ จะทำนายว่าอะไร แล้วแม่นแค่ไหน”

ซึ่งในข้อมูลของเรา สมมติว่ามี 100 % เราก็จะเอาข้อมูลไปสอน หมอดูซัก 80% (Train) ส่วน ที่เหลือ 20% (Test) ไว้ทดสอบว่า นายหมอดู ของเรามันทายแม่นจริงรึเปล่า

“แล้ว Train Test เท่าไหร่จะดีหล่ะ?”

โดยส่วนตัวคิดว่า ถ้าข้อมูลมันน้อยมากๆ ก็อาจจะปรับให้ Train มีเยอะๆ ส่วนถ้าข้อมูลมีมาก ก็จะปรับให้ Train น้อยลง แต่ส่วนมาก Train จะอยู่ใน Range 60% ถึง 80% “เพราะว่าถ้าหมอดูเราเรียนมาน้อยมันก็ ทายไม่แม่นไงละคะ”

ในที่นี้จะขอยกตัวอย่าง Model ซัก 3 ตัวนะคะ

Model ตัวแรก “ขอเสียงเพื่อนบ้านหน่อยเร็ว” ก็ คือ

K Nearest Neighbor

Algorithm ของมัน ง่ายมากๆ เลยค่ะ ก็คือ เวลาหมอดูทำนาย มันจะดึงข้อมูลที่ใกล้เคียงตัวมันเองที่สุดมา K ตัว แล้วมานับจำนวนว่าเพื่อนบ้านที่ใกล้เคียงมันทั้งหมด K ตัวนั้น เป็น Class อะไรมากที่สุด ได้ผลคือ

ตัวอย่าง KNN

ถามว่ามันดีไหมส่วนตัวว่ามันไม่ดี เพราะว่า ข้อมูลชุดที่ใช้ Train หรือ สอนมันเอง ยังได้แค่ ประมาณ 68% เอง เปรียบเทียบง่ายๆ คือ “เอาที่สอน มาสอบ อีกรอบ ยังไม่ดีเลย” ในด้าน Test ก็คือ สอบมันได้ แค่ 50% ก็ไม่ค่อยดีเท่าไหร่ แล้วถามว่า มีวิธีทำให้มันดีขึ้นไหม ตอบได้เลยว่า

มีค่ะ!!!!!!!

นั่นคือการทำ Tuning หรือ Find Tune หา Parameter ที่ดีที่สุดสำหรับ Model นั้นๆ ซึ่งส่วนมากใช้ Grid Search CV

ซึ่งตัว Grid Search นั้นเราจะต้องใส่ Parameter ที่คิดว่าจะทำให้ Model เราดีไปก่อนจากนั้นก็ทำ Cross Validation ตัวชุดข้อมูล เพื่อหาชุด Train Test ที่เหมาะสมกับ Model นั้นๆ ด้วย

แต่ๆๆๆๆๆ

ในกรณีของ KNN แตกต่างตรงที่มันมีให้ Tune ได้แค่ จำนวน K

แล้วจะ Tune ยังไง …. ก็ วน Loop ไปค่ะ..พี่สุชาติ

เอา K ประมาณ 50 ตัวพอ แค่นี้ก็ run ไป เกือบ ชั่วโมงแล้ว อ่ะ
กราฟ แสดงความสัมพันธ์ ที่ K เท่ากับ 3 จะได้ Error ต่ำสุด

ถามว่าดีขึ้นไหม ไม่เลยแต่ว่าอย่างน้อย ชุด Train ก็ยังดีขึ้นน้าา

Model ตัวที่สองคือ

XGBoost

แล้วทำไมต้องเลือก ตัวอย่าง XGBoost มา

ในการแข่งขัน Data Science ต่างๆ เช่น Kaggle จะมีเทพเจ้า Algorithm เกิดขึ้นมา ซึ่ง XGBoost หรือชื่อเต็มๆคือ “Extreme Gradient Boosting” ก็เกิดขึ้นมาจากการแข่งขันแบบนี้แหละค่ะ แล้ว XGBoost เนี่ยมันมันดียังไง ตามนี้เลยค่ะ

Parameter ที่ใส่ก็ สุ่มๆเอา

ได้ผลดีขึ้นเมื่อเทียบกับ Model KNN ก่อนหน้า คือได้ Train ประมาณ 98% ส่วน Test ได้ 69% ช่ายดีขึ้น

แต่ๆๆๆๆๆ มัน Overfit นี่หว่า

แล้ว Overfit คืออะไรกันนะ? อธิบายง่ายๆ คือ หมอดูของเราเนี่ยเก่งแต่ในข้อมูลเดิมๆ ชุดทดสอบเดิมๆ (Train) แต่พอเอาไปสอบจริงๆ (Test) กลับได้ผลไม่ดีเท่าที่ควร เช่นในกรณีนี้ Train ได้ตั้ง 98%โหยย เก่งจัง แต่พอไปสอบด้วยชุด Test กลับตกม้าตาย ได้แค่ 69% แล้วจะทำยังไงหล่ะ?

ก็ไป Tuning ไง

เอา parameter ประมาณนี้ก่อนละกัน คอม บ่นละ

ได้ผลดีขึ้นแต่ก็ยัง Overfit อยู่ดี

อย่างน้อยหมอดูของเรา ก็เดาแม่นขึ้นเยอะน้าา

Model ตัวที่สามคือ

Logistic Regression

Algorithm ก็คือ คล้ายๆกับ Regression แต่เพียงแค่ผลที่ทำนายมันจะต้องไปแปลงเป็นค่าความน่าจะเป็น (Probability) ก่อนนำไปทำนาย เช่น ผลที่ได้ออกมาเป็น

  • สิวระดับ 0 ที่ความน่าจะเป็น 0.2
  • สิวระดับ 1 ที่ความน่าจะเป็น 0.3
  • สิวระดับ 2 ที่ความน่าจะเป็น 0.5

ผลก็คือเราน่าจะเลือกว่า ถ้ารูปที่เข้ามาผลเป็นแบบนี้ก็คือตอบว่าเป็น สิวระดับ 2 นั่นเอง

Code นี้ เรา Tune ในทีเดียวเลย
ซึ่งเราใช้เวลาในการ Tune ประมาณ 120 นาทีเอง!!

ได้ผลคือ

ได้ผลดีน้า แต่ยังไม่เท่า XGBoost

ขอยกตัวอย่างเพียงเท่านี้ก่อนนะคะ

4. Test Model

ในส่วนนี้ จริงๆ แล้ว ผลก็มาจากข้อ Train Model ค่ะ แต่ว่า เมื่อเราทำ Model และ Tune เสร็จได้ผลตามนี้เลย

ซึ่งจากผลดังกล่าว ดูคร่าวๆ ทำให้เราเลือก XGBoost !!!

ทำไมเหรอ?

เพราะว่าในด้าน Train มันอาจจะ Overfit ไป “ ตั้ง 99.6 % ”แต่ว่าอย่างน้อย ด้าน Test มันก็ดีที่สุด “ 72.5 % ” นั่นก็คือ หมอดูของเรา สามารถทายได้แม่นที่สุดในชุดข้อสอบ Test นั่นเอง

XGBoost Test ได้ ตั้ง 72.5% แต่ Train ดันได้ 99.6% Overfit ไปอีก

แต่ถ้าดูในเรื่อง ของ Overfit เป็นหลัก ตัวที่น่าสนใจ ก็คงเป็น SVM เพราะว่าตอน Train อาจจะไม่เก่งมาก “ 81.9 % ” ตอน Test ก็ ยังพอรับได้ “ 65.0 % ” ซึ่งต่างจาก XGBoost 7.5%

ต่างอย่างงี้ก็รับได้อยู่นะ เพราะอย่างน้อย หมอดูก็ ไม่ได้ เก่งแค่ในห้องเรียน แต่ในโลกความเป็นจริงก็ ไม่หนีจากตัว Top อย่าง XGBoost เท่าไหร่นะ

Test ได้แค่ 65% แต่ ว่า ด้าน Train นั้น ได้ 81.9% ไม่ Overfit เลย

จริงๆแล้วการเลือก Model ไม่ได้ดูแค่เรื่องของ Overfit นะต้องดูในเรื่องของการทำนายของมันด้วย เช่น ค่าของ Precision Recall หรือ F1-score รวมๆ แล้วมันอยู่ใน Confusion Matrix แหละ อยากรู้เพิ่มตามลิ้งค์นี้เลย

5. Deploy Model

เมื่อเราได้ model สำหรับแยกประเภทความรุนแรงของสิวแล้ว เรามาเริ่มทำ Chat Bot กันดีกว่า

ขั้นแรกเราจะทำการ Deploy Code ของเราขึ้นไปบน Heroku จากนั้นเมื่อเราได้ API ที่สามารถใช้งานได้แล้ว ขั้นต่อไปเรามาทำให้น้อง Bot เรามีชีวิตด้วยการเข้าไปใช้งาน BOTNOI SMEs Platform ซึ่งเป็น platform สำหรับใช้สร้าง Chat Bot ในการโต้ตอบลูกค้าที่รองรับการเชื่อมต่อทั้งใน LINE และ Facebook Page อีกทั้งผู้ใช้ยังสามารถเพิ่ม Intent เพื่อให้น้อง Bot โต้ตอบผู้ใช้ได้ดีมากขึ้นด้วยนะคะ สะดวกมากๆ เลยค่ะ

BOTNOI SMEs Platform

น้อง Bot ที่เราสร้างขึ้นชื่อว่า “น้องผิวสวย” ค่ะ หลังจากทำให้น้องผิวสวยมีชีวิตแล้ว ขั้นต่อไปเราจะต้องมาสอนน้องให้เข้าใจภาษามนุษย์กัน โดยการเพิ่ม Intent ต่างๆ ค่ะ

น้องผิวสวย
intent ที่ทำให้น้องผิวสวยเข้าใจภาษามนุษย์

จากนั้นเราจะเพิ่มความสามารถของน้องผิวสวย โดยการต่อกับ API ที่เราสร้างมาจาก Model เพื่อให้น้องผิวสวยสามารถบอกเราได้ว่ารูปภาพที่ส่งเข้าไปนั้นเป็นสิวที่มีความรุนแรงระดับไหน มีวิธีการดูแลเบื้องต้นอย่างไร เหมาะกับผลิตภัณฑ์แบบไหน โดยเริ่มจาก

1. เป็นเพื่อนกับน้องผิวสวยก่อนนะคะผ่าน QR Code ของ Line Official ข้างล่างนี้เลย

Line Official เรื่องสิว สิว
QR Code

2. จากนั้นจะมีดอกเตอร์ผิวใส มาคอยแนะนำวิธีการใช้งานเบื้องต้นค่ะโดยการให้เราพิมพ์ “เป็นสิว” เข้าไปเพื่อเริ่มวิเคราะห์สภาพผิวได้เลยค่ะ

3. หลังจากทำตามที่ดอกเตอร์ผิวใสแนะนำแล้ว ดอกเตอร์ผิวใสจะบอกให้เราถ่ายรูปสภาพผิวหน้าของเรา เพื่อให้น้องผิวสวยทำการวิเคราะห์ แล้วน้องผิวสวยจะตอบกลับเรามาว่าเรามีสิวความรุนแรงระดับไหน พร้อมถามเราว่าต้องการรายละเอียดเพิ่มเติมหรือไม่

4. หากเราต้องการรายละเอียดเพิ่มเติมก็สามารถคลิกบอกระดับความรุนแรงของสิว เพื่อรับคำอธิบายถึงระดับความรุนแรงของสิวนั้นๆ จากนั้นถ้าต้องการคำแนะนำเกี่ยวกับการดูแลรักษาเบื้องต้น และผลิตภัณฑ์ที่เหมาะสมก็สามารถคลิกได้เลยค่ะ

คำอธิบายเกี่ยวสิวความรุนแรงระดับ 0 สิวเล็กน้อย (Mild Acne)
การดูแลรักษาเบื้องต้นสำหรับสิวความรุนแรงระดับ 0 สิวเล็กน้อย (Mild Acne)
ผลิตภัณฑ์ที่เหมาะสมกับสิวความรุนแรงระดับ 0 สิวเล็กน้อย (Mild Acne)

จากนั้นดอกเตอร์ผิวใสจะถามเราอีกครั้งว่าต้องการใช้บริการอีกครั้งมั้ย หากไม่ต้องก็จะจบการทำงานค่ะ

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

COLAB ของเรา #ยังไม่ได้ Tune นะคะ

จบไปกันแล้วนะคะสำหรับการสร้างหมอดูทำนายระดับความรุนแรงของสิวเรา พร้อมนำไปพัฒนาต่อเป็นน้อง Bot คอยแนะนำเราผ่านทาง Line Official แต่อย่างไรก็ตามหมอดูที่เราสร้างมานี้ ยังมีข้อบกพร่องที่เราสามารถนำไปพัฒนาต่อได้นะคะ คือหมอดูของเราเก่งกับ Training Data มากค่ะ แต่เมื่อเรานำมา Test กับ Testing Data แล้วพบว่า Accuracy ต่ำมาก เราเรียกพฤติกรรมของหมอดูในลักษณะนี้ว่า “Overfit” ค่ะ ซึ่งเราสามารถปรับปรุงหมอดูได้หลายทางเลยค่ะ ไม่ว่าจะเป็นลดความซับซ้อนของหมอดูเราลง รวบรวมข้อมูลที่นำมาสอนหมอดูให้มากขึ้น หรือปรับในเรื่องของการ Regularization ค่ะ นอกจากนี้ข้อมูลที่เรานำมาสอนหมอดูยังมีความ Imbalance อยู่มาก คือมีข้อมูลของสิวประเภทใดก็ตาม ต่างกับประเภทที่เหลือมากๆ ถ้าเราสามารถแก้ไขปัญหานี้ได้ก็อาจจะทำให้ Accuracy ของหมอดูเราดีขึ้นได้ค่ะ

นอกจากนี้ในขั้นตอนที่ 3.Train Model ตัว Colab ที่เราแนบให้เป็นเพียง Model ก่อนที่เราจะทำการปรับ Tune Parameters เพื่อให้ Model เรามี Accuracy ที่สูงขึ้นค่ะ เนื่องมาจากระยะเวลาในการ Train Model และ Tune Parameters ที่ค่อนข้างนาน เราจึงนำ Model ของเราไป Train และ Tuneในคอมพิวเตอร์ที่มีประสิทธิภาพที่สูงขึ้นค่ะ

สุดท้ายนี้บทความนี้เป็นส่วนหนึ่งของ BOTNOI Fundamental Computer Vision ใน Image Classification Project ของกลุ่ม BotnoiCV_Fun03 ค่ะ หวังว่าบทความนี้จะมีประโยชน์กับเพื่อนๆ ไม่มากก็น้อยนะคะ ฝากติดตามบทความต่อๆ ไปของกลุ่มเราด้วยค่ะ อย่าลืมกดติดตาม กดแชร์ กดปรบมือเพื่อเป็นกำลังใจให้พวกเราด้วยนะคะ แล้วพบกันใหม่ค่ะ 🙏❤.

ผู้เขียน

--

--