Face Recognition Performance Evaluation 😀

Wachirapong Kamphapong
5 min readSep 20, 2021

--

CP491:Biometric

จัดทำโดย

  • นายฉัตรัย ขุนเจริญ 62102010166
  • นายเพทาย จำนงค์ธรรม 62102010178
  • นายวชิรพงศ์ คำภาพงษ์ 62102010184
  • นายสุวัจชัย เครือประสิทธิ์ 62102010191
  • นายศุภกร ขำละเอียด 62102010437

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

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

โดยในครั้งนี้เราจะมาลองทำการทดลองกันโดยมี Dataset ทั้งหมด 500 ภาพ แบ่งเป็นคน 50 คน 1 คนประกอบด้วย 10 ภาพ ภาพคนละ 10 ภาพ โดยเราใช้อัลกอรึทึมที่มีประสิทธิภาพ ในการทำ Face Detection ได้ดีและละเอียด

โดยจะทำการทดลอง 2 รูปแบบคือ Verification , Identification

1. Verification

  • การยืนยันตัวตนโดยที่เราจะนำรูปที่เป็น Test sample มาเปรียบเทียบกับรูปที่เป็น Enroll sample เพื่อหาค่า distance score และกำหนดช่วงของ threshold เพื่อหา FAR และ FRR สำหรับนำมา plot graph และตรวจสอบ error rate

2. Identification แบ่งเป็น Close set และ Open set

  • Close Set เราจะทำการทดลองแบบ Identification โดยเราได้นำภาพ 1 ภาพ ของรูปภาพทั้งหมด 50 sample ไป Enroll เพื่อหาความถูกต้องของภาพว่าตรงกันหรือไม่ โดยเราจะนำรูปภาพ 450 sample ไปทำการ Identification โดยการคำนวณหาค่า Cosine Distance โดยระบบนี้จะรู้จักทุกคนที่ทำการ Enroll เข้าสู่ระบบ
  • Open Set เราจะทดลอง การทำงานของ Identification เป็นการทดลองรูปแบบเดียวกับ Close Set แต่จะลดจำนวนของ รูปภาพที่ Enroll ลงครึ่งนึง เหลือ 25 sample ระบบนี้จะรู้จักแค่บางคน หรือ คนที่ Enroll เข้าไปในระบบเท่านั้น

การทดลองนี้ใช้ภาษา Python และใช้ library ที่ใช้ในการทำการทดลอง มีดังนี้

  • Cv2
  • Matplotlib
  • VGG-Face
  • Numpy
  • Math
  • Pandas
  • Keras

ขั้นตอนการทำงาน

ขั้นตอนที่ 1 Face-Detection

เลือกภาพแรกของ user ทั้งหมด (โดยที่ user ทั้งหมดมี 25 คน คนละ 10 รูป รวมเป็น 250 รูป แต่ในขั้นตอนนี้เราจะนำมาแค่ 1 รูปภาพของแต่ละคน มา enrollment)

ทำการ Detect หน้าที่ได้แล้วนำไปบันทึกลงในโฟลเดอร์ enrollment faces

ตัวอย่างรูปที่ Detect ได้ และถูกบันทึกลงในโฟลเดอร์ enrollment faces

ตัวอย่างรูปก่อน Detect
ตัวอย่างรูปที่ถูก Detect และ ถูกบันทึกลงในโฟลเดอร์ enrollment faces

ต่อไปเราจะนำรูปภาพที่เหลือจากการนำภาพแรกของแต่ละ user ไป enrollment นั่นคือ 9 รูป * 25 คน = 225 รูป และหลังจากนั้นก็ทำการ Detect หน้าที่ได้แล้วนำไปบันทึกลงในโฟลเดอร์ Recognition faces

ขั้นตอนที่ 2 Face-Encoding

นำรูปภาพที่ได้จากขั้นตอนที่ 1 มาหา face encoding เพื่อไว้ใช้สำหรับขั้นตอนต่อไป โดยใน code จะ loop ตามจำนวนรูปที่ enrollment (25 รูป) แล้วเก็บไว้ใน list (faces_encode)

นำรูปภาพที่ได้จากขั้นตอนที่ 1 (Recognition faces) มาหา face encoding เพื่อใช้สำหรับขั้นตอนต่อไป code จะเหมือนกับ face encoding ของ enrollment faces แต่จะเปลี่ยนเป็นของ Recognition faces

ขั้นตอนที่ 3 Face-matching

คือ การนำผลลัพธ์ที่ได้จากขั้นตอน face encoding มาหา similarity score หรือ distance เพื่อเปรียบเทียบว่า 2 ใบหน้ามีความใกล้เคียงกันมากแค่ไหน โดย code ของเราจะหา distance จาก cosine distance function

Face-verification

คือ กระบวนการระบุตัวบุคคลผ่านลักษณะเฉพาะ ในที่นี้เราจะใช้ face มาทำ vertification ซึ่งผลลัพธ์ที่ได้จาก verification คือ ใช่หรือไม่ใช่ โดยเราจะหา FAR และ FRR เพื่อนำมา plot graph ตรวจสอบ error rate แล้วมาสรุปผลว่า performance face verification เป็นอย่างไร

Code นี้จะเป็น code สร้างตารางด้วย pandas เป็นตารางของระบบ verification โดยเราจะใช้ encoding ของ enrollment และ sample ที่ไม่ได้ enrollment (9 * 25 = 225 รูป) มา loop คำนวณหา distance ระหว่าง enrollment faces กับ sample faces ที่เหลือ เมื่อได้ผลลัพธ์แล้ว เราจะนำชื่อของ 2 encoding และ distance มา append ให้กับตาราง

ตารางที่ได้ประกอบด้วย Claimed identity เป็น column ที่จะแสดงชื่อของ user ที่ enrollment, Actual identity เป็น column ที่แสดงชื่อของ sample ที่ไม่ได้ enrollment, Cosine distance

ผลลัพธ์ที่ได้จากการคำนวณหา distance

ผลลัพธ์เพิ่มเติมของตารางดูได้ที่นี่

หลังจากที่ได้ตารางมาแล้ว เราจะมาหา FAR กับ FRR โดยเราต้องกำหนด threshold (คือ ใช้ในการตัดสินว่า actual identity จะผ่านหรือไม่ผ่านในการเข้าสู่ระบบ) อยู่ระหว่าง 0.1–0.7 โดยเพิ่มขึ้นทีละ 0.05

เราจะเริ่มจากการหา genuine attempt เพื่อใช้คำนวณหา FRR และ imposter attempt เพื่อคำนวณหา FAR

สร้าง function ในการคำนวณหา FAR กับ FRR ใน function เราจะหา FP (False acceptance) เงื่อนไขคือ distance < threshold และ id ของทั้งสองจะไม่ตรงกัน และ FN (False rejection) เงื่อนไขคือ distance >= threshold และ id ของทั้งสองจะตรงกัน

เรียกใช้ FAR_FRR function

Plot FAR and FRR trade-off graph ใช้ matplotlib

กราฟที่ได้

จากผลลัพธ์ graph ที่ได้ทำให้เราทราบว่า threshold ที่น้อยเกินไปส่งผลให้ FRR สูงมาก ส่วน FAR จะต่ำมาก แต่ถ้า threshold สูงเกินไป FAR จะสูงขึ้นมาระดับนึง ส่วน FRR จะต่ำลง เพราะฉะนั้นจาก graph ในกรณีที่ต้องการระบบที่มีค่า FAR = FRR เราจะเลือก threshold = 0.5 เพราะ FAR และ FRR ตัดกันพอดี

Face identification

1.Close-set identification เป็นระบบที่จะรู้จัก user ทั้งหมดที่มา enrollment ให้กับระบบ จะไม่มี user อื่นๆเข้ามาในระบบ ทำหน้าที่ identify ว่า sample เป็นของใคร เมื่อรู้แล้วว่าเป็นใครจะ return id ออก

เริ่ม code ต้องสร้างตารางสำหรับ close-set identification ก่อนซึ่งจะรูปแบบที่ไม่เหมือนกับ verfication ลักษณะของตารางจะเป็นการสร้าง column ของ user ที่มา enrollment ทั้งหมด ส่วน sample ที่เหลือของ 25 คน (ที่ enrollment) จะแสดง distance ที่เปลี่ยนเทียบกับทุก enrollment

ผลลัพธ์ของตารางที่ได้

ผลลัพธ์เพิ่มเติมของตารางดูได้ที่นี่
  • เมื่อได้ตารางแล้ว เราจะทำการเปรียบเทียบ performance ของ close-set โดยสร้าง IDR function เพื่อหา detection rate ในแต่ละ rank (1–10)

Loop เพื่อใช้ IDR function ในการคำนวณ detection rate ในแต่ละ rank

ผลลัพธ์ IDR
  • นำ Detection rate ที่ได้ในแต่ละ rank มา plot CMC (Cumulative Match Characteristic) curve graph

จาก graph ทำให้เราทราบว่า Face close-set identification มี IDR ที่สูงตั้งแต่ rank 1 (ประมาณ 96%) ซึ่งเป็น performance ที่ดีมาก เนื่องจากมีเปอร์เซ็นที่จะ detect ถูกต้องตั้งแต่ rank ต่ำๆ performance ที่ดีจะต้องมี IDR ที่สูงโดย rank จะต้องน้อยด้วย

2.Open-set identification เป็นระบบที่จะต้องตัดสินใจเองว่า รู้จัก user คนนี้หรือไม่ เนื่องจากจะมี user บางส่วนที่ไม่ได้อยู่ในระบบ ระบบจะ return 2 อย่างคือ reject กับ accept

สร้างตาราง open-set โดยเราจะนำตารางจาก close-set มาใช้งาน เพิ่ม unknown faces (25 คนที่เหลือที่ไม่ได้ enrollment คนละ 10 รูป = 250 รูป) โดย unknown faces จะต้องผ่านขั้นตอนที่ 1 และ 2 มาก่อน ทำการ append unknown ลงไป

ผลลัพธ์ของตารางที่ได้

ผลลัพธ์เพิ่มเติมของตารางดูได้ที่นี่
  • หลังจากสร้างตาราง open-set เสร็จ จะเริ่มทำการหา IDR ของ rank1 และ FAR เริ่มแรกเราจะหาจำนวน genuine และ imposter attempt เพื่อใช้ใน FAR function
  • สร้าง IDR_1 function ซึ่งจะต่างจาก close-set เราจะทำเพียง rank 1 เท่านั้นและมี threshold เข้ามาเกี่ยวข้องด้วย เนื่องจากมี unknown user เข้ามาในระบบ
  • สร้าง FAR function สำหรับคำนวณหา false acceptance rate
  • นำ IDR rank 1 กับ FAR มาเก็บใน list เพื่อ plot DIR vs. FAR curves graph

ตัวอย่างผลลัพธ์ที่ได้จากการรัน code

[0.0, 1.78 ,15.56, 32.44, 50.67, 67.56, 84.0, 89.33, 95.56, 96.0, 96.0, 96.0, 96.0, 0.0, 0.0, 0.4, 1.2, 3.2, 4.40, 12.8, 38.0, 64.4, 81.6, 90.0, 96.0]

  • Code plot DIR vs. FAR curves graph

จาก graph ทำให้เราทราบว่า Face open-set identification ถ้า threshold มากขึ้น FAR จะสูงขึ้นตาม เพราะฉะนั้น graph นี้ทำให้ได้เห็น performance ของ open-set ดีหรือไม่ดีขึ้นอยู่กับ threshold ที่เรากำหนด การเลือกที่ดีเราจะต้องทำให้ FAR น้อยแล้ว IDR เยอะ

สำหรับคนที่สนใจ code เต็มๆ สามารถดูได้ที่ link

แล้วถ้าหากเราลดคุณภาพของรูปภาพโดยการเบลอล่ะ?

--

--