Categories
Computer Diary

Face Detection in my thesis

เทคนิคการจับภาพใบหน้ามีการพัฒนามานานแล้ว แต่ในปัจจุบันเทคนิคที่ได้รับการยอมรับพัฒนามาจาก deep learning และเทคนิคที่เอามาใช้คือ RetinaFace โดยนำมาเขียนในภาษาจาวาสคริป

ตอนนี้ธีสิสที่ทำอยู่เกี่ยวกับการวัดการเคลื่อนไหวของศีรษะและลำคอในผู้ป่วยที่เป็นมะเร็งศีรษะและลำคอที่ผ่านการทำกายภาพบำบัดที่เดิมจะให้หมอวัดองศาการเคลื่อนไหวของศีรษะและลำคอ (Cervical range of motion) แต่ทีนี้ติดปัญหาเรื่องความแม่นยำ และความน่าเชื้อถือของการวัด (reliability & validity) เราจะทำเป็นตัวโปรแกรมเพื่อให้ประเมินการเคลื่อนไหวจาก webcam แทน แล้วทีนี้ขั้นแรกของเราจะต้องทำคือการใช้เทคนิคการจับภาพใบหน้า (Face detection)

Face Detection

เทคนิคการจับภาพใบหน้า (Face Detection)

Face detection คือเทคนิคการจับภาพใบหน้าจากภาพที่เราต้องการให้จับ โดยเทคนิคนี้มีการพัฒนามาตั้งแต่ 20-30 ปีมาก่อนแล้ว แต่ยังติดปัญหาเรื่องความแม่นยำ ประสิทธิภาพในการทำงานเวลาที่เจอสภาพแสง กล้อง ภาพใบหน้าที่มีแว่นตา แมสบัง และประสิทธิภาพของคอมพิวเตอร์ที่ยังไม่ดีพอ

เทคนิคที่สามารถใช้งานได้จริงในยุคแรก ๆ ก็ได้รับการพัฒนาใน Paul Viola กับ Michael Jones ในบทความงานวิจัยที่มีชื่อว่า Robust Real-time Face Detection หลังจากนั้นมีการพัฒนาเทคนิคการจับภาพให้ดีขึ้นมาเรื่อย ๆ ได้แก่ Histogram of Oriented Graidents, Deformable Part Model และ Tree-based structure model เป็นต้น

ต่อมาหลังจากช่วงทศวรรษ 2010s เป็นต้นไป หลังจากการพัฒนาเทคนิคการเรียนรู้ Deep learning ของ AlexNet ที่ทดสอบภาพจากฐานข้อมูล ImageNet ให้ประสิทธิภาพที่ดี ร่วมกับประสิทธิภาพของคอมพิวเตอร์ที่ดีขึ้น Deep learning จึงเป็นเทคนิคที่นำมาใช้พัฒนาเทคนิคการจับภาพใบหน้าที่แม่นยำมากขึ้นเรื่อย ๆ เมื่อเทียบกับเทคนิคในสมัยก่อน จนล่าสุดงานที่เราทำก็เอาเทคนิคนี้มาใช้ซึ่งเทคนิคนี้เรียกว่า RetinaFace

RetinaFace

RetinaFace จากบทความ RetinaFace: Single-stage Dense Face Localisation in the Wild

RetinaFace เป็นเทคนิคการจับภาพใบหน้าเทคนิคหนึ่งที่ได้รับการตีพิมพ์ในงาน CVPR ปี 2020 ซึ่งเป็นเทคนิคที่ได้รับการยอมรับว่ามีความแม่นยำที่สูง ทำงานได้ดีกับสภาวะแสง กล้อง ภาพใบหน้าที่มีแว่นตา แมสบัง สำหรับคนที่ต้องการอ่านบทความงานวิจัยเพิ่มเติมค้นหาได้จากกูเกิ้ลได้เลยครับ โดยชื่อผลงานวิจัยชิ้นนี้มีชื่อว่า RetinaFace: Single-stage Dense Face Localisation in the Wild

เราเลยเอาเทคนิคนี้มาใช้ทดสอบเบื้องต้นก่อน (Preliminary Study) ว่าแม่นยำตามที่บทความพิมพ์จริงไหม โดยเอาตัวโค้ดที่ทางผู้วิจัยมาทดลองเรียนรู้ผ่านคอมพิวเตอร์ (training) แล้วเอามาทดสอบผ่านข้อมูล (dataset) ที่เผยแพร่บนอินเตอร์เน็ตได้แก่ WIDERFACE, 300W_LP และ BIWI kinect dataset พบว่ามีความแม่นยำที่สูง (ประมาณ 94-95% ส่วน 300W_LP ทดสอบแล้วได้ความแม่นยำประมาณ 98-99%)

Development of Application

เขียนโค้ดภาษา JavaScript

จากผลที่ได้เลยเอาเทคนิคนี้ที่เดิมพัฒนาอยู่ในภาษาไพทอนซึ่งเป็นภาษาที่นิยมในด้าน Data Science, AI และมีเครื่องมือช่วยเยอะมาก ได้แก่ PyTorch, Tensorflow, Caffe, ONNZ, numpy เป็นต้น มาพัฒนาในรูปแบบภาษา JavaScript ซึ่งมีข้อแตกต่างจากไพทอนอยู่พอสมควรเนื่องจากมันไม่มีเครื่องมือแบบเดียวกันที่มีในไพทอน เลยลองหาในเน็ตก็เจอว่ามันมีเครื่องมือที่เอาใช้ได้เช่น Tensorflow.js, ONNX.js, ndarray โดยลักษณะตัวเครื่องมือที่ใช้คล้ายกันกับไพทอน แต่ลักษณะการเขียนโค้ดที่แตกต่างกันออกไป ตัวอย่างเช่น

  • คำสั่งใน Numpy ทั้งหลายแหล่กับตัวเครื่องมือ Ndarray.js ก็ไม่เหมือนกัน ใช้ +,-,*,/ กับตัวแปร ndarray โดยตรงไม่ได้ ต้องทำผ่าน Ndarray ops
  • คำสั่งใน Tensorflow.js คล้ายกันกับ Tensorflow ในไพทอน แต่ไม่มีเครื่องมือ Keras ให้ในตัว Tensorflow.js
  • เทคนิค deep learning ที่เอามาแปลงให้ใช้กับตัว Tensorflow.js บางเทคนิคที่ซับซ้อนมาก ๆ อาจจะใช้งานตรง ๆ ไม่ค่อยได้เท่าไร พอแปลงมาแล้วทดลองให้จับภาพใบหน้าดูพบว่าตัวเครื่องมือไม่รู้จัก layer ที่ได้เขียนขึ้นมาใหม่ในไพทอน ได้แก่ Feature Pyramids Network

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

ผลที่ได้ตามภาพ

ปล. ภาพหน้าปกเอามาจากหน้านี้ในวิกิพีเดีย

One reply on “Face Detection in my thesis”

[…] โดยจากบทความที่แล้วที่พูดถึงการใช้เทคนิคการจับภาพใบหน้าที่เขียนโดย Tensorflow.js กับ ONNX.js ที่ใช้ตัวจาวาสคริปธรรมดาแล้วเวลาเขียนไปเรื่อย ๆ ก็เริ่มงงและ […]

Leave a Reply

Your email address will not be published. Required fields are marked *