1 อธิบาย
Inference ประมวลผลทีละเฟรมแยกกัน โมเดลไม่รู้ว่าเฟรมก่อนหน้าออกมาเป็นยังไง ผลจึงกระพริบ (flicker) ข้ามเฟรมได้ แม้ดูทีละภาพจะดูดี และโมเดลอาจไปแตะพิกเซลที่ไม่ควรแตะ
เครื่องมือ QC: output − input บอกว่าโมเดลเปลี่ยนอะไรไปบ้าง output − เฟรมก่อน บอกการกระพริบ และกราฟค่าเฉลี่ยของบริเวณที่แก้บอกว่าเฟรมไหนกระโดด ดัน gain ขึ้นให้เห็นชัด
2 ลงมือลอง
โจทย์: หา 3 เฟรมที่ไม่ผ่าน QC แล้วปักธงเฉพาะ 3 เฟรมนั้น
บทนี้ไม่มีโมเดลจริง ผลลัพธ์จำลองให้มีปัญหา 3 แบบที่พบบ่อย
3 เจาะลึก
ทำไมผล ML ต้อง QC ต่างจากเดิม
Inference ประมวลผลแต่ละเฟรมแยกกัน ไม่มีความจำข้ามเฟรม ความนิ่งข้ามเวลาจึงขึ้นกับว่าโมเดลเทรนมาดีพอแค่ไหน เฟรมที่ input ต่างไปเล็กน้อยอาจได้ผลต่างกันมาก
ปัญหาที่พบบ่อยมีสามแบบ: แก้ไม่หมดบางเฟรม, ผลกระพริบ, และไปแตะส่วนที่ไม่ควรแตะ ทั้งสามแบบมองยากถ้าดูแค่ภาพนิ่ง
| ปัญหา | เครื่องมือที่จับได้ |
|---|---|
| แก้ไม่หมด | Output ที่ gain สูง, output − input |
| flicker | output − เฟรมก่อน, plot ตามเวลา, เล่นต่อเนื่อง |
| แตะส่วนที่ไม่ควรแตะ | output − input ทั้งเฟรม |
| grain หายในบริเวณที่แก้ | output − เฟรมก่อน (บริเวณนั้นนิ่งสนิท) |
อ่านภาพ difference
output − input ที่ดีควรมีแค่รูปของสิ่งที่ตั้งใจลบ ที่เหลือดำสนิท ถ้ามีรอยที่อื่น โมเดลไปแตะส่วนนั้น ถ้ารูปของสิ่งที่ลบจางลงในบางเฟรม แปลว่าเฟรมนั้นแก้ไม่หมด
ค่าต่างกันมักเล็กมาก ต้องดัน gain ของ Viewer หรือคูณค่าให้เห็นชัด แยกสีบวกกับลบ จะรู้ว่าสว่างขึ้นหรือมืดลง
difference ที่ดี = ดำทั้งภาพ ยกเว้นตรงที่ตั้งใจแก้
จับ flicker ด้วยเวลา
flicker คือการเปลี่ยนข้ามเวลา จึงต้องเทียบข้ามเฟรม: เล่นต่อเนื่องด้วยความเร็วจริง, ดูผลต่างกับเฟรมก่อน, หรือวัดค่าเฉลี่ยของบริเวณที่แก้ทุกเฟรมแล้ว plot เป็นกราฟ เฟรมที่กระโดดออกจากเส้นคือเฟรมที่ต้องเก็บ
- 1เล่นต่อเนื่อง
- 2output − เฟรมก่อน
- 3plot ค่าเฉลี่ยตามเวลา
- 4เฟรมที่กระโดด → เก็บ
4 ในงานจริง
ทำใน Nuke
- Merge ตั้ง operation เป็น difference (หรือ minus เพื่อเก็บเครื่องหมาย) ระหว่างผล Inference กับ plate input แล้วดันค่า gain ใน Viewer
- ผลต่างข้ามเฟรม: ใช้ TimeOffset +1 กับผล Inference (ได้เฟรมก่อนหน้า) แล้ว Merge (difference) กับผล Inference ที่ไม่ได้ offset
- plot ตามเวลา: CurveTool แบบ Avg Intensities บนบริเวณที่แก้ แล้วดูเส้นกราฟใน Curve Editor
- จำกัดผลเฉพาะบริเวณที่แก้ด้วย Keymix กับ mask และใส่ grain กลับก่อนส่ง
พลาดบ่อย → แก้ยังไง
- ✗ QC จากภาพนิ่งทีละเฟรม✓ เล่นต่อเนื่องและดู difference ข้ามเฟรม flicker เห็นได้เฉพาะเมื่อเทียบข้ามเวลา
- ✗ ดูเฉพาะบริเวณที่แก้✓ ดู output − input ทั้งเฟรม โมเดลอาจแตะส่วนอื่นด้วย
- ✗ ส่งงานโดยไม่ใส่ grain กลับในบริเวณที่โมเดลเติม✓ บริเวณที่เรียบจะดูนิ่งผิดปกติ ใส่ grain ให้เข้ากับ plate
- ✗ คิดว่า loss ต่ำแปลว่าทุกเฟรมผ่าน (ดู AI2)✓ loss วัดบน dataset เท่านั้น ผลทั้งช็อตต้องตรวจเอง
เช็กก่อนส่งช็อต
- ดู output − input ทั้งเฟรม ไม่มีรอยนอกบริเวณที่แก้
- เล่นต่อเนื่องที่ความเร็วจริง ไม่มี flicker
- plot ค่าเฉลี่ยบริเวณที่แก้ตามเวลา ไม่มีเฟรมกระโดด
- grain ในบริเวณที่แก้เข้ากับ plate
- เฟรมที่พลาดถูกเก็บมือหรือกลับไปเพิ่มใน dataset
5 เช็กตัวเอง
วิธีไหนจับ flicker ของงาน ML ได้ดีที่สุด
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ใน output − input มีรอยสี่เหลี่ยมจาง ๆ บนพื้น ห่างจาก marker ที่ลบ แปลว่าอะไร
2. plot ค่าเฉลี่ยบริเวณที่แก้แล้วเห็นเฟรมหนึ่งสูงกว่าเพื่อนชัดเจน ขณะที่บริเวณเดียวกันบน plate input นิ่ง ปัญหาคืออะไร
ตัวเลขมาจากไหน: ผลลัพธ์จำลอง: เราใส่ปัญหาลงไปเอง 3 จุด (marker เหลือ, fill สว่างขึ้นเฟรมเดียว, ภาพเสียนอกบริเวณที่แก้) บน crop ของ plate จาก Blender พร้อม grain ที่สร้างด้วยโค้ด ไม่มีการเทรนในบทนี้ ข้อเท็จจริงที่ว่า Inference ประมวลผลทีละเฟรมมาจากคู่มือ CopyCat ในคลังความรู้ของเรา