Depth Map ของ iPhone 15 Pro
(tech.marksblogg.com)- ตั้งแต่ปี 2017 iPhone ได้บันทึก Depth Map ไปพร้อมกับภาพที่ถ่ายด้วย LiDAR, 3D time-of-flight และการสแกน 3D แบบ structured light และสามารถดึงออกมาดูได้จากไฟล์ HEIC ของ iPhone 15 Pro
- คอนเทนเนอร์ HEIC/HEIF สามารถเก็บได้ไม่ใช่แค่ภาพต้นฉบับ แต่รวมถึง HDR gain map, Depth Map และเมตาดาต้าจำนวนมาก ทำให้มีข้อมูลสำหรับการวิเคราะห์มากกว่า JPEG ทั่วไป
- HEIC Shenanigans ของ Finn Jaeger เป็นชุดสคริปต์ Python สำหรับแยกภาพและเมตาดาต้าภายใน HEIC และแปลงเป็น EXR โดย ณ เวลาที่เขียนมีขนาด 374 บรรทัด
- จากตัวอย่าง HEIC ขนาด 1.57MB ได้ไฟล์ base TIFF 71MB, HDR gain map TIFF 5.9MB, depth TIFF 433KB และ metadata JSON 14KB โดยความละเอียดของ Depth Map ต่ำกว่าต้นฉบับ 768×576 เทียบกับ 5712×4284
- การแปลงเป็น OpenEXR ใช้ OpenImageIO, OpenColorIO และการตั้งค่า ACES เพื่อรวมช่อง SDR, HDR gain map และ Depth Map เข้าด้วยกัน โดยไฟล์ EXR สุดท้ายมีขนาดใหญ่ได้ถึง 468MB
วิธีที่ Depth Map ถูกเก็บในภาพถ่าย iPhone
- Apple รองรับ Depth Map ในภาพที่ถ่ายด้วย iPhone มาตั้งแต่ปี 2017
- วิธีที่รองรับรวมถึง LiDAR scanner, 3D time-of-flight scanner-less LIDAR และการสแกน 3D แบบ structured-light
- Depth Map และภาพอื่น ๆ จะถูกเก็บรวมกันในไฟล์คอนเทนเนอร์ HEIF
- HEIF สามารถบรรจุภาพหลายภาพและเมตาดาต้าจำนวนมากได้
- ฟอร์แมตนี้ถูกออกแบบในช่วงปี 2013~2015 และ Apple นำรูปแบบย่อย HEIC มาใช้ในปี 2017
- หลังจากนั้นภาพที่ถ่ายด้วย iPhone จะถูกบันทึกในคอนเทนเนอร์ HEIC เป็นค่าเริ่มต้น
- หากไม่ต้องการ Depth Map และ HDR ก็สามารถใช้ฟอร์แมต JPEG ได้
แยกภาพภายในด้วย HEIC Shenanigans
- Finn Jaeger โพสต์ภาพหน้าจอที่แสดงให้เห็นว่า iPhone สร้าง Depth Map หลายชุด
- HEIC Shenanigans มีสคริปต์สำหรับแยกภาพและเมตาดาต้าออกจากคอนเทนเนอร์ HEIC และแปลงเป็นไฟล์ EXR
- ณ เวลาที่เขียน โปรเจ็กต์นี้มีโค้ด Python 374 บรรทัด
- ตัวอย่างนี้ใช้ภาพ HEIC ที่ถ่ายด้วย iPhone 15 Pro เพื่อไล่ตามโค้ดของ Finn
สภาพแวดล้อมและเครื่องมือที่ต้องเตรียม
- การรันต้องใช้ Python 3.12.3 และเครื่องมือ CLI หลายตัว
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv
- แพ็กเกจ
libimage-exiftool-perlจะติดตั้ง exiftool 12.76+dfsg-1- เวอร์ชันนี้ออกในช่วงปลายเดือนมกราคม 2024
- หลังจากนั้นมีรีลีสอย่างน้อย 10 ครั้งที่รวมการแก้ไขหรือปรับปรุงปัญหาการรองรับ HEIC
- สำหรับขั้นตอนตัวอย่าง เวอร์ชันนี้เพียงพอ แต่ถ้าเจอปัญหาในภายหลัง อาจถูกแก้แล้วใน exiftool เวอร์ชันล่าสุด
- JSON Convert
jcถูกใช้เพื่อแปลงเอาต์พุตจาก CLI หลายตัวให้เป็น JSON - ตรวจสอบภาพ EXR ด้วย DJV v2.0.8
การดึง Gain Map และ Depth Map จาก HEIC
- ไฟล์ HEIC ตัวอย่างมีขนาด 1.57MB
- เมื่อรัน
gain_map_extract.pyจะได้ไฟล์ต่อไปนี้IMG_E2153_metadata.json: 14KBIMG_E2153_depth_0.tiff: 433KBIMG_E2153_hdrgainmap_48.tiff: 5.9MBIMG_E2153_base.tiff: 71MB
- เมตาดาต้า EXIF ของ base TIFF มีคุณสมบัติดังนี้
- รูปแบบไฟล์: TIFF
- การบีบอัด: Uncompressed
- สี: RGB
- ขนาดภาพ: 5712×4284
- เมกะพิกเซล: 24.5
- Bits Per Sample: 8 8 8
- HDR Gain Map และ Depth Map มีความละเอียดต่ำกว่าภาพต้นฉบับ
- ภาพต้นฉบับ: 5712×4284
- HDR Gain Map: 2856×2142
- Depth Map: 768×576
- เมตาดาต้า JSON มีข้อมูลอย่าง
aux,nclx_profile,primary,xmpเป็นต้น- รายการ
urn:com:apple:photo:2020:aux:hdrgainmapมีค่าเป็น[48] - ขนาด
primaryแสดงเป็น[5712, 4284]
- รายการ
- มี GitHub issue 3 รายการที่ขอให้ถอดรหัสค่าที่เข้ารหัสแบบ base64 ให้อ่านได้ง่ายขึ้น
ขั้นตอนการแปลง HEIC เป็น OpenEXR
- Academy Software Foundation สนับสนุนโปรเจ็กต์โอเพนซอร์สและมาตรฐานที่ใช้ในอุตสาหกรรมภาพยนตร์ ทีวี และงานสร้างสรรค์
- สมาชิกมีทั้ง Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix และรายอื่น ๆ
- OpenEXR เป็นฟอร์แมตไฟล์ภาพ HDR
- พัฒนาโดย Industrial Light and Magic ครั้งแรกในปี 1999
- เปิดเป็นโอเพนซอร์สในปี 2003
- ใช้ในการผลิตงานวิชวลเอฟเฟกต์และเรนเดอร์ 3D
- เมื่อรัน
heic_to_exr.pyภาพ HEIC จาก iPhone 15 Pro จะถูกแปลงเป็นไฟล์ OpenEXR- ไฟล์ผลลัพธ์มีขนาด 468MB
- สคริปต์แปลงจะเรียก
oiiotoolซึ่งเป็นเครื่องมือประมวลผลภาพของ OpenImageIO หลายครั้ง
โครงสร้างช่องข้อมูลในขั้นตอนสร้าง EXR
- ก่อนอื่นใช้
oiiotool --infoเพื่อตรวจสอบ ขนาด ของภาพต้นทาง - ภาพ base จะตั้งชื่อช่อง RGB เป็น
sdr.R,sdr.G,sdr.Bและแปลง color space- จากเส้นโค้ง sRGB ผ่าน Linear Rec.709
- จาก Linear P3-D65 ไปเป็น ACEScg
- การแปลงสีใช้ไฟล์ตั้งค่า OpenColorIO
- ไฟล์ OCIO ที่ใช้คือ
studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio - ไฟล์นี้เป็นแบบข้อความและมีทั้งหมด 1,242 บรรทัด
- คำอธิบายมีข้อความ
Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
- ไฟล์ OCIO ที่ใช้คือ
- HDR gain map ใช้ช่อง Y ของ TIFF เพื่อสร้างเป็น EXR
- ตั้งชื่อช่องเป็น
gainmap.Y - ปรับขนาดเป็น 4032×3024
- แปลงจากเส้นโค้ง Rec.709 เป็น Linear
- ตั้งชื่อช่องเป็น
- gain map จะถูกคัดลอกช่อง Y สามครั้งเพื่อเปลี่ยนเป็น RGB
gainmap.Rgainmap.Ggainmap.B
- หลังจากดึงค่า
HDRGainMapHeadroomด้วยexiftoolแล้ว gain map จะถูกสเกลด้วยค่ากลับของ headroom นั้น - ภาพ HDR base ถูกสร้างขึ้นด้วยการคูณภาพ base กับ gain map ที่สเกลแล้ว
- Depth Map ใช้ช่อง Y ของ TIFF เพื่อสร้างช่อง
depth.Yในรูปแบบ EXR- ปรับขนาดเป็น 4032×3024
- ไฟล์ EXR สุดท้ายถูกประกอบโดยเพิ่มหลายช่องตามลำดับ
R,G,Bของ HDR basesdr.R,sdr.G,sdr.Bของ SDR basegainmap.R,gainmap.G,gainmap.Bของ gain mapdepth.Yของ Depth Map
- หากภาพต้นทางมี matte ก็จะถูกประมวลผลและเพิ่มเป็นเลเยอร์ในขั้นตอนนั้นด้วย
- ไฟล์
final.exrสุดท้ายจะถูกย้ายไปไว้ข้างไฟล์ต้นทางโดยใช้ชื่อ<prefix>_acesCG.exr
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อย่างที่คอมเมนต์อื่นชี้ไว้ถูกต้องว่า ความละเอียดของ LIDAR ต่ำเกินกว่าจะใช้เป็นข้อมูลหลักของแผนที่ความลึก
เท่าที่ทราบ iPhone ใช้วิธีได้มาซึ่งข้อมูลความลึกอยู่ราวสี่แบบ ขึ้นอยู่กับรุ่นและกล้อง แต่ก่อนแผนที่ความลึกแบบนี้จะถูกบันทึกเฉพาะในโหมดภาพบุคคล แต่ iPhone รุ่นหลัง ๆ ดูเหมือนจะบันทึกในภาพถ่ายปกติด้วย
ภาพเสริมที่เห็นในบทความซึ่งระบายคน แว่นตา เส้นผม และผิวเป็นสีขาวนั้น Apple เรียกว่า portrait effects mattes และสร้างด้วยแมชชีนเลิร์นนิง
เมื่อก่อนเคยทำแอปที่ใช้แผนที่ความลึกกับ portrait effects mattes ของภาพบุคคลเพื่อสร้างฟิลเตอร์แนวสร้างสรรค์ สนุกมากทีเดียว แต่ตอนนี้เลิกให้บริการไปแล้ว แผนที่ความลึกยังมีความเป็นไปได้ทางศิลปะอีกมาก
อยากรู้ว่าตอนนั้นแอปชื่ออะไร และยังมีวิดีโอเหลืออยู่ไหม ผมเองก็ทำเครื่องมือเล็ก ๆ ชื่อ Matte Viewer เป็นส่วนหนึ่งของชุดเครื่องมือภาพถ่าย ไม่มีเอฟเฟกต์ รองรับแค่การดูและส่งออก: https://apps.apple.com/us/app/matte-viewer/id6476831058
เป็นบทความที่น่าสนใจ แผนที่ความลึกแบบนี้น่าจะถูกใช้กับการเบลอฉากหลังแบบความชัดลึกในโหมด “ภาพบุคคล” หรือก็คือโบเก้ปลอม
การที่สามารถเปลี่ยนจุดโฟกัสภายหลังถ่ายภาพ และปรับความชัดลึกด้วย “รูรับแสง” ได้ เป็นสิ่งที่น่าสนใจเสมอ แต่รูปร่างของ โบเก้ปลอม ดูไม่ค่อยดี มันดูเหมือน Photoshop หยาบ ๆ ตลอด
เหมือนจะมีการพิมพ์ผิดในชื่อฟอร์แมตไฟล์: “HEIC” 14 ครั้ง, “HIEC” 3 ครั้ง
น่าจะทำแอปกล้องที่ดีกว่านี้ได้ด้วยคณิตศาสตร์รูรับแสงที่ถูกต้อง แต่อยากรู้ว่าคนจะยอมจ่ายไหม หรือผู้ใช้มือถือส่วนใหญ่แยกความต่างไม่ออกและไม่สนใจ
ถ้าอยากได้ภาพบุคคลสวย ๆ ซื้อหรือเช่า DSLR ราคาถูกสักตัว ผลลัพธ์ก็ดีกว่าเป็นร้อยเท่า
Reality Composer บน iOS มีฟังก์ชันเฉพาะสำหรับจับวัตถุโดยใช้ LIDAR
รู้แล้วก็ผิดหวังที่บนอุปกรณ์ Apple ที่ไม่มี LIDAR มันไม่สลับไปใช้โฟโตแกรมเมทรีแทน เป็นข้อมูลที่มีประโยชน์สำหรับคนที่อยากทำงาน 3D modeling หรือโฟโตแกรมเมทรีแบบผม
สำหรับการสแกนวัตถุเล็ก ผมซื้อ Creality Ferret SE จาก TikTok มาราว 100 ดอลลาร์ และมันยอดเยี่ยมมาก
Canvas ต้องใช้ LiDAR ส่วน Scaniverse มีรีวิวที่ดีว่า LiDAR เป็นแค่ตัวเลือก
แผนที่ความลึกและแผนที่เชิงความหมาย ดูสนุกทีเดียว และถ้าเอาเข้าโปรแกรมอย่าง TouchDesigner, Blender หรือ Cinema 4D ก็สร้างเอฟเฟกต์ความลึกเจ๋ง ๆ จากภาพถ่ายได้
มันใช้กับการประมวลผลภาพได้เช่นกัน และท้ายที่สุด Apple ก็ใช้ในลักษณะนั้น
เมื่อก่อนจะบันทึกเฉพาะในโหมดภาพบุคคล แต่ iPhone รุ่นใหม่ ๆ แทบจะบันทึกให้อัตโนมัติเมื่อมีการตรวจพบคนหรือสัตว์เลี้ยงในฉาก
ผมทำแอปและเครื่องมือด้านภาพถ่ายอยู่(https://heliographe.net) และในนั้น Matte Viewer คือเครื่องมือสำหรับดูและส่งออกข้อมูลพวกนี้: https://apps.apple.com/us/app/matte-viewer/id6476831058
ความละเอียดของ LIDAR เอง ต่ำกว่าแผนที่ความลึกในบทความมาก ต้องสร้างโดยผสานข้อมูลจาก LIDAR กับข้อมูลจากกล้องปกติ
บทความพูดถึง HDR gain map ค่อนข้างยาว แต่ไม่ค่อยเข้าใจว่ามันเกี่ยวข้องกับ depth map อย่างไร
สงสัยว่าสามารถข้ามการจัดการส่วนที่เกี่ยวกับ HDR gain map ไป แต่ยังคงเก็บ depth map ไว้ได้หรือไม่
ส่วนตัวไม่ชอบการแสดงผล HDR ของ iPhone เพราะมันเพิ่มความสว่างหน้าจอเกินกว่าค่าสูงสุดที่ผู้ใช้ตั้งไว้ เลยอยากลบ HDR gain map ออกจากรูปของตัวเอง
HDR แบบสมัยก่อนหมายถึงการถ่ายสามภาพแล้วนำมารวมกัน โดยตัดส่วนที่มืดหรือสว่างเกินไปออก และภาพที่ได้ก็ไม่ได้พกข้อมูลแยกว่าตัวเองเป็น HDR ติดไปด้วย
สงสัยว่าสามารถใช้ depth map มาสร้าง stereogram หรือ SIRDS ได้หรือไม่ จำได้ว่าเมื่อก่อนเคยสร้าง stereogram จากภาพ grayscale ที่คล้ายกันมาก ๆ
ถ้ารูปในอัลบั้มมี depth map อยู่แล้ว หรือมีความละเอียดสูงพอที่การประมาณด้วยแมชชีนเลิร์นนิงจะทำได้ดีพอ ก็สามารถแปลงเป็น “Spatial Format” ได้
มันยังอ่าน EXIF และ “ปรับสเกล” ขนาดทางกายภาพของภาพให้ตรงกับมุมรับภาพตอนถ่ายจริงด้วย ดังนั้นภาพมุมกว้างจะดูมีขนาดใหญ่กว่าในพื้นที่ VR มาก เมื่อเทียบกับภาพเทเลโฟโต้
สำหรับฉัน แค่ปุ่มกับฟีเจอร์นี้อย่างเดียวก็คุ้มกับเงิน 4,000 ดอลลาร์ที่จ่ายไปแล้ว พอได้เห็นภาพที่ถ่ายด้วย Nikon D7 ในปี 2007 แบบ 3D เต็มรูปแบบและมีสเกลถูกต้อง ก็ทำให้ความคิดถึงและความทรงจำที่ลืมไปนานกลับมา จนรู้สึกสะเทือนใจพอสมควร
Apple พลาดมากที่ไม่ใช้สิ่งนี้เป็นจุดขายหลักของ Vision Pro มันน่าทึ่งจริง ๆ
สงสัยว่า Apple ใช้สิ่งนี้กับฟีเจอร์ “create sticker” ที่กดค้างบนวัตถุในรูปเพื่อทำเป็นสติกเกอร์หรือคัดลอกไปใส่ในภาพอื่นหรือไม่
ในความเป็นจริงข้อมูล depth ก็คงไม่ได้ช่วยมากนัก เพราะถ้าใช้แบบนั้นก็น่าจะติดพื้นหรือโต๊ะที่วัตถุนั้นวางอยู่มาด้วยเกือบทั้งหมด
น่าจะเป็นแนวทาง semantic segmentation ที่ใช้แมชชีนเลิร์นนิงอย่างเดียว
กำลังรอวันที่ฮาร์ดแวร์มือถือทุกเครื่องจะถ่ายภาพ 3D ด้วย Gaussian splatting ได้เป็นพื้นฐาน โดยไม่ต้องมีเซ็นเซอร์ราคาแพง
ต้นทุนการประมวลผลอาจสูง แต่ก็น่าจะยังถูกกว่าการเพิ่มเซ็นเซอร์ราคาแพงและเพิ่มน้ำหนักให้เครื่อง
เว็บไซต์นี้ทำงานแปลก ๆ บน Chrome ของ iOS พอเลื่อนหน้าลง ขนาดฟอนต์จะใหญ่ขึ้น แล้วพอเลื่อนกลับขึ้นก็เล็กลงอีก เลยค่อนข้างสับสน
ถึงอย่างนั้น oiiotool ก็เป็นของที่เพิ่งรู้จักเป็นครั้งแรก และเจ๋งมาก