1 อธิบาย
solve error (reprojection error) คือระยะเป็นพิกเซลระหว่างตำแหน่งที่ track อยู่จริง กับตำแหน่งที่กล้องที่ solve ได้ฉายจุด 3D ของมันลงมา ค่านี้วัดเป็นพิกเซลของ plate เอง และค่าเฉลี่ยที่ดูดีอาจซ่อน track แย่ ๆ ไว้ได้
ดู error ของแต่ละ track บนปุ่ม แล้วคลิกปิดตัวที่ดึง solve ดูค่า solve error เฉลี่ย เฟรมที่แย่สุด จำนวน track ที่ใช้ และการลื่นของกรวย CG บนหิน จากนั้นสลับ ความละเอียด plate เพื่อดูว่า solve เดิมอ่านเป็นตัวเลขต่างกันแค่ไหน
reprojection error = | tracked 2D − projected solved 3D | (px)2 ลงมือลอง
โจทย์: ทำ solve ให้สะอาด จนกรวย CG บนหินลื่นไม่เกิน 1 px (ที่สเกล 640 px) โดยยังเหลือ track อย่างน้อย 8 ตัว
เริ่มจากแถบที่ยาวผิดปกติ แล้วดูภาพ plate ว่า track นั้นเกาะอะไรอยู่ และค่า worst frame กับ slide ของกรวยเปลี่ยนไปอย่างไร
3 เจาะลึก
ตัวเลขนี้วัดอะไร
หลัง solve แต่ละ track มีจุด 3D ของตัวเอง กล้องที่ solve ได้ฉายจุดนั้นกลับลงบนภาพในทุกเฟรม ระยะระหว่างจุดที่ฉายลงมากับตำแหน่งที่ track เจอจริงคือ reprojection error ของ track นั้นในเฟรมนั้น
ตัวเลขที่ solver โชว์เป็นค่าเดียวมักเป็นค่าเฉลี่ยหรือ RMS รวมทุก track ทุกเฟรม จึงเป็นแค่ภาพรวม ไม่ได้บอกว่าปัญหาอยู่ตรงไหน
- 1จุด 3D ที่ solve ได้
- 2กล้องฉายลงภาพ
- 3เทียบกับ 2D track
- 4ระยะเป็น px
- 5เฉลี่ยทุก track ทุกเฟรม
พิกเซลขึ้นกับ resolution
กล้องที่ผิดเท่าเดิม บน plate ที่กว้างกว่าจะกินพิกเซลมากกว่า solve เดียวกันจึงอ่านได้ใหญ่ขึ้นตามความกว้างของ plate ตัวเลขที่ไม่บอก resolution จึงแทบไม่มีความหมาย
ไม่มีตัวเลขเดียวที่ใช้ได้กับทุกช็อต ค่าที่อ่านได้ขึ้นกับ resolution ของ plate, solver และตัวช็อตเอง เทียบกันได้เฉพาะที่ resolution เดียวกัน
| ความกว้าง plate | error เดิมอ่านได้ |
|---|---|
| 640 | ×1 |
| 1920 | ×3 |
| 3840 | ×6 |
ค่าเฉลี่ยซ่อน track แย่ ๆ
least squares ให้น้ำหนักกับจุดที่พลาดมากเป็นพิเศษ track เสียตัวเดียวจึงดึงกล้องเพี้ยนได้ และทำให้ error ของเฟรมนั้นพุ่ง แต่พอเฉลี่ยกับ track ดีอีกหลายตัว ค่ารวมอาจยังดูไม่แย่
ให้ดู error ราย track และกราฟ error รายเฟรม หายอดแหลมหรือเส้นที่ค่อย ๆ ไต่ขึ้น track ที่ลื่นทีละน้อยจะไต่ขึ้นช้า ๆ ส่วน track ที่กระโดดหลังถูกบังจะพุ่งเป็นยอด
solver บางตัวตั้ง weight ของ track เป็น 0 ได้ track นั้นไม่ถูกใช้คำนวณกล้อง แต่ยังรายงาน error ไว้เป็นตัวเช็กบริเวณนั้น
track แบบไหนควรตัด
camera solve ถือว่าโลกนิ่ง track ที่อยู่บนของที่ขยับเองหรือ track ที่ไม่ได้เกาะ feature เดิมตลอด จะขัดกับ track อื่นทั้งหมดและดึงกล้อง ส่วนจุดบนท้องฟ้าไม่มีความลึกที่แน่นอน อาจทำให้ track ลื่นได้ แม้ solver ไม่ได้ใช้ก็ควรลบทิ้ง
แต่อย่าลบจนตัวเลขสวยอย่างเดียว ทุกเฟรมยังต้องมี track ดีพอให้ solve ได้ ถ้าลบมากไป solve จะขาดข้อมูลและแย่ลงในแบบที่ตัวเลขอาจไม่บอก
| track | อาการ | ทำอย่างไร |
|---|---|---|
| บนของที่ขยับ (โดรน) | error สูงตลอด | mask ออก หรือปิด |
| ลื่นออกจาก feature | error ไต่ขึ้นช้า ๆ | ปิด หรือ track ใหม่ |
| กระโดดหลังถูกบัง | ยอดแหลมในบางเฟรม | ตัดช่วงที่เสีย หรือปิด |
| บนท้องฟ้า | ไม่มีความลึกจริง | ลบทิ้ง |
ตัวเลขไม่ใช่ข้อสอบสุดท้าย
ค่าเฉลี่ย reprojection error ไม่ได้วัดว่าภาพนิ่งแค่ไหนในสายตา solve ที่ค่าเฉลี่ยต่ำยังอาจ swim ได้ถ้ามีเฟรมที่ jitter หรือมีจุด 3D บางจุดที่ solve ผิดตำแหน่ง ต้องดูความนิ่งรายเฟรม และวาง CG บนพื้นแล้วเล่นดูจริง
ตัดสินจากกรวยบนพื้นที่ไม่ลื่น ไม่ใช่จากตัวเลขที่สวย
4 ในงานจริง
ทำใน Nuke
- Roto → ต่อเข้า mask ของ CameraTracker (NukeX) เพื่อกันของที่ขยับและท้องฟ้าออกก่อน track
- หลัง solve เปิดแท็บ AutoTracks ดู error รายเฟรม (Solve Error / per frame) หาเฟรมที่พุ่งขึ้น
- ลด Max Error และ Max Track Error แล้วกด Delete Rejected และ Delete Unsolved จากนั้น Update Solve วนซ้ำ
- ลบจุดที่อยู่บนท้องฟ้าเอง รวมถึงจุดที่ solver ไม่ได้ใช้แล้ว (จุดสีส้ม)
- export Camera → Scene กับ Card ลายตารางบนพื้น → ScanlineRender แล้ว Merge (over) บน plate เล่นดูว่าลื่นไหม
พลาดบ่อย → แก้ยังไง
- ✗ บอกตัวเลข error โดยไม่บอก resolution ของ plate✓ บอก resolution ทุกครั้ง และเทียบกันที่ความกว้างเดียวกัน
- ✗ ดูแค่ค่าเฉลี่ย แล้วพลาดเฟรมหรือ track ที่แย่ตัวเดียว✓ ดู error ราย track และกราฟรายเฟรม แล้วเล่นดู CG บนพื้น
- ✗ ลบ track ไปเรื่อย ๆ จนตัวเลขสวย✓ ลบเฉพาะตัวที่มีเหตุผล และให้ทุกเฟรมยังเหลือ track ดีพอ
- ✗ เก็บ track บนของที่ขยับไว้ใน camera solve✓ mask ของที่ขยับออก หรือปิด track นั้น
- ✗ ปล่อยจุดบนท้องฟ้าไว้เพราะ solver ไม่ได้ใช้✓ ลบทิ้ง จุดบนท้องฟ้าไม่มีความลึกที่แน่นอน
เช็กก่อนส่งช็อต
- ตัวเลข error ที่รายงานมี resolution ของ plate กำกับ
- กราฟ error รายเฟรมไม่มียอดแหลมที่ยังไม่ได้แก้
- ไม่มี track บนของที่ขยับหรือบนท้องฟ้าเหลืออยู่
- ทุกเฟรมยังมี track ดีพอให้ solve
- CG บนพื้นไม่ลื่นเมื่อเล่นดูทั้งช็อต
5 เช็กตัวเอง
solve ของเพื่อนอ่าน error มากกว่าของเรา 6 เท่า แต่ของเพื่อนอยู่บน plate กว้าง 3840 ส่วนของเราบน 640 สรุปได้ว่าอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ค่าเฉลี่ย error ดูดี แต่กรวย CG ลื่นแค่ช่วงไม่กี่เฟรม ควรทำอะไรก่อน
2. track หนึ่งเกาะอยู่บนโดรนที่บินผ่าน ใน camera solve ควรทำอย่างไร
ตัวเลขมาจากไหน: shot มือถือ 48 เฟรม (640×360) เรนเดอร์ใน Blender (Cycles) จากฉากทะเลทรายของเรา เพิ่มจอเขียวบนเสาและโดรนบินผ่าน เฟรม 1 คือกล้องเดียวกับ plate นิ่ง ตำแหน่งจริงของทุกจุดมาจาก 3D ของฉากเอง (truth.json, dist.f32) solve แบบสอนหลักการ คำนวณในเบราว์เซอร์: จุด 3D ถูกล็อกไว้ที่ตำแหน่งจริงของฉาก และ solve เฉพาะกล้อง (6 ค่าต่อเฟรม) ด้วย least squares จาก 2D track ซึ่งเป็นตำแหน่งจริงบวก noise ที่ seed ไว้ 0.25 px กับ track เสีย 3 ตัวที่ใส่ไว้ตั้งใจ solver จริงจะประมาณทั้งจุด 3D และเลนส์ไปด้วย