What is mAP Evaluation?

Pisit Bee
Boobee
Published in
5 min readSep 20, 2018

การ Evaluate model เป็นอีกเรื่องนึงที่น่าปวดหัวครับ เป็นเรื่องที่ไว้ตรวจสอบว่า ตัว Neural net model เรามีความแม่นยำขนาดไหน สำหรับบทนี้จะอธิบายการ คำนวน หาค่า AP และ mAP สำหรับการทำนายภาพแบบ multiclass หมายถึง มีหลายๆ class ครับ ซึ่งโดยปรกติแบบ ง่ายสุดเราจะใช้การประเมิน แบบ Accuracy คือ ทายถูกนับ 1 ทายผิด ไม่นับ ก็ได้ครับ แต่ถ้าหาก ใน 1 รูป เราต้องทาย object หรือ class ในหลายๆ Class เราจะนับรูปนั้นว่าทายถูกหรือทายผิดครับ ?? แน่นอน นับไม่ได้ เราต้องแยกก ประเมินทีละ Class ไป

ก่อนอื่นเลยต้องเข้าใจ คำศัพท์ พวกนี้ก่อนครับ

True Positive (TP) คือ สิ่งที่ทาย(prediction) ว่ามันมีจริง และ เฉลย(Ground Trouth) บอกว่ามีจริง
True Negative (TN) คือ สิ่งที่ทายว่ามันไม่มีจริง และเฉลยก็บอกว่ามันไม่มีจริง
False Positive (FP) คือ สิ่งที่ทายว่ามันมีจริง แต่เฉลยก็บอกว่ามันไม่จริง(มันไม่ถูก)
False Negative (FN) คือ สิ่งที่ทายว่ามันไม่จริง แต่เฉลยก็บอกว่ามันมีจริง (นี่ก็ไม่ถูก)

ทีนี้บอกจะงง อะไรจริง อะไรไม่จริง ผมขอแนะนำอย่างนี้ครับ ยึดหนักตัวที่ ทายเป็นหลัก ถ้าตัวที่ทายบอกว่า มีจริง คือ Positive ส่วนจะถูกหรือไม่ถูก เป็น True หรือ False เท่านั้นครับ เช่น ถ้าทายว่ามีจริง แต่ไม่ถูก (เพราะจริงๆ มันไม่มีจริง) นั่นคือ FP ok ไหมครับ

Precision and recall

ทีนี้เราต้องการวัดประสิทธิภาพของ การค้นหา Class ใด Class นึ่งของ Model เราตัวอย่างในที่นี้ขอเป็น ค้นหา เครื่องบิน นะครับ สมมุติว่าเรามีรูปที่สามารถค้นหาได้ดังภาพ ในภาพนี้มีรูปเครื่องบิน และรูป ห่าน

ref:https://sanchom.wordpress.com/tag/average-precision/

ทีนี้มาดูว่า Precision และ Recall คำนวนอย่างไรนะครับ

Precision คือ อัตราการทายถูกต่อ การทายทั้งหมด(อาจจะถูกๆ ผิดๆ) โดย n คือจำนวน ที่ Model พยายามทายทั้งหมด เช่นทายมา 2 ตัว โอกาส ก็มี ถูกทั้งหมด ก็ TP = 2 หรือ ทายถูก 1 ทาย ผิด 1 , TP =1 FP =1 หรือ ทายผิดหมดเลย ก็เป็นได้

ส่วน Recall คือ จำนวน ที่ทายถูกต่อจำนวนของ GroundTruth ทั้งหมด ครับ

สมมุติว่า Model เราทายมาเป็นลักษณะนี้ครับ เราจะให้ Model เราทายเฉพาะแค่ เครื่องบินนะครับ หมายถึง เอาแต่เครื่องบินมาให้เรา เอาอย่างอื่นมาให้ถือว่าผิด

ref:https://sanchom.wordpress.com/tag/average-precision/

จากmodel ของเรา ทำการเลือกภาพมาให้เราดังภาพที่อยู่นอกกรอบครับ จะเ้็นว่า ได้รูปเครื่องบินได้มา 3 รูป ส่วน ห่านติดมา 1 รูปครับ ลองคำนวน Precision และ Recall ดู

จากตัวอย่าง เราจะได้ 3 TP และ 1 FP ดังนั้น precision คือ 3/4 = 0.75 และ recall คือ 3/5 = 0.6

Truning the threshold

ในกรณีที่เรา ไม่พอใจใน ผลลัพธ์ของ Model เราเช่น ค้นหาobject ในภาพ ทั้งหมดไม่เจอ ทายภาพออกมาได้ไม่หมด เราอาจจะใช้ ปรับ Thresold ให้ model เราสามารถทายผลลัพธ์ ให้มาก ขึ้น ซึ่งแน่นอน อาจจะได้มาทั้งตัวที่ ทายถูกและตัวที่ทายผิดด้วยเช่นกัน ทีนี้เราจะปรับ threshold ไปเรื่อยๆ จนกว่าจะได้ค่าที่ดีที่สุด สำหรับเรา ว่า ตำแหน่งนี้และ Threshold ได้ให้ ค่า Precision ดีที่สุดแล้ว ซึ่งในความเป็นจริง เราอาจจะทราบเพียงจุดที่ดีที่สุด และนำเสนอเพียงจุดนั้นจุดเดียว ปกปิด ค่าตำแหน่ง Threshold ตำแหน่งอื่นๆ ที่ให้ผลลัพธ์ไม่ดีก็เป็นได้ ซึ่งการนำเสนอจุดที่ดีที่สุดเพียงจุดเดียว ไม่ได้บ่งบอกประสิทธิภาพโดยรวมของ Model ของเรา (ไม่สามารถเป็นตัวแทนประสิทธิภาพโดยรวมได้) ดังนั้น จึงมีวิธีการวัดประสิทธิภาพโดยรวม ซึ่งเรียกว่า mAP ซึ่งก่อนอื่นเราจะต้องทำการ Rank ลำดับของ Object ที่เราจะทายก่อนครับ อาจจะ Rank ด้วย ค่าสูงสุดของ Probability ค่า Confidence ก็ได้ครับ

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

จาก รูปทายซ้าย เราอาจจะปรับ Threshold (เส้นสีน้ำเงิน)ให้เหลือ เพียง รูปเครื่องบิน อันแรกสุดอันเดียวก็ได้ หรือ เลื่อน Threshold ให้อยู่อันสุดท้ายก็ได้

กรณีที่ เลื่อนค่า Threshold จนเหลือ เครื่องบินอันเดียว แน่นอน ค่า Precision จะได้ 1 แต่ในทางกลับกันยังมี เครื่องบินที่ยังไม่ได้ถูกเลือกออกมา เพราะค้นหาได้ไม่หมดดังนั้นค่า Recall จะต่ำเหลือ 0.2หาก model ใดมีประสิทธิภาพที่ดี ค่า Precision และ Recall ควรจะอยู่ที่ 1 นั่นคือ ทุกตัวที่ทายถูกทั้งหมด(precision) และ ค้นหาได้ครบทุกตัว(recall)

กลับมาดู Threshold ดังนั้นหากเราเลือก Threshold แตกต่างกันค่า Precision และ Recall ก็จะถูกเปลี่ยนไปตามค่า Threshold ที่เราเลือกด้วยเช่นกัน ซึ่งสามารถเขียนได้ตามตารางด้านล่าง

+==================+===========+========+==============+
| Retrieval cutoff | Precision | Recall | delta recall |
+==================+===========+========+==============+
| Top 1 image | 1 | 0.2 | 0.2 |
+------------------+-----------+--------+--------------+
| Top 2 images | 1 | 0.4 | 0.2 |
+------------------+-----------+--------+--------------+
| Top 3 images | 0.66 | 0.6 | 0.2 |
+------------------+-----------+--------+--------------+
| Top 4 images | 0.75 | 0.6 | 0 |
+------------------+-----------+--------+--------------+
| Top 5 images | 0.6 | 0.6 | 0 |
+------------------+-----------+--------+--------------+
| Top 6 images | 0.6 | 0.8 | 0.2 |
+------------------+-----------+--------+--------------+
| Top 7 images | 0.57 | 0.8 | 0 |
+------------------+-----------+--------+--------------+
| Top 8 images | 0.5 | 0.8 | 0 |
+------------------+-----------+--------+--------------+
| Top 9 images | 0.44 | 0.8 | 0 |
+------------------+-----------+--------+--------------+
| Top 10 images | 0.5 | 1 | 0.2 |
+------------------+-----------+--------+--------------+

จากตารางจะเห็นว่า หากเรา ตั้ง threshold ไว้ที่ 1 รูป Precision จะเป็น 1 แต่ recall จะค้นไม่หมด ได้เพียง 0.2 Precision ดี แต่ Recall ไม่ดี งั้นลงลด threshold ลง มาที่ 2 รูป ได้ Recall 0.4 แต่พอลงมาที่ 3 รูป Precision ลดลงไปที่ 0.66 เมื่อเราปรับ Threshold ลงไปเรือยๆ เราจะได้กราฟระหว่าง Precision กับ Recall ดังรูป

ซึ่งจะเห็นว่า บางช่วง Precision ก็เพิ่มขึ้น และบางช่วง Precision ก็ลดลง ซึ่งปกติแล้วเวลาที่เรานำเสนอ ข้อมูลก็จะใช้กราฟ ระหว่าง Precision กับ Recall นี้แหละ เป็นตัวนำเสนอข้อมูล

Average precision

หากเราต้องการจะวัดค่าประสิทธิภาพของ Model เราจริงๆ เราจำเป็นต้องได้ค่ามา 1 ค่าเพื่อเป็นตัวแทนประสิทธิภาพของ Model เรา โดยปกติแล้วจะใช้ค่าของ average precision เป็นตัวแทนของประสิทธิภาพของ Model เรา

ตัว Average Precision คำนวนได้จริง พื้นที่ ใต้กราฟของ Precision กับ Recall ครับ โดยจะมีค่าอยู่ระหว่าง 0 ถึง 1 ถ้าเป็น 1 นี่ Perfect เลยกราฟ ของ Precision จะหน้าตาเป็น สี่เหลี่ยม คือมี Precision เป็น 1 และ Recall เป็น 1 หาพื้นที่ ใต้กราฟก็ได้ 1 Perfect!!! แต่ชีวิตจริงไม่ได้เรียบง่ายแบบที่คิดลองดูตัวอย่างกราฟของเรา ด้านบนครับ จะหาพื้นที่ใต้กราฟอย่างไรดี ให้สมการไว้แล้วกันครับ

แต่กราฟเราหน้าตาคล้ายๆ Discrete เลยงั้นแปลงให้เป็นสมการ Summation แล้วกันครับ ง่ายหน่อย จะหน้าตาเป็นแบบนี้

โดยที่ N คือ จำนวน รูปทั้งหมดที่เราทายออกมาทั้งถูกและไม่ถูก ส่วน P(k) คือ Precision ที่ตำแหน่ง ที่เกิน thresold ณ ที่ค่า k นั้นๆ ส่วน delta r(k) คือการเปลี่ยนแปลงของ ค่า recall ระหว่าง k-1 และ k อ่านดู อาจจะยังไม่เข้าใจ ลองดูตัวอย่าง

จากตัวอย่างเรา จะได้

Cutoff ที่ 1 จะได้ Precision 1 และ delta recall 0.2 = (1*0.2)
Cutoff ที่ 2 จะได้ Precision 1 และ delta recall 0.2 = (1*0.2)
Cutoff ที่ 3 จะได้ Precision 0.66 และ delta recall 0.0 = (0.66*0)
Cutoff ที่ 4 จะได้ Precision 0.75 และ delta recall 0.2 = (0.75*0.2)
Cutoff ที่ 5 จะได้ Precision 0.60 และ delta recall 0.0 = (0.6*0)
Cutoff ที่ 6 จะได้ Precision 0.66 และ delta recall 0.2 = (0.66*0.2)
Cutoff ที่ 7 จะได้ Precision 0.57 และ delta recall 0.2 = (0.57*0)
Cutoff ที่ 8 จะได้ Precision 0.50 และ delta recall 0.0 = (0.5*0)
Cutoff ที่ 9 จะได้ Precision 0.44 และ delta recall 0.0 = (0.44*0)
Cutoff ที่ 10 จะได้ Precision 0.5 และ delta recall 0.2 =(0.5*0.2)

หาผลรวมจะมีค่าเท่ากับ Ap = 0.782

โดยซึ่งการคำนวนหา AP นี้เป็นเพียงเฉพาะ หา AP เพียง 1 Class เท่านั้น ในที่นี้เราสนใจเพียง Class เครื่องบิน แต่เราจะเป็นต้องทำการหา ในทุกๆ Class แล้วจากนั้น นำค่า AP มาทำการเฉลี่ย จึงจะได้ ค่า mAP ของระบบของเรา

Interpolated average precision

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

จากนั้นจึงทำการหาค่า AP ใหม่ ซึ่งสามารถเขียนได้เป็นสมการดังนี้

โดยกราฟ Interpolated average precision ที่ได้จะมีลักษณะคล้ายคลึงกับกราฟเดิมแต่จะเติมค่า Precision ให้ทำการคำนวนได้ง่ายขึ้นดังกราฟด้านล่าง

จะ เห็นว่ากราฟของ Interpolation Precision จะคำนวนได้ง่ายกว่าเพราะมีลักษณะเหมือน สี่เหลี่ยม ทำให้คำนวนค่าได้ง่ายขึ้น ครับ สำหรับการหาค่าประสิทธิภาพ mAP และ AP ของ Model ที่เราสร้างขึ้นก็มีคร่าวๆ เพียงเท่านี้ ครับ สวัสดี

Ref :

https://sanchom.wordpress.com/tag/average-precision/

The PASCAL Visual Object Classes Challenge (VOC2012). http://pascallin.ecs.soton.ac.uk/challenges/VOC/voc2012/index.html.

Python example code
https://github.com/Cartucho/mAP

--

--