2 ポイント 投稿者 GN⁺ 2025-06-06 | 1件のコメント | WhatsAppで共有
  • 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 Issueが3件登録されている

HEICをOpenEXRに変換する流れ

  • Academy Software Foundation は、映画、テレビ、クリエイティブ産業で使われるオープンソースプロジェクトと標準を支援している
    • メンバーには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チャンネルを3回複製して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 という名前で移動される

1件のコメント

 
GN⁺ 2025-06-06
Hacker News の意見
  • 他のコメントが正しく指摘しているように、LIDAR の解像度は深度マップの主データとして使うには低すぎます。
    iPhone はモデルやカメラによって、おおよそ4種類の方法で深度データを得ていると理解しています。以前はこうした深度マップはポートレートモードでだけ保存されていましたが、最近の iPhone では通常の写真でも保存しているようです。

    1. iPhone 7 Plus 以降は、背面の2つのカメラで同時に撮影し、人間の視覚のように視差で深度マップを作ります。より狭いレンズの画角に自然と制限されます。
    2. iPhone XR のように背面カメラが1つしかないモデルでは、センサーのフォーカスピクセルで大まかな深度を推定し、低解像度で不正確な元データを機械学習で補正します: 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. Face ID 搭載 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 で Creality Ferret SE を約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ゲインマップをかなり長く扱っているが、これが深度マップとどう関係するのかよく分からない。
    HDRゲインマップ関連の処理をスキップしつつ、深度マップは維持できるのかが気になる。
    個人的にはiPhoneのHDR表示が嫌いだ。ユーザーが指定した最大輝度よりも画面の明るさを上げるからだ。自分の写真からはHDRゲインマップを削除しようと思っている。
    昔のHDRは3枚撮って合成し、露出不足・露出過多の部分を取り除くという意味で、出力画像が自分は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 は初めて知ったが、とてもいい。