FaceNet และ Triplet Loss ในการจดจำใบหน้า

Poom Wettayakorn
DATAWIZ
Published in
3 min readAug 18, 2019

#1 FaceNet?

เป็นหนึ่งใน Embedding Learning Framework ที่ใช้ในการทำ Face Recognition

โดยมีจุดเด่นคือการสร้าง Embedding Features จากภาพใบหน้า ให้อยู่ในรูป Euclidean space ได้เลย และสามารถใช้ Distance สื่อความเหมือนของใบหน้าได้โดยตรง

ตัวอย่างการทำ face embedding, inspired by learnopencv

#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 สูงกว่า

เปรียบเทียบความแตกต่างระหว่าง Cosine Similarity (θ) และ Euclidean Distance (d)

นอกจากนี้เมื่อเรายังสามารถใช้ Machine Learning อื่น ๆ เช่น SVM และ KNN มาเทรนต่อโดยมี input เป็น embedding features และ output เป็นชื่อของบุคคล เพื่อเพิ่มความเร็วและประสิทธิภาพในการ predict ใบหน้า (face recognition)

ตัวอย่าง K-Nearest Neighbors โดยมี K=3 เพื่อทำการ predict face embedding

#3 Triplet loss?

มาถึงเรื่อง Triplet loss กันบ้างว่ามันช่วยในการเรียนรู้ embeddings ได้อย่างไร

Triplet สื่อความหมายตรงตามชื่อของมันเลย ว่าเกี่ยวกับกลุ่ม 3 คนหรือแฝด 3 ซึ่งก็บ่งบอกถึงการเทรนโมเดลของ FaceNet ที่จะใช้การเปรียบเทียบ embeddings ของ 3 ตัวอย่างพร้อมกันในการคำนวนหา loss นั่นเอง

Objective ของการหา Triplet loss นั้นคือ!!

ให้ Embeddings ของใบหน้าคนเดียวกัน อยู่ใกล้กันมากกว่า ใบหน้าของคนอื่น

ซึ่งจะประกอบไปด้วย 3 ส่วนดังนี้:

  • Anchor: ตัวอย่างตั้งต้นที่ใช้ในการเปรียบเทียบ
  • Positive: ตัวอย่างของใบหน้าเดียวกับ Anchor
  • Negative: ตัวอย่างของใบหน้าที่ต่างกับ Anchor
ขั้นตอนการ Learning ด้วย Triplet Loss

จากภาพข้างบนจะอธิบายผลลัพธ์ก่อนและหลังการใช้ 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
ขอปิดท้ายด้วยภาพสรุปการทำงานของ Triplet loss ครับ

ขอบคุณที่อ่านมาถึงจนจบครับ ถ้าชอบอย่าลืมกดแชร์และกดปรบมือให้ด้วยนะครับ อิอิ

อ้างอิง และอ่านเพิ่มเติมได้ครับ:

--

--