FaceNet และ Triplet Loss ในการจดจำใบหน้า
#1 FaceNet?
เป็นหนึ่งใน Embedding Learning Framework ที่ใช้ในการทำ Face Recognition
โดยมีจุดเด่นคือการสร้าง Embedding Features จากภาพใบหน้า ให้อยู่ในรูป Euclidean space ได้เลย และสามารถใช้ Distance สื่อความเหมือนของใบหน้าได้โดยตรง
#2 ทำไมต้อง Euclidean space?
โดยทั่วไปแล้วโมเดลอื่น ๆ ที่ทำ face recognition มักจะเทรน classification layer จากใบหน้าบุคคล และใช้ Bottleneck layer รองสุดท้าย (ก่อน output layer) มาเป็น embedding features ข้อเสียของวิธีนี้มีสองข้อหลัก ๆ คือ:
- Indirectness: จากการใช้ Bottleneck layer ที่หวังว่ามันจะ generalize เพียงพอ และนำไปใช้ในการสร้าง face embeddings กับใบหน้าใหม่ ๆ ได้
- Inefficiency: จากการใช้ Bottleneck layer ที่ปกติแล้วจะได้ embeddings ที่มีขนาดใหญ่ (กว่าพัน dimensions) ทำให้ใช้เวลามากกว่าในการคำนวน
โมเดล FaceNet แก้ไขข้อเสียข้างต้นด้วยการเทรนโมเดลให้เรียนรู้ Euclidean embedding ของแต่ละใบหน้า โดยใช้ Triplet loss function
จากการที่ optimize Triplet loss นี้ทำให้ได้ Representational efficiency ที่ดีกว่า ด้วยการใช้เพียง 128-D embedding ต่อใบหน้า
และทำให้ squared L2 distances ระหว่างสอง vectors นั้นสื่อได้ถึงความเหมือนของใบหน้าได้โดยตรง (ยิ่งใบหน้าเหมือนกัน distance ยิ่งน้อย) แทนการใช้ Cosine similarity ซึ่งมี complexity สูงกว่า
นอกจากนี้เมื่อเรายังสามารถใช้ Machine Learning อื่น ๆ เช่น SVM และ KNN มาเทรนต่อโดยมี input เป็น embedding features และ output เป็นชื่อของบุคคล เพื่อเพิ่มความเร็วและประสิทธิภาพในการ predict ใบหน้า (face recognition)
#3 Triplet loss?
มาถึงเรื่อง Triplet loss กันบ้างว่ามันช่วยในการเรียนรู้ embeddings ได้อย่างไร
Triplet สื่อความหมายตรงตามชื่อของมันเลย ว่าเกี่ยวกับกลุ่ม 3 คนหรือแฝด 3 ซึ่งก็บ่งบอกถึงการเทรนโมเดลของ FaceNet ที่จะใช้การเปรียบเทียบ embeddings ของ 3 ตัวอย่างพร้อมกันในการคำนวนหา loss นั่นเอง
Objective ของการหา Triplet loss นั้นคือ!!
ให้ Embeddings ของใบหน้าคนเดียวกัน อยู่ใกล้กันมากกว่า ใบหน้าของคนอื่น
ซึ่งจะประกอบไปด้วย 3 ส่วนดังนี้:
- Anchor: ตัวอย่างตั้งต้นที่ใช้ในการเปรียบเทียบ
- Positive: ตัวอย่างของใบหน้าเดียวกับ Anchor
- Negative: ตัวอย่างของใบหน้าที่ต่างกับ Anchor
จากภาพข้างบนจะอธิบายผลลัพธ์ก่อนและหลังการใช้ Triplet loss เพื่อ optimize ระยะห่างของ anchor กับ positive และ negative โดยมี objective คือ:
- ลด distance ระว่าง anchor และ positive (เป็นบุคคลเดียวกัน)
- เพิ่ม distance ระหว่าง anchor และ negative (เป็นคนละคนกัน)
แล้วระยะทางบน embedding space ก็คือ loss ของ triplet นั่นเอง และเขียนออกมาเป็นสูตรได้เป็น
มี A เป็น anchor input, P เป็น positive input, N เป็น negative input, และค่า Margin ระหว่าง d(a,p) และ d(a,n)
อธิบายง่าย ๆ คือ optimize จนได้ d(a,n) - d(a,p) มีค่ามากกว่าหรือเท่ากับ margin (loss เป็นศูนย์) ลองย้ายสมการดู
- d(a,p) - d(a,n) + margin ≤ 0
- d(a,n) ≥ d(a,p) + margin
- d(a,n) - d(a,p) ≥ margin
ขอบคุณที่อ่านมาถึงจนจบครับ ถ้าชอบอย่าลืมกดแชร์และกดปรบมือให้ด้วยนะครับ อิอิ
อ้างอิง และอ่านเพิ่มเติมได้ครับ:
- Paper ของ FaceNet โดย Schroff et al. https://arxiv.org/pdf/1503.03832.pdf
- อธิบาย Online Triplet Mining และการเขียนด้วย TensorFlow, https://omoindrot.github.io/triplet-loss
- วิดีโอสอนคำนวนสูตร Triplet loss โดย Andrew Ng, C4W4L04 Triplet loss, in Deeplearning.ai https://youtu.be/d2XB5-tuCWU
- Open Face เขียนถึงการพิ่มประสิทธิภาพในการเทรนโมเดล http://bamos.github.io/2016/01/19/openface-0.2.0/
- Face Recognition: An Introduction for Beginners อันนี้อธิบายเข้าใจง่ายดีครับ https://www.learnopencv.com/face-recognition-an-introduction-for-beginners/
- Triplet loss ก็ถูกใช้ใน Siamese Network และ One-Shot Learning เหมือนกันนะครับ https://towardsdatascience.com/one-shot-learning-face-recognition-using-siamese-neural-network-a13dcf739e
- FaceNet Github repo, https://github.com/davidsandberg/facenet