Sushi Classification | Machine Learning Project

Anu Wat
3 min readSep 1, 2020

--

Team members: Pranpaveen Lay. , Anu Wat , Nan, Earth , Captain, Mai, M, Non, Oor, Q, Ong, Peam, Kanat, Roung, Tum, Ton, Dee

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

สำหรับสัปดาห์ที่สองของคอร์สเรียน DSE ก็เป็นเรื่องของ Machine Lerning ซึ่งแน่นอนว่าแต่ละสัปดาห์ก็จะต้องมาพร้อมกับโจทย์ที่สนุกสุดท้าทายมาให้แต่ละกลุ่มได้ทำกัน สำหรับโจทย์ในสัปดาห์นี้ทางทีมงานได้ให้เวลาในการทำทั้งหมด 2 สัปดาห์เนื่องจากตัวโปรเจคเองนั้นค่อนข้างที่จะต้องใช้เวลาและมีบางเรื่องที่ทางกลุ่มจะต้องทำการศึกษาเพิ่มเติม เช่น การ Deploy API เพื่อให้สามารถนำ API ไปใช้ได้กับเว็บไซต์ https://openapi.botnoi.ai/ ซึ่งเปรียบเสมือน Marketplace ของ API ให้เราสามารถเข้าไปเรียกใช้งาน API ต่างๆที่ได้มีนักพัฒนาได้พัฒนาไว้ จึงทำให้โปรเจค Machine Learning ในสัปดาห์นี้ถือเป็นโจทย์ที่มีความท้าทายพอสมควรซึ่งจะมาพร้อมกับความสนุกต่างๆที่จะเกิดขึ้นตลอดสองสัปดาห์ของการทำโปรเจคในกลุ่ม 13 ที่ว่ากันด้วยเรื่องของการคัดแยกหน้าซูชิ ( ถือเป็นโปรเจคที่ทำไปหิวไปเลยทีเดียวครับ )

ทำไมต้องเป็นซูชิ ?

ซูชิเป็นอาหารที่ใครหลายๆ คนน่าจะชื่นชอบและหลงไหลกับอาหารญี่ปุ่นชนิดนี้ซึ่งด้วยความที่ซูชิมีหลายหน้าและที่สำคัญคือมีหลายชื่อ หลายครั้งเวลาเราไปตามร้านอาหารญี่ปุ่นบางทีก็ไม่ทราบว่าหน้าต่างๆ มีชื่อว่าอะไร ทำให้ทางกลุ่มจึงคิดกันว่าลองมาสร้าง Model สำหรับใช้จำแนกซูชิหน้าต่างๆออกจากกันก็เป็นอะไรที่น่าสนใจและเรื่องอาหารเองก็เป็นเรื่องที่ใกล้ตัว ใน class เรียนเองก็มีการสอนทำ Image Classification ก็เลยเป็นเหตุผลในการเลือกทำเรื่องการจำแนกหน้าซูชินั่นเองครับ

ref : https://image.spoonwalk.com/static/upload/1593592299388.png

สิ่งสำคัญ

เมื่อเลือกเรื่องที่จะทำกันได้แล้วขั้นตอนต่อไปก็คือการดำเนินงานไปตาม Pipeline ซึ่งถือเป็นเรื่องที่สำคัญมากและทาง Botnoi ก็ให้ความสำคัญกับเรื่องนี้มากๆครับ เนื่องจากการที่เราสามารถสร้าง pipeline ออกมาได้จะทำให้การทำงานด้าน Machine Learning ของเรามีระบบระเบียบ สามารถปรับปรุง Model และทดลองสิ่งต่างๆให้กับ Model ของเราได้ง่ายขึ้นและการทำงานด้าน Machine Lerning ของเราก็จะมีประสิทธิภาพมากขึ้นนั่นเองครับ

1) Get Data

สำหรับการหารูปภาพที่จะนำมาใช้ในการ train model ก็จะใช้วิธีการ scrap รูปจาก google image ด้วยใช้ Libary ของ Botnoi ซึ่งปัญหาที่พบก็คือรูปภาพที่ได้หลายรูปเป็นรูปที่ไม่สามารถนำมาใช้ได้ เช่น เป็นรูปที่ไม่เกี่ยวข้องเลย(ไม่ใช่ซูชิ) เป็นรูปที่มีซูชิหลายๆหน้ารวมอยู่ด้วยกันจึงทำให้ต้องมีการมาคัดเลือกรูปกันอีกที ท้ายที่สุดก็เลยได้รูปตามที่ต้องการ โดยมีหน้าทั้งหมด 6 หน้า คือ Ebi, Ika, Ikura, Salmon, Maguro Uni

2) Model

ทางกลุ่มได้มีการแบ่งหน้าที่กันในการเลือกใช้เครื่องมือต่างๆ สำหรับการทำ feature extraction ซึ่งทางกลุ่มได้มีการใช้ mobilenet , resnet50 ซึ่งแต่ละ Model ใช้หลัก Convolution Neural Network ในการดึง Feature ออกมาจากรูปภาพ

2.1 ใช้ Transfer learning ด้วย MobileNet V2

colab : https://colab.research.google.com/drive/1SJn9TONSYIduHjHaFOtotEy0saio8_9E?usp=sharing

  • คงค่า weight ของ MobileNet V2 เอาไว้ (ไม่ให้เปลี่ยนแปลงตอนเทรน)
  • นำผลลัพธ์จาก MobileNet V2 มาทำการ global average pooling และนำไปเข้า fully connected layer ดังนี้
  • ขั้นตอนเทรนเนื่องจากจำนวนข้อมูลมีไม่มากจึงใช้ Keras Image Data generator เพื่อช่วยเพิ่มdataด้วยการทำ Augmentation
  • ผลลัพธ์: โมเดลมีความแม่นยำประมาณ 89% บน testing data (หลังจากการทำ Cross-validation)
  • Accuracy:
  • Loss
  • ความแม่นยำในแต่ละ class

2.2 ใช้ Resnet50

โดย feature ที่ได้จาก resnet50 จะนำมาทำการ classify โดยให้ Linear SVC (Linear Support Vector Classification) ในการแยกหน้าซูชิแต่ละหน้า

colab : https://colab.research.google.com/drive/1_XAaR3bsiJtv6LDy6CPfOvvXKdf6OZ04?usp=sharing#scrollTo=ATIxLfLXZwU5

3) Deploy Model

เมื่อได้ Model ที่พร้อมสำหรับการนำไปจะแนกหน้าซูชิแล้ว (โดยทางกลุ่มได้เลือก Modelตัวที่ 1 ) ก็ได้ทำการ Deploy ตัว Model ไปที่ Could Web Service ซึ่งในครั้งนี้เลือกใช้ Heroku หลังจากนั้นก็นำ API ไปเชื่อมเข้ากับเว็บไซต์ https://openapi.botnoi.ai/ ซึ่งสามารถเข้าไปใช้งานได้ที่ https://openapi.botnoi.ai/dashboard/api/sa-sushiclf โดยการใส่ url ของรูปภาพของ Sushi ที่ต้องการให้ Model ทำนาย (ลองเอา Url ใต้ภาพไปลองใส่ได้เลยครับ )

URL : https://www.thefishsociety.co.uk/media/image/56/49/d3/Salmon-belly-sashimi-web-shot-3.jpg

สำหรับวิธีการ Deploy ไปที่ Herokuสามารถดูได้ตาม web นี้เลยครับ https://link.medium.com/suPBsZ0Sb9

มาลองทายหน้าซูชิกัน :

จากโปรเจคที่ทางกลุ่มได้สร้าง Model สำหรับการจำแนกซูชิหน้าต่างๆ ด้วยกระบวนการทั้งหมดที่ทางกลุ่มได้ดำเนินการเพื่อให้ได้ Model ที่ดีที่สุดเพื่อใช้ในการจำแนกซูชิ และมีการ Deploy ตัว API เพื่อให้สามารถเรียกใช้ตัว Model ในการจำแนกหน้าซูชิได้ผ่านช่องทางต่างๆ และเพื่อให้ผู้คนที่สนใจสามารถเข้าถึงได้ง่ายผ่านการถ่ายรูปในโทรศัพท์มือถือทางกลุ่มจึงได้สร้าง Line Bot ที่ผู้ใช้เพียงถ่ายรูปซูชิหน้าต่างๆ ที่ต้องการทราบว่ามีชื่อว่าอะไรส่งมาใน Line Bot แล้วมาลองดูกันนะครับว่าตัว model ของเราจะทายได้แม่นยำหรือไม่ ว่าแล้วก็ @227uxzjq ไปลองเล่นกันได้เลยครับ

สรุปผลและการประยุกต์ใช้

  • Model ที่ 1 ใช้ Transfer learning ด้วย MobileNet V2 มีค่า Accuracy 89%
  • Model ที่ 2 ใช้ Resnet50 มีค่า Accuracy 79%

*** ข้อสังเกต***
Accuracy ของ model 1 ดีกว่า 2 เนื่องจาก
1) model 1 มีการทำ image augmentation
2) model 2 ให้ Classifier เป็น Linear SVC ขณะที่ model 1 เป็น neural network

  • โมเดลถือว่ามีความแม่นยำพอสมควรสามารถนำไปต่อยอดกับซูชิได้อีกหลายประเภทที่คนไม่ค่อยรู้จัก หรือ สามารถนำไปประยุกต์ใช้กับ Object detection เพื่อระบุว่าในจานมีชูชิอะไรบ้าง

--

--