2 คะแนน โดย GN⁺ 2025-06-06 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ตั้งแต่ปี 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 หลายตัว
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.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: 14KB
    • IMG_E2153_depth_0.tiff: 433KB
    • IMG_E2153_hdrgainmap_48.tiff: 5.9MB
    • IMG_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]
  • HDR gain map ใช้ช่อง Y ของ TIFF เพื่อสร้างเป็น EXR
    • ตั้งชื่อช่องเป็น gainmap.Y
    • ปรับขนาดเป็น 4032×3024
    • แปลงจากเส้นโค้ง Rec.709 เป็น Linear
  • gain map จะถูกคัดลอกช่อง Y สามครั้งเพื่อเปลี่ยนเป็น RGB
    • gainmap.R
    • gainmap.G
    • gainmap.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 base
    • sdr.R, sdr.G, sdr.B ของ SDR base
    • gainmap.R, gainmap.G, gainmap.B ของ gain map
    • depth.Y ของ Depth Map
  • หากภาพต้นทางมี matte ก็จะถูกประมวลผลและเพิ่มเป็นเลเยอร์ในขั้นตอนนั้นด้วย
  • ไฟล์ final.exr สุดท้ายจะถูกย้ายไปไว้ข้างไฟล์ต้นทางโดยใช้ชื่อ <prefix>_acesCG.exr

1 ความคิดเห็น

 
GN⁺ 2025-06-06
ความคิดเห็นจาก Hacker News
  • อย่างที่คอมเมนต์อื่นชี้ไว้ถูกต้องว่า ความละเอียดของ LIDAR ต่ำเกินกว่าจะใช้เป็นข้อมูลหลักของแผนที่ความลึก
    เท่าที่ทราบ iPhone ใช้วิธีได้มาซึ่งข้อมูลความลึกอยู่ราวสี่แบบ ขึ้นอยู่กับรุ่นและกล้อง แต่ก่อนแผนที่ความลึกแบบนี้จะถูกบันทึกเฉพาะในโหมดภาพบุคคล แต่ iPhone รุ่นหลัง ๆ ดูเหมือนจะบันทึกในภาพถ่ายปกติด้วย

    1. ตั้งแต่ iPhone 7 Plus ใช้กล้องหลังสองตัวถ่ายพร้อมกัน แล้วสร้างแผนที่ความลึกจาก พารัลแลกซ์ แบบการมองเห็นของมนุษย์ โดยจะถูกจำกัดตามมุมรับภาพของเลนส์ที่แคบกว่าโดยธรรมชาติ
    2. รุ่นที่มีกล้องหลังเพียงตัวเดียวอย่าง iPhone XR จะประเมินความลึกคร่าว ๆ จากพิกเซลโฟกัสของเซนเซอร์ แล้วใช้แมชชีนเลิร์นนิงปรับปรุงข้อมูลต้นฉบับที่ความละเอียดต่ำและไม่แม่นยำ: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. ใน iPhone SE ที่ไม่มีแม้แต่พิกเซลโฟกัส ก็สร้างแผนที่ความลึกด้วยแมชชีนเลิร์นนิงล้วน ๆ และมีความสัมพันธ์กับโลกจริงต่ำที่สุด ถึงขั้นโดนภาพถ่ายของภาพถ่ายหลอกได้: https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. เซลฟีบน iPhone ที่มี FaceID จะสร้างแผนที่ความลึกจากการสแกน 3D ของกล้อง TrueDepth ซึ่งในภาพเซลฟีของบทความก็ดูเบลอกว่าและเหมือนความละเอียดต่ำกว่า
      ภาพเสริมที่เห็นในบทความซึ่งระบายคน แว่นตา เส้นผม และผิวเป็นสีขาวนั้น Apple เรียกว่า portrait effects mattes และสร้างด้วยแมชชีนเลิร์นนิง
      เมื่อก่อนเคยทำแอปที่ใช้แผนที่ความลึกกับ portrait effects mattes ของภาพบุคคลเพื่อสร้างฟิลเตอร์แนวสร้างสรรค์ สนุกมากทีเดียว แต่ตอนนี้เลิกให้บริการไปแล้ว แผนที่ความลึกยังมีความเป็นไปได้ทางศิลปะอีกมาก
    • iPhone รุ่นใหม่ ๆ จะบันทึกแผนที่ความลึกในโหมดถ่ายภาพปกติด้วย หากในฉากมีคนหรือสัตว์เลี้ยง
      อยากรู้ว่าตอนนั้นแอปชื่ออะไร และยังมีวิดีโอเหลืออยู่ไหม ผมเองก็ทำเครื่องมือเล็ก ๆ ชื่อ Matte Viewer เป็นส่วนหนึ่งของชุดเครื่องมือภาพถ่าย ไม่มีเอฟเฟกต์ รองรับแค่การดูและส่งออก: https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com คือ กรอบภาพโฮโลกราฟิก ที่สามารถแสดงภาพ iPhone ที่มีแผนที่ความลึกให้เป็น 3D จริงได้
    • บทความเกี่ยวกับวิธีที่ 3 นั้นเป็นข้อมูลเมื่อ 5 ปีก่อน ดังนั้นตอนนี้ควรดู ml-depth-pro ของ Apple ด้วย: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • LIDAR ถูกปรับให้เหมาะกับออโต้โฟกัสที่รวดเร็วและการโฟกัสในที่แสงน้อยเป็นหลัก มากกว่าการสร้างแผนที่ความลึกแบบเต็มความละเอียด
    • สงสัยว่าวิธีที่ 4 จะใช้สำหรับ การตรวจจับความมีชีวิตของชีวมิติ ในแอปความปลอดภัยได้หรือไม่
  • เป็นบทความที่น่าสนใจ แผนที่ความลึกแบบนี้น่าจะถูกใช้กับการเบลอฉากหลังแบบความชัดลึกในโหมด “ภาพบุคคล” หรือก็คือโบเก้ปลอม
    การที่สามารถเปลี่ยนจุดโฟกัสภายหลังถ่ายภาพ และปรับความชัดลึกด้วย “รูรับแสง” ได้ เป็นสิ่งที่น่าสนใจเสมอ แต่รูปร่างของ โบเก้ปลอม ดูไม่ค่อยดี มันดูเหมือน Photoshop หยาบ ๆ ตลอด
    เหมือนจะมีการพิมพ์ผิดในชื่อฟอร์แมตไฟล์: “HEIC” 14 ครั้ง, “HIEC” 3 ครั้ง

    • เหตุผลที่มันดูปลอม น่าจะเพราะทำ ออปติกและคณิตศาสตร์ของรูรับแสง ผิด และจากมุมมองเชิงผลิตภัณฑ์ก็เลือกใช้การประมาณที่แย่มาก แต่พอให้คน 80% พอใจ
      น่าจะทำแอปกล้องที่ดีกว่านี้ได้ด้วยคณิตศาสตร์รูรับแสงที่ถูกต้อง แต่อยากรู้ว่าคนจะยอมจ่ายไหม หรือผู้ใช้มือถือส่วนใหญ่แยกความต่างไม่ออกและไม่สนใจ
    • แก้คำผิดแล้ว
    • ในมุมของช่างภาพนั้น โบเก้ปลอม เป็นอะไรที่ทนดูได้ยาก มันต่างจากโบเก้ของเลนส์ดี ๆ โดยสิ้นเชิงและดูไม่เป็นธรรมชาติอย่างน่ากลัว น่าแปลกที่ผู้คนคิดว่ามันสวย
      ถ้าอยากได้ภาพบุคคลสวย ๆ ซื้อหรือเช่า DSLR ราคาถูกสักตัว ผลลัพธ์ก็ดีกว่าเป็นร้อยเท่า
  • Reality Composer บน iOS มีฟังก์ชันเฉพาะสำหรับจับวัตถุโดยใช้ LIDAR
    รู้แล้วก็ผิดหวังที่บนอุปกรณ์ Apple ที่ไม่มี LIDAR มันไม่สลับไปใช้โฟโตแกรมเมทรีแทน เป็นข้อมูลที่มีประโยชน์สำหรับคนที่อยากทำงาน 3D modeling หรือโฟโตแกรมเมทรีแบบผม

    • การสแกน 3D ที่ประสบความสำเร็จที่สุดสำหรับผมคือ Heges โดย LiDAR ใช้ได้ดีพอสมควรกับวัตถุขนาดใหญ่ เช่น รถยนต์ และกล้องความลึก Face ID ก็ใช้จับวัตถุขนาดเล็กได้ด้วย
      สำหรับการสแกนวัตถุเล็ก ผมซื้อ Creality Ferret SE จาก TikTok มาราว 100 ดอลลาร์ และมันยอดเยี่ยมมาก
    • Polycam มีเส้นทางทดแทนอยู่
      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 กับข้อมูลจากกล้องปกติ

    • ผมก็คิดเหมือนกันว่า LIDAR ใช้สำหรับการโฟกัสจริง ส่วนแผนที่ความลึกคำนวณจาก พารัลแลกซ์ ของกล้องหลายตัว
  • บทความพูดถึง HDR gain map ค่อนข้างยาว แต่ไม่ค่อยเข้าใจว่ามันเกี่ยวข้องกับ depth map อย่างไร
    สงสัยว่าสามารถข้ามการจัดการส่วนที่เกี่ยวกับ HDR gain map ไป แต่ยังคงเก็บ depth map ไว้ได้หรือไม่
    ส่วนตัวไม่ชอบการแสดงผล HDR ของ iPhone เพราะมันเพิ่มความสว่างหน้าจอเกินกว่าค่าสูงสุดที่ผู้ใช้ตั้งไว้ เลยอยากลบ HDR gain map ออกจากรูปของตัวเอง
    HDR แบบสมัยก่อนหมายถึงการถ่ายสามภาพแล้วนำมารวมกัน โดยตัดส่วนที่มืดหรือสว่างเกินไปออก และภาพที่ได้ก็ไม่ได้พกข้อมูลแยกว่าตัวเองเป็น HDR ติดไปด้วย

    • ฉันก็คิดเหมือนกันตอนอ่านบทความ และสงสัยว่าตัวเองพลาดอะไรไปหรือเปล่า ภาพรวมเรื่อง depth map นั้นดี แต่พออ่านไปช่วงหลังกลับพูดถึง gain map กับฟอร์แมตไฟล์หลายแบบเป็นส่วนใหญ่ เลยรู้สึกค่อนข้างหลุดประเด็น
    • ในการตั้งค่า Photos สามารถปิดการแสดง Display Enhanced HDR ได้
  • สงสัยว่าสามารถใช้ depth map มาสร้าง stereogram หรือ SIRDS ได้หรือไม่ จำได้ว่าเมื่อก่อนเคยสร้าง stereogram จากภาพ grayscale ที่คล้ายกันมาก ๆ

    • ทำได้อยู่แล้ว เพียงแต่ UI นี้ดูเหมือนจะมีเฉพาะใน visionOS เวอร์ชันของแอป Photos
      ถ้ารูปในอัลบั้มมี depth map อยู่แล้ว หรือมีความละเอียดสูงพอที่การประมาณด้วยแมชชีนเลิร์นนิงจะทำได้ดีพอ ก็สามารถแปลงเป็น “Spatial Format” ได้
      มันยังอ่าน EXIF และ “ปรับสเกล” ขนาดทางกายภาพของภาพให้ตรงกับมุมรับภาพตอนถ่ายจริงด้วย ดังนั้นภาพมุมกว้างจะดูมีขนาดใหญ่กว่าในพื้นที่ VR มาก เมื่อเทียบกับภาพเทเลโฟโต้
      สำหรับฉัน แค่ปุ่มกับฟีเจอร์นี้อย่างเดียวก็คุ้มกับเงิน 4,000 ดอลลาร์ที่จ่ายไปแล้ว พอได้เห็นภาพที่ถ่ายด้วย Nikon D7 ในปี 2007 แบบ 3D เต็มรูปแบบและมีสเกลถูกต้อง ก็ทำให้ความคิดถึงและความทรงจำที่ลืมไปนานกลับมา จนรู้สึกสะเทือนใจพอสมควร
      Apple พลาดมากที่ไม่ใช้สิ่งนี้เป็นจุดขายหลักของ Vision Pro มันน่าทึ่งจริง ๆ
  • สงสัยว่า Apple ใช้สิ่งนี้กับฟีเจอร์ “create sticker” ที่กดค้างบนวัตถุในรูปเพื่อทำเป็นสติกเกอร์หรือคัดลอกไปใส่ในภาพอื่นหรือไม่

    • ไม่น่าใช่อย่างยิ่ง ฟีเจอร์นั้นทำงานได้กับภาพทุกแบบไม่ว่าจะมาจากไหน
      ในความเป็นจริงข้อมูล depth ก็คงไม่ได้ช่วยมากนัก เพราะถ้าใช้แบบนั้นก็น่าจะติดพื้นหรือโต๊ะที่วัตถุนั้นวางอยู่มาด้วยเกือบทั้งหมด
      น่าจะเป็นแนวทาง semantic segmentation ที่ใช้แมชชีนเลิร์นนิงอย่างเดียว
    • เพราะมันทำงานได้แม้กับภาพที่ไม่ได้ถ่ายด้วย iPhone ดังนั้นก็น่าจะเป็น วิธีที่ใช้แมชชีนเลิร์นนิงอย่างเดียว
  • กำลังรอวันที่ฮาร์ดแวร์มือถือทุกเครื่องจะถ่ายภาพ 3D ด้วย Gaussian splatting ได้เป็นพื้นฐาน โดยไม่ต้องมีเซ็นเซอร์ราคาแพง
    ต้นทุนการประมวลผลอาจสูง แต่ก็น่าจะยังถูกกว่าการเพิ่มเซ็นเซอร์ราคาแพงและเพิ่มน้ำหนักให้เครื่อง

  • เว็บไซต์นี้ทำงานแปลก ๆ บน Chrome ของ iOS พอเลื่อนหน้าลง ขนาดฟอนต์จะใหญ่ขึ้น แล้วพอเลื่อนกลับขึ้นก็เล็กลงอีก เลยค่อนข้างสับสน
    ถึงอย่างนั้น oiiotool ก็เป็นของที่เพิ่งรู้จักเป็นครั้งแรก และเจ๋งมาก