ฝึกเเปลความภาพภาษามือด้วย Deep Learning✋ 💁 🙋 👐 Botnoi-Classroom-Weekly Project 2:

Tonklar Khaimuk
botnoi-classroom
Published in
6 min readSep 1, 2020
Team Member Group 17 BOTNOI DSE
1.Earth M @methdevth
2.PisutW
3.Noikku Wararat
4.Nueng
5.PkP
6.Astuma_Saru
7.Natt
8.Plern Warittha
9.CherylKoong
10.Namo
11.Jaturun
12.TK
13.Tae
14.May

สวัสดีครับ กลับมาอีกครั้งกับทีม Botnoi Data Science Essential Group 17

จากโจทย์ของ Data Science Essential Botnoi Classroom ในสัปดาห์แรกเรื่อง Data Analytics ที่กลุ่มของเรานำเสนอในเรื่องของ Trending Youtube Video Statistics ไปแล้ว งานสัปดาห์นี้ เป็นโจทย์จากสัปดาห์ที่ 2 เเละ 3 ต่อเนื่องกัน ซึ่งเป็นเรื่องของ Machine Learning เเละ Predictive Model โดยให้แต่ละกลุ่มเลือกเรื่องที่สนใจ เพื่อมาสร้าง Model ได้ สำคัญตรงที่ก่อนที่จะมาจับทางเทคนิคนี้ เรามีกระบวนการอะไรบ้าง เราจะมาเเจกเเจงตั้งเเต่หัวข้อกันจนถึงการสรุปผล

1. ทำไมเลือกทำหัวข้อนี้ 🎩

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

https://www.thai-translating.com/wp-content/uploads/2019/10/%E2%80%94Pngtree%E2%80%94love-by-fingers-from-american_3714748.png

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

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

2. หาข้อมูลกันอย่างไร ❓

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

3. การนำข้อมูลไปใช้สร้างโมเดล 💁

3.1 การรวบรวมข้อมูล (Data Collection)

ก่อนอื่นเลยเราต้องมีข้อมูลเพื่อใช้เป็นชุดข้อมูลที่จะนำมา Train Test โมเดลโดยเริ่มแรก ชุดข้อมูลในแต่ละท่าทางของภาษามือต่างๆอยู่ใน google drive ที่ได้รวบรวมกันมา ถ้าเราสังเกตในขณะนี้แต่ละภาษามือก็จะมี folder ซึ่งทำหน้าที่เป็น label หรือสิ่งที่ต้องระบุให้กับ model ว่าภาพแต่ละภาพนั้นเป็นท่าทางอะไร

ชุดคําสั่งนําไฟล์เข้ามา

จากนั้นเราใช้ library glob.glob เพื่อนำไฟล์ที่มีสกุล .jpg หรือ .JPG นำมาเป็นข้อมูลภาพผ่านไลบรารี cv และนำชื่อไฟล์มา split เอาตำแหน่งที่เป็น label นำไปใส่ใน y จากนั้นเปลี่ยนข้อมูลใน format ของ numpy array

3.2. การ clean ข้อมูล (Data cleaning)

จากนั้นเราจะนําข้อมูลมาผ่านกระบวนการต่างๆรวมสามวิธีโดยมีรายละเอียดดังนี้

3.2.1 First Data cleaning Method : ลองแบบเบสิกไปก่อน

แบบแรกจากเราก็ได้ข้อมูลพร้อมกับ label ของมันมาเรียบร้อยโดยในที่นี้จะเริ่มจากภาพสีที่เกิดจากการเฉลี่ยให้กลายเป็น format สีเทาก่อน(ตามปรกติ pixel แต่ละอันจะประกอบไปด้วยสีสามค่า RGB แต่เราจะทําการเฉลี่ยมันให้กลายเป็นสีเพียงค่าเดียว เช่นใน หนึ่ง pixel มีค่าสี 240,242,244 ก็จะทําการเฉลี่ยเป็น 242)พร้อม resize เป็น 240,240 ก็จะได้ภาพขนาด (240,240,1)

แสดงการ resize

สาเหตุที่ทำแบบนี้เพราะ

  • จะทำให้train modelได้ไว
  • ทำให้ไม่มี bias เรื่องของขนาด

3.2.2 Second Data Cleaning Method : Augmented(Rotate+Translation)

การทดลองชุดที่สองคือลองใช้ภาพแบบสีแต่คราวนี้เราจะ augmented หรือเพิ่มภาพหลายๆแบบให้โมเดลได้เรียนรู้ภาพที่แตกต่างกันมากขึ้นโดยจะให้ภาพหมุนและเลื่อนซ้ายขวา บนล่างสาเหตุที่ทำแบบนี้เพราะ โมเดลจะได้มีความ generalize มากขึ้นกับรูปในแบบต่างๆ ไม่ใช่เฉพาะภาพตรงอย่างเดียวโดยอาศัยคำสั่ง ImageDataGenerator ใน tf.keras.preprocessing.image

การทำงานของมันก็คือในแต่ละครั้งที่นำไปเทรนจะtransformรูปแบบสุ่มเพื่อรอการเทรนาจากนั้นนำไปเอาข้อมูลที่จะ train fit กับตัว datagen ที่เราสร้างขึ้นก็จะได้ที่เรา gen ได้สมบูรณ์

3.2.3 Third Data Cleaning Method : Augmented(Rotate+Translation+Rescale+Normalization)

การทดลองชุดที่สามคือลองต่อจากแบบที่สอง คือใช้ภาพแบบสีแบบเดิมแต่คราวนี้เราจะ augmented เพิ่มภาพการ normalization และการ rescale สาเหตุที่ทำแบบนี้เพราะ โมเดลจะเรียนรู้ภาพโดยที่มี bias น้อยลงได้เพราะบางภาพอาจมีการกระจายสีที่ต่างกันเพราะทุกภาพจะถูก Normalization เท่าๆกัน

จากนั้นนำข้อมูลที่จะ train ภาพก็จะนำไป fit กับตัว datagen ที่เราสร้างขึ้นก็จะได้ที่เรา gen ได้สมบูรณ์

3.3 สร้างโมเดล Deep learning (Model Creation and Extracting features : MCEF using DL)

3.3.1 First Method : trainสด+ First Data cleaning Method

https://www.researchgate.net/figure/Sample-generation-of-a-5-5-feature-map-as-the-result-of-the-2D-discrete-convolution-of_fig1_308853748

เรานำข้อมูลของเราไปเข้าโมเดล convolution หรือคือการนำ kernel ที่เป็น weight ขนาด k*k ไปคูณกับรูปภาพเพื่อสร้างเป็น feature ที่มีขนาดตารางใหม่ โดยซ้อน layer แบบนี้หลายๆชั้นเพื่อให้ปรับ weight ที่เหมาะสมที่จะ extract หรือดึงความแตกต่างของแต่ละรูปโดยเรียกว่า convolutional neural network (CNN) ที่เราจะสร้างขึ้นมาผ่านคำสั่งของ tf.keras.Sequential

จากนั้นก็เข้าสู่ขั้นตอนการ fit model เข้ากับข้อมูล train และ test หรือคือการนําข้อมูลไปให้โมเดลเรียนรู้

โดยแบ่งข้อมูลเป็น ชุดที่นําให้โมเดลไปเรียนรู้และชุดทที่จะนํามาทดสอบ ผ่าน train_test_split โดยในที่นี้จะใช้การแบ่งมาทดสอบ 30% ผ่านคำสั่ง

จากนั้นก็นำข้อมูล train_test_split ไป fit กับ model ที่สร้างเอาไว้และ validate ด้วยข้อมูลชุด test ก็จะได้ผลมาดังภาพ

ขณะนี้โมเดลของเราก็ได้เรียนรู้ภาพของเราเรียบร้อยรอนำไป evaluation กับข้อมูลชุดทดสอบ และแสดงผลการทำนายออกมาผ่านคำสั่ง

โดยโหลดโมเดลด้านบนที่ save ไว้มาใช้ทำนายและแสดงผลออกมาในรูปของ confusion matrix(ตารางซึ่งแสดงสิ่งที่เป็นจริงกับสิ่งที่โมเดลทํานาย) และ classification report(ตารางซึ่งแสดงค่าทางสถิติที่จะบอกถึงประสิทธิภาพโมเดล)

ได้ความแม่นยำค่อนข้างสูงเลยทีเดียว

3.3.2 Second Method : trainสด+ Second Data Cleaning Method

ทำแบบแรกเพียงแค่เปลี่ยนข้อมูลเป็นแบบที่สองเข้ามา

ได้ความแม่นยำในชุด train ประมาณเดิมแต่ในชุด test นั้นเปลี่ยนไปดังตาราง

3.3.3 Third Method : trainสด+ Third Data Cleaning Method

ทำแบบแรกเพียงแค่เปลี่ยนข้อมูลเป็นการ data cleaningแบบที่สองเข้ามา

พบความผิดปกติ

  • ที่เมื่อทำการ Third DC Method รูปทุกรูปเหมือนกันเกินไปทำให้แยกออกได้ยากจากการ Normalizationและ เปอร์เซ็นต์ acc ตกลงเรื่อยๆ รวมถึง validation accuracy ก็มีความผันผวน
  • นอกจากนั้นเพื่อยืนยันเรานำโมเดลไปลองกับชุดข้อมูลใหม่ก็ไม่ได้ให้ผลที่น่าพอใจโดยเราได้นำข้อมูลของแต่ละท่าทางอันใหม่ ท่าละ 10 ภาพไปเพื่อทดสอบเพิ่มเติมและพบว่าหากทำการ augmentation model มีแนวโน้มจะ overfit มากกว่าเพราะเปอร์เซ็นต์ accuracy ได้ต่ำมากๆ(ราว 3–10%)ได้วิธีการที่เหลือจึงไม่ได้นำข้อมูลไปทำตาม Second DC Method, Third DC Method และจะเปลี่ยนไปใช้ transfer learning แทน

3.4 Fourth Method : Resnet50 transfer learning+ First Data Cleaning Method
สามวิธีที่ผ่านมาล้วนเป็นการ train สดจากข้อมูลโดยไม่ได้อาศัยโมเดลที่มีอยู่แล้ววิธีนี้จึงอยากจะลองวิธีแบบ transfer learning ก็คือการนำโมเดลที่มีอยู่แล้วอย่าง resnet มาแล้วแอด layer เพิ่มเติมเพื่อทำการ fine tuning ต่อจาก resnet ที่มีการเทรนภาพจำนวนมากมาแล้วเพื่อลดการเรียนรู้รูปแบบเองจากโมเดลที่สร้างขึ้นมาใหม่จากการ train สด การเตรียมข้อมูลเหมือนวิธีที่สอง

ภาพจาก https://medium.com/bbm406f17/week-7-landmark-identifier-44981a1e23fc

ก่อนอื่นโหลด weight มาก่อนโดยเป็นของ Resnet50 และสร้าง neural network ต่อไปจาก resnet

ส่วนสำคัญคือ model.layers[0].trainable =False เพราะเราไม่ต้องการไปเปลี่ยน weight ใน resnet ดั้งเดิมที่มีอยู่แล้วเราก็จะได้ fine tuning มันได้โดยการใส่ layerเพิ่มเข้าไป เมื่อนำไป train และ ฟิตข้อมูลเรียบร้อยก็จะได้กราฟของ accuracy และ loss ของโมเดลต่อ epoch มาทั้งข้อมูลชุด validation และ train ดังนี้

ซึ่งแนวโน้มกราฟออกมาพอโอเคเลยทีเดียวจากนั้นก็นำไป evaluation กับชุด test ได้classification report มาดังนี้

confusion matrix เมื่อลองกับ test data confusion matrix เมื่อลองกับ test data ข้างนอกชุดข้อมูล

Classification report เมื่อลองกับ test data ข้างนอกชุดข้อมูล(ของ test data ปกติ accuracy สูง)

ซึ่งจะสังเกตได้เลยว่ามีความแม่นยำใน test data ที่สูงทั้งในและนอกชุดข้อมูลที่ใส่เข้าไปมากกว่าสามแบบแรกมากส่วนนึงก็มาจาการที่มัน overfit น้อยลงแปลว่าคำคาดการณ์ที่ว่าการ AUGMENTED ทำให้มัน overfit มากขึ้นก็มีแนวโน้มที่ถูกต้อง

ต่อจากนี้คือการนำ transfer learning อีกแบบมาใช้ในวิธีต่อไปก็คือ densenet121

3.5 Fifth Method : Densenet 121 transfer learning+ First Data Cleaning Method

ภาพจาก https://towardsdatascience.com/paper-review-densenet-densely-connected-convolutional-networks-acf9065dfefb

โดยจะแตกต่างในส่วนแรกและการสร้างโมเดลที่เหลือทำเหมือนเดิม

ไป เมื่อนำไป train และ ฟิตข้อมูลเรียบร้อยก็จะได้กราฟของ accuracy และ loss ของโมเดลต่อ epoch มาทั้งข้อมูลชุด validation และ train เบื้องต้นดังนี้

ซึ่งแนวโน้มกราฟในช่วง epoch ต้นๆออกมาพอโอเคเลยทีเดียวเช่นเดิมต่างกันแค่ช่วงท้ายๆมีความผันผวนมากกว่าจากนั้นก็นำไป evaluation ได้ accuracy ราวๆ 98–99% และเมื่อลองกับชุดข้อมูลได้ความแม่นยํา 50–60% มากที่สุดในบรรดาทั้งหมดจึงพร้อมที่จะนําไป deploy api ต่อไป

4. Deploy API กัน

4.1 เตรียมไฟล์ให้พร้อม deploy ต้องมีอะไรบ้าง

  1. model — ที่เราได้เทรนข้อมูลมา จะนำมาใช้ต่อ (model.h5 + model.json)
  2. requirements.txt — ไฟล์รวม library ที่จำเป็นต่อการทำนายข้อมูล
  3. Procfile — คำสั่งรัน app server
  4. runtime — python version ที่ต้องการรัน
  5. app.py — โค้ดชุดหลักสำหรับประมวลผลข้อมูลภาพ
app.py

4.2 ดู log ตอน deploy heroku

เช็คว่าลงเรียบร้อยดีไหม หลังจากที่ได้ลอง deploy ไปกว่า 17 รอบ ซึ่งพบปัญหามากมายใน การลง library เช่น slugsize ต้องไม่เกิน 500 mb

4.3 ลองยิงเล่นดู

Endpoint: https://botnoi17-w2.herokuapp.com/predict

Params:link=https://hilight.kapook.com/img_cms2/user/Tanapol/sanyarak/a8.jpg

เนื่องจากคิดอยู่นานมากว่า ทำ api โดยไม่มี front จะอัพโหลดรูปเข้า model ยังไง สุดท้ายเลย Work around ไปก่อนโดยให้ user ใส่ input มาเป็น link รูปภาพจากการไปฝากที่อื่นมาเเทน

เย้ ใช้งานได้สักที เราไม่ได้หวังความถูกต้องจากโมเดลมากนัก เราจะไปฝาก api กับ openapi botnoi กัน

ลองสวม api ด้วย openapi-botnoi ดู

ฝากไว้เรียบร้อย เเต่เนื่องจาก heroku server รองรับโหลดได้ไม่เยอะเท่าไหร่ อาจจะทำให้การเรียก api ประมวลผลนานครับ

เเปลความเป็นคำว่า ไทย

5.สรุปผลเเละการต่อยอด

จากผลทั้ง 3 โมเดล Densenet ให้ผลความเเม่นยำถึง 60% ลองสุ่มมาเทสจากข้อมูลชุดใหม่

ตัวอย่างชุดข้อมูลทดสอบลองมาเทสดูพบว่า..

จะเห็นได้ว่า คำว่า ประเทศ (1) ทายผิดบ่อยเป็นเพราะท่าทางของคำ จำเป็นต้องใช้หน้า ซึ่งบางคนได้ถ่ายหน้ามาเเละบางคนใช้นิ้วอาจะทำให้เกิด noise

ท่าทาง เป็น (8) กับประชา (9) คล้ายกันมากทำให้โมเดลยังจับได้ไม่ดีพอ

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

ในการต่อยอดถ้าเราทำให้ accuracy ด้วยภาพนิ่งสูงขึ้นกว่านี้ จะขยับไปเรียนรู้จากภาพเคลื่อนไหว เเละขยับไปเเปลเป็นเสียงเเทนคำบรรยาย เพื่อเป็นประโยชน์สูงสุด เช่น การเเปลข่าวบนทีวีเเล้วมีคำบรรยาย หรือ มีคนต้องการสนทนากับผู้ใช้ภาษามือสามารถหยิบโทรศัพท์ขึ้นมาเเปลความได้ทันที ไม่ต้องผ่านล่ามแปลภาษา กำแพงภาษาระหว่างผู้พิการทางการได้ยินและผู้อื่นก็จะลดน้อยลงและหายไปในที่สุด สำหรับวีคนี้ BOTNOI DSE Group 17 ขอตัวลาไปก่อนสวัสดีครับ

--

--