2P by GN⁺ | ★ favorite | 댓글 1개
  • iPhone은 2017년부터 LiDAR, 3D time-of-flight, 구조광 3D 스캔으로 촬영 이미지 안에 Depth Map을 함께 저장해 왔고, iPhone 15 Pro의 HEIC 파일에서도 이를 꺼내 볼 수 있음
  • HEIC/HEIF 컨테이너는 원본 이미지뿐 아니라 HDR gain map, Depth Map, 대량의 메타데이터를 함께 담을 수 있어 단순 JPEG보다 분석할 정보가 많음
  • Finn Jaeger의 HEIC Shenanigans는 HEIC 내부 이미지와 메타데이터를 분리하고 EXR로 변환하는 Python 스크립트 모음이며, 작성 시점 기준 374줄 규모임
  • 예제 HEIC 1.57MB에서 base TIFF 71MB, HDR gain map TIFF 5.9MB, depth TIFF 433KB, metadata JSON 14KB가 생성됐고, Depth Map 해상도는 원본 5712×4284보다 낮은 768×576
  • OpenEXR 변환은 OpenImageIO, OpenColorIO, ACES 설정을 거쳐 SDR, HDR gain map, Depth Map 채널을 조합하며, 최종 EXR 파일은 468MB까지 커짐

iPhone 사진 안의 Depth Map 저장 방식

  • Apple은 2017년부터 iPhone 촬영 이미지에 Depth Map을 지원함
  • Depth Map과 다른 이미지는 HEIF 컨테이너 파일에 함께 저장됨
    • HEIF는 여러 이미지와 많은 메타데이터를 담을 수 있음
    • 형식은 2013~2015년에 설계됐고, Apple은 2017년에 HEIC 변형을 채택함
  • iPhone 촬영 이미지는 이후 기본적으로 HEIC 컨테이너에 저장됨
    • Depth Map과 HDR이 필요 없다면 JPEG 형식도 사용할 수 있음

HEIC Shenanigans로 내부 이미지 분리

  • Finn Jaeger는 iPhone이 여러 Depth Map을 생성하는 모습을 보여주는 스크린샷을 게시함
  • HEIC Shenanigans는 HEIC 컨테이너에서 이미지와 메타데이터를 분리하고 EXR 파일로 변환하는 스크립트를 제공함
    • 작성 시점 기준 프로젝트에는 374줄의 Python 코드가 있음
  • 예제는 iPhone 15 Pro에서 촬영한 HEIC 이미지를 사용해 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년 1월 말 릴리스됨
    • 이후 HEIC 지원 문제 수정 또는 개선을 포함한 릴리스가 최소 10개 있었음
    • 예제 단계에는 해당 버전으로 충분하지만, 이후 문제가 생기면 최신 exiftool에서 해결됐을 수 있음
  • JSON Convert jc는 여러 CLI 도구 출력을 JSON으로 바꾸는 데 사용됨
  • EXR 이미지는 DJV v2.0.8로 확인함

HEIC에서 Gain Map과 Depth Map 추출

  • 예제 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
  • base TIFF의 EXIF 메타데이터는 다음 특성을 가짐
    • 파일 형식: 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]로 표시됨
  • base64로 인코딩된 값을 사람이 읽을 수 있는 형태로 디코딩해 달라는 GitHub 이슈 3개가 등록됨

HEIC를 OpenEXR로 변환하는 흐름

  • Academy Software Foundation은 영화, TV, 창작 산업에서 쓰이는 오픈소스 프로젝트와 표준을 후원함
    • 회원에는 Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix 등이 포함됨
  • OpenEXR는 HDR 이미지 파일 형식임
    • 1999년 Industrial Light and Magic이 처음 개발함
    • 2003년에 오픈소스로 공개됨
    • 시각효과와 3D 렌더링 제작에 사용됨
  • heic_to_exr.py를 실행하면 iPhone 15 Pro HEIC 이미지가 OpenEXR 파일로 변환됨
    • 결과 파일 크기는 468MB
  • 변환 스크립트는 OpenImageIO의 이미지 처리 도구인 oiiotool을 여러 차례 호출함

EXR 생성 단계의 채널 구성

  • 먼저 oiiotool --info로 소스 이미지의 크기를 확인함
  • base 이미지는 RGB 채널을 sdr.R, sdr.G, sdr.B로 이름 붙이고 색 공간을 변환함
    • 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은 TIFF의 Y 채널을 사용해 EXR로 생성됨
    • gainmap.Y 채널로 이름 붙임
    • 크기는 4032×3024로 리사이즈함
    • Rec.709 곡선에서 Linear로 변환함
  • gain map은 Y 채널을 세 번 복제해 RGB로 바뀜
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • exiftoolHDRGainMapHeadroom 값을 추출한 뒤, gain map은 해당 headroom 값의 역수를 사용해 스케일링됨
  • HDR base 이미지는 base 이미지와 스케일된 gain map을 곱해 생성됨
  • Depth Map은 TIFF의 Y 채널로 EXR 형식의 depth.Y 채널을 생성함
    • 크기는 4032×3024로 리사이즈함
  • 최종 EXR 파일은 여러 채널을 순서대로 추가해 구성됨
    • HDR base의 R, G, B
    • SDR base의 sdr.R, sdr.G, sdr.B
    • gain map의 gainmap.R, gainmap.G, gainmap.B
    • Depth Map의 depth.Y
  • 소스 이미지에 matte가 있었다면 해당 단계에서 matte 레이어도 처리되고 추가됨
  • 최종 final.exr 파일은 소스 이미지 옆에 <prefix>_acesCG.exr 이름으로 이동됨

댓글과 토론

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. FaceID가 있는 iPhone의 셀피는 TrueDepth 카메라의 3D 스캔으로 깊이 지도를 만듦. 글의 셀피에서도 더 흐릿하고 저해상도처럼 보임
      글에 보이는 사람, 안경, 머리카락, 피부를 흰색으로 표시하는 보조 이미지들은 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년 전 자료라서, 지금은 Apple의 ml-depth-pro도 봐야 함: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • LIDAR는 풀해상도 깊이 지도를 만들기보다는 빠른 자동 초점과 저조도 초점 맞추기에 주로 최적화되어 있음
    • 4번 방식이 보안 앱에서 생체 여부 감지에 쓰일 수 있는지 궁금함
  • 흥미로운 글임. 이런 깊이 지도는 “인물 사진” 모드의 피사계 심도 배경 흐림, 즉 가짜 보케에 쓰이는 듯함
    사진을 찍은 뒤에도 초점을 바꾸고 “조리개”로 피사계 심도를 조절할 수 있다는 점은 늘 흥미로웠지만, 가짜 보케의 모양은 별로임. 항상 조악한 Photoshop처럼 보임
    파일 형식 표기에 오타가 있는 듯함: “HEIC” 14번, “HIEC” 3번

    • 가짜처럼 보이는 이유는 실제 광학과 조리개 수학을 틀리게 구현했고, 제품 관점에서 80%의 사람을 만족시키는 수준의 매우 나쁜 근사를 쓰기 때문 같음
      올바른 조리개 수학으로 더 나은 카메라 앱을 만들 수 있을 것 같지만, 사람들이 돈을 낼지 아니면 휴대폰 사용자는 차이를 못 느끼고 신경 쓰지 않을지 궁금함
    • 오타는 고쳤음
    • 사진가 입장에서는 가짜 보케를 견디기 어려움. 좋은 렌즈에서 나오는 보케와 전혀 다르고 끔찍하게 부자연스러운데, 사람들이 예쁘다고 생각한다는 게 놀라움
      예쁜 인물 사진을 원하면 저렴한 DSLR을 사거나 빌리는 편이 결과물이 100배는 나음
  • iOS용 Reality Composer에는 LIDAR를 이용해 물체를 캡처하는 전용 기능이 있음
    LIDAR가 없는 Apple 기기에서는 사진측량으로 대체되지 않는다는 걸 알고 실망했음. 나처럼 3D 모델링이나 사진측량 작업을 하려는 사람에게 참고가 됨

    • 3D 스캔은 Heges로 가장 성공적이었음. LiDAR는 자동차 같은 큰 물체에 꽤 잘 맞고, Face ID 깊이 카메라로 작은 물체도 캡처할 수 있음
      작은 물체 스캔용으로 TikTok에서 약 100달러에 Creality Ferret SE를 샀는데 아주 훌륭함
    • 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 게인 맵을 꽤 길게 다루는데, 이게 깊이 지도와 왜 관련 있는지 잘 모르겠음
    HDR 게인 맵 관련 처리는 건너뛰면서 깊이 지도는 유지할 수 있는지 궁금함
    개인적으로 iPhone의 HDR 표시를 싫어함. 사용자가 지정한 최대 밝기보다 화면 밝기를 더 올리기 때문임. 내 사진에서는 HDR 게인 맵을 제거하려고 함
    예전 HDR은 세 장을 찍어 합치면서 과소·과다 노출된 부분을 제거하는 뜻이었고, 결과 이미지는 자신이 HDR이라는 별도 정보를 들고 다니지 않았음

    • 나도 글을 읽으며 같은 생각을 했고, 내가 뭔가 놓쳤나 싶었음. 깊이 지도 개요는 좋았지만 뒤로 갈수록 대부분 게인 맵과 여러 파일 형식을 다뤄서 약간 산만하게 느껴졌음
    • Photos 설정에서 디스플레이 강화 HDR 표시를 끌 수 있음
  • 깊이 지도로 스테레오그램이나 SIRDS를 만들 수 있는지 궁금함. 예전에 아주 비슷한 회색조 이미지에서 스테레오그램을 생성해본 기억이 있음

    • 이미 가능함. 다만 이 UI는 Photos 앱의 visionOS 버전에만 들어 있는 듯함
      앨범의 사진에 깊이 지도가 있거나, 기계 학습 근사가 충분히 잘될 만큼 해상도가 높으면 “Spatial Format”으로 변환할 수 있음
      EXIF도 읽어서 원본 촬영 화각에 맞게 이미지의 물리적 크기를 “스케일링”함. 그래서 광각 사진은 VR 공간에서 망원 사진보다 물리적으로 훨씬 크게 보임
      개인적으로 이 버튼과 기능만으로도 기기에 쓴 4,000달러가 정당화됨. 2007년에 Nikon D7로 찍은 사진을 완전한 3D와 올바른 스케일로 보니 오래 잊고 있던 향수와 기억이 살아나서 꽤 감정적이었음
      Apple이 이걸 Vision Pro의 핵심 판매 포인트로 내세우지 않는 건 실수임. 정말 대단함
  • Apple이 사진 속 피사체를 길게 눌러 스티커로 만들거나 다른 이미지에 복사하는 “create sticker” 기능에 이걸 쓰는지 궁금함

    • 절대 아닐 것 같음. 그 기능은 출처와 상관없이 모든 이미지에서 동작함
      깊이 정보도 실제로는 큰 도움이 안 될 가능성이 큼. 그렇게 하면 피사체가 놓인 바닥이나 테이블까지 거의 다 포함될 것임
      이건 기계 학습만 쓰는 의미론적 분할 접근일 가능성이 큼
    • iPhone으로 찍지 않은 사진에서도 동작하므로, 기계 학습만 쓰는 방식일 것임
  • 비싼 센서 없이 모든 휴대폰 하드웨어가 기본으로 Gaussian splatting을 이용해 3D 이미지를 찍는 날을 기다리고 있음
    계산 비용은 클 수 있지만, 비싼 센서를 추가하고 무게를 늘리는 것보다는 아마 더 저렴할 수 있음

  • 사이트가 iOS Chrome에서 이상하게 동작함. 페이지를 아래로 스크롤하면 글꼴 크기가 커지고, 위로 스크롤하면 다시 작아져서 꽤 혼란스러움
    그래도 oiiotool은 처음 알았는데 아주 멋짐