iPhone 15 ProのDepth Map
(tech.marksblogg.com)- 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 をサポートしている
- 対応方式には、LiDARスキャナー、3D time-of-flight scanner-less LIDAR、structured-light 3Dスキャンが含まれる
- 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ツールが必要
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.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: 14KBIMG_E2153_depth_0.tiff: 433KBIMG_E2153_hdrgainmap_48.tiff: 5.9MBIMG_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]が含まれる
- 使用されたOCIOファイルは
- HDR gain mapはTIFFのYチャンネルを使ってEXRとして生成する
gainmap.Yチャンネルと名付ける- サイズは 4032×3024 にリサイズする
- Rec.709カーブからLinearに変換する
- gain mapはYチャンネルを3回複製してRGBにする
gainmap.Rgainmap.Ggainmap.B
exiftoolでHDRGainMapHeadroom値を抽出した後、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
- HDR baseの
- ソース画像にmatteがあれば、その段階でmatteレイヤーも処理・追加される
- 最終
final.exrファイルはソース画像の隣に<prefix>_acesCG.exrという名前で移動される
1件のコメント
Hacker News の意見
他のコメントが正しく指摘しているように、LIDAR の解像度は深度マップの主データとして使うには低すぎます。
iPhone はモデルやカメラによって、おおよそ4種類の方法で深度データを得ていると理解しています。以前はこうした深度マップはポートレートモードでだけ保存されていましたが、最近の 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 を買うか借りるほうが、結果は100倍良くなります。
iOS 向け Reality Composer には、LIDAR を使って物体をキャプチャする専用機能があります。
LIDAR のない Apple デバイスではフォトグラメトリで代替されないと知ってがっかりしました。私のように3Dモデリングやフォトグラメトリ作業をしようとする人には参考になります。
小物スキャン用に TikTok で Creality Ferret SE を約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ゲインマップをかなり長く扱っているが、これが深度マップとどう関係するのかよく分からない。
HDRゲインマップ関連の処理をスキップしつつ、深度マップは維持できるのかが気になる。
個人的にはiPhoneのHDR表示が嫌いだ。ユーザーが指定した最大輝度よりも画面の明るさを上げるからだ。自分の写真からはHDRゲインマップを削除しようと思っている。
昔のHDRは3枚撮って合成し、露出不足・露出過多の部分を取り除くという意味で、出力画像が自分はHDRだという別情報を持ち歩くものではなかった。
深度マップでステレオグラムやSIRDSを作れるのか気になる。昔、かなり似たようなグレースケール画像からステレオグラムを生成した記憶がある。
アルバム内の写真に深度マップがあるか、機械学習による近似が十分うまくいくほど解像度が高ければ、“Spatial Format”に変換できる。
EXIFも読んで、元の撮影画角に合わせて画像の物理的な大きさを「スケーリング」する。そのため広角写真はVR空間では望遠写真より物理的にはるかに大きく見える。
個人的には、このボタンと機能だけでデバイスに払った4,000ドルの価値が正当化される。2007年にNikon D7で撮った写真を完全な3Dかつ正しいスケールで見たら、長く忘れていた郷愁や記憶が蘇ってきて、かなり感情的になった。
AppleがこれをVision Proの主要なセールスポイントとして押し出していないのは失敗だ。本当にすごい。
Appleが写真内の被写体を長押ししてステッカーにしたり、別の画像にコピーしたりする「create sticker」機能にこれを使っているのか気になる。
深度情報も実際にはあまり役に立たない可能性が高い。そうすると、被写体が置かれている床やテーブルまでほとんど含まれてしまうだろう。
これは機械学習だけを使うセマンティックセグメンテーションのアプローチである可能性が高い。
高価なセンサーなしに、すべてのスマートフォンのハードウェアが標準で Gaussian splatting を使って3D画像を撮れる日を待っている。
計算コストは大きいかもしれないが、高価なセンサーを追加して重量を増やすよりは、おそらく安く済む可能性がある。
サイトがiOS Chromeで変な挙動をする。ページを下にスクロールするとフォントサイズが大きくなり、上にスクロールするとまた小さくなるので、かなり混乱する。
それでも oiiotool は初めて知ったが、とてもいい。