El mapa de profundidad del iPhone 15 Pro
(tech.marksblogg.com)- Desde 2017, el iPhone guarda junto con las imágenes capturadas un Depth Map usando LiDAR, 3D time-of-flight y escaneo 3D de luz estructurada, y también se puede extraer de los archivos HEIC del iPhone 15 Pro
- El contenedor HEIC/HEIF puede incluir no solo la imagen original, sino también un HDR gain map, un Depth Map y una gran cantidad de metadatos, por lo que ofrece más información para analizar que un JPEG simple
- HEIC Shenanigans de Finn Jaeger es una colección de scripts en Python para separar las imágenes internas y los metadatos dentro de un HEIC y convertirlos a EXR; al momento de escribirse, tiene 374 líneas
- A partir de un HEIC de ejemplo de 1.57MB, se generaron un TIFF base de 71MB, un HDR gain map TIFF de 5.9MB, un depth TIFF de 433KB y un JSON de metadatos de 14KB; la resolución del Depth Map es 768×576, menor que la original de 5712×4284
- La conversión a OpenEXR combina los canales SDR, HDR gain map y Depth Map mediante OpenImageIO, OpenColorIO y configuración ACES, y el archivo EXR final llega a crecer hasta 468MB
Cómo se guarda el Depth Map dentro de una foto de iPhone
- Apple admite Depth Map en las imágenes capturadas con iPhone desde 2017
- Entre los métodos compatibles están el escáner LiDAR, el scanner-less LIDAR 3D de time-of-flight y el escaneo 3D de structured-light
- El Depth Map y otras imágenes se guardan juntos dentro del contenedor HEIF
- HEIF puede almacenar varias imágenes y una gran cantidad de metadatos
- El formato fue diseñado entre 2013 y 2015, y Apple adoptó su variante HEIC en 2017
- Desde entonces, las imágenes tomadas con iPhone se guardan por defecto en el contenedor HEIC
- Si no se necesitan Depth Map ni HDR, también puede usarse el formato JPEG
Separar imágenes internas con HEIC Shenanigans
- Finn Jaeger publicó capturas de pantalla que muestran cómo el iPhone genera varios Depth Map
- HEIC Shenanigans ofrece scripts para separar imágenes y metadatos del contenedor HEIC y convertirlos a archivos EXR
- Al momento de escribirse, el proyecto tiene 374 líneas de código Python
- El ejemplo sigue el código de Finn usando una imagen HEIC tomada con un iPhone 15 Pro
Entorno de ejecución y herramientas necesarias
- Para ejecutarlo se requieren Python 3.12.3 y varias herramientas CLI
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv
- El paquete
libimage-exiftool-perlinstala exiftool 12.76+dfsg-1- Esa versión se lanzó a finales de enero de 2024
- Después hubo al menos 10 lanzamientos con correcciones o mejoras relacionadas con el soporte de HEIC
- Para los pasos del ejemplo esa versión es suficiente, pero si luego surge algún problema, es posible que ya se haya resuelto en una versión más reciente de exiftool
- JSON Convert
jcse usa para convertir a JSON la salida de varias herramientas CLI - Las imágenes EXR se revisaron con DJV v2.0.8
Extraer Gain Map y Depth Map desde HEIC
- El archivo HEIC de ejemplo tiene un tamaño de 1.57MB
- Al ejecutar
gain_map_extract.pyse generan los siguientes archivosIMG_E2153_metadata.json: 14KBIMG_E2153_depth_0.tiff: 433KBIMG_E2153_hdrgainmap_48.tiff: 5.9MBIMG_E2153_base.tiff: 71MB
- Los metadatos EXIF del TIFF base tienen las siguientes características
- Formato de archivo: TIFF
- Compresión: Uncompressed
- Color: RGB
- Tamaño de imagen: 5712×4284
- Megapíxeles: 24.5
- Bits Per Sample: 8 8 8
- El HDR Gain Map y el Depth Map tienen una resolución menor que la imagen original
- Imagen original: 5712×4284
- HDR Gain Map: 2856×2142
- Depth Map: 768×576
- Los metadatos JSON incluyen
aux,nclx_profile,primary,xmpy otros- La entrada
urn:com:apple:photo:2020:aux:hdrgainmaptiene el valor[48] - El tamaño de
primaryaparece como[5712, 4284]
- La entrada
- Se abrieron 3 issues en GitHub pidiendo decodificar valores codificados en base64 a un formato legible para humanos
Flujo para convertir HEIC a OpenEXR
- La Academy Software Foundation patrocina proyectos y estándares open source usados en cine, TV e industrias creativas
- Entre sus miembros están Academy of Motion Picture Arts and Sciences, Disney, Nvidia y Netflix
- OpenEXR es un formato de archivo de imagen HDR
- Fue desarrollado por primera vez en 1999 por Industrial Light and Magic
- Se publicó como open source en 2003
- Se usa en producción de efectos visuales y renderizado 3D
- Al ejecutar
heic_to_exr.py, la imagen HEIC del iPhone 15 Pro se convierte en un archivo OpenEXR- El archivo resultante pesa 468MB
- El script de conversión llama varias veces a
oiiotool, la herramienta de procesamiento de imágenes de OpenImageIO
Composición de canales en la generación del EXR
- Primero se verifica el tamaño de la imagen fuente con
oiiotool --info - A la imagen base se le asignan los canales RGB como
sdr.R,sdr.G,sdr.By se convierte el espacio de color- Pasa de la curva sRGB a Linear Rec.709
- Se convierte de Linear P3-D65 a ACEScg
- Para la conversión de color se usa un archivo de configuración de OpenColorIO
- El archivo OCIO usado es
studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio - Ese archivo está basado en texto y consta de 1,242 líneas
- Su descripción incluye
Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
- El archivo OCIO usado es
- El HDR gain map se genera en EXR usando el canal Y del TIFF
- Se nombra como canal
gainmap.Y - Se redimensiona a 4032×3024
- Se convierte de la curva Rec.709 a Linear
- Se nombra como canal
- El gain map se transforma a RGB duplicando tres veces el canal Y
gainmap.Rgainmap.Ggainmap.B
- Después de extraer con
exiftoolel valorHDRGainMapHeadroom, el gain map se escala usando el inverso de ese valor de headroom - La imagen base HDR se genera multiplicando la imagen base por el gain map escalado
- El Depth Map genera el canal EXR
depth.Ya partir del canal Y del TIFF- Se redimensiona a 4032×3024
- El archivo EXR final se compone agregando varios canales en orden
R,G,Bde la base HDRsdr.R,sdr.G,sdr.Bde la base SDRgainmap.R,gainmap.G,gainmap.Bdel gain mapdepth.Ydel Depth Map
- Si la imagen fuente tuviera matte, esa capa también se procesaría y se añadiría en esa etapa
- El archivo
final.exrse mueve junto a la imagen fuente con el nombre<prefix>_acesCG.exr
1 comentarios
Opiniones en Hacker News
Como señalaron correctamente otros comentarios, la resolución de LIDAR es demasiado baja para usarse como fuente principal de un mapa de profundidad.
Tengo entendido que el iPhone obtiene datos de profundidad de unas cuatro maneras, según el modelo y la cámara. Antes estos mapas de profundidad solo se guardaban en el modo retrato, pero parece que los iPhone recientes también los guardan en fotos normales.
Las imágenes auxiliares del artículo que muestran en blanco a la persona, los lentes, el cabello y la piel son lo que Apple llama portrait effects mattes, y se generan con machine learning.
Hace tiempo hice una app que usaba los mapas de profundidad y los portrait effects mattes de las fotos en modo retrato para crear filtros creativos; fue bastante divertida, pero ya no está disponible. Los mapas de profundidad tienen muchas posibilidades artísticas nuevas.
Me da curiosidad cuál era el nombre de esa app y si queda algún video. Yo también hice una herramienta pequeña llamada Matte Viewer como parte de una serie de herramientas fotográficas; no tiene efectos, solo permite ver y exportar: https://apps.apple.com/us/app/matte-viewer/id6476831058
Es un artículo interesante. Estos mapas de profundidad parecen usarse para el desenfoque de fondo por profundidad de campo en el modo “retrato”, es decir, para el bokeh falso.
Siempre me pareció interesante que, incluso después de tomar la foto, se pueda cambiar el foco y ajustar la profundidad de campo con la “apertura”, pero la forma del bokeh falso no me gusta. Siempre se ve como un Photoshop burdo.
Parece haber un error tipográfico en la notación del formato de archivo: “HEIC” 14 veces, “HIEC” 3 veces.
Creo que se podría hacer una mejor app de cámara con matemáticas de apertura correctas, pero me pregunto si la gente pagaría por eso, o si los usuarios de teléfono no notarían la diferencia ni les importaría.
Si quieres un buen retrato, comprar o pedir prestada una DSLR barata dará resultados 100 veces mejores.
Reality Composer para iOS tiene una función dedicada para capturar objetos usando LIDAR.
Me decepcionó enterarme de que en dispositivos Apple sin LIDAR no se reemplaza con fotogrametría. Es un dato útil para alguien como yo que quiere hacer modelado 3D o trabajos de fotogrametría.
Para escanear objetos pequeños compré en TikTok un Creality Ferret SE por unos 100 dólares y es excelente.
También escuché buenos comentarios de que Canvas requiere LiDAR, mientras que en Scaniverse LiDAR es opcional.
Los mapas de profundidad y mapas semánticos son bastante divertidos de ver, y si los llevas a programas como TouchDesigner, Blender o Cinema 4D puedes crear efectos de profundidad geniales a partir de fotos.
También pueden usarse para procesamiento de imágenes, y al final Apple también los usa con ese fin.
Antes solo se guardaban en el modo retrato, pero los iPhone recientes los guardan casi automáticamente cuando detectan una persona o una mascota en la escena.
Estoy creando apps y herramientas de fotografía (https://heliographe.net), y una de ellas, Matte Viewer, sirve para ver y exportar estos datos: https://apps.apple.com/us/app/matte-viewer/id6476831058
La resolución del LIDAR en sí es mucho más baja que la del mapa de profundidad que aparece en el artículo. Tiene que crearse fusionando datos de LIDAR y de la cámara normal.
El texto trata bastante extensamente el mapa de ganancia HDR, pero no entiendo bien qué tiene que ver eso con el mapa de profundidad.
Me pregunto si se puede omitir el procesamiento relacionado con el mapa de ganancia HDR y mantener el mapa de profundidad.
Personalmente no me gusta la visualización HDR del iPhone, porque aumenta el brillo de la pantalla por encima del brillo máximo definido por el usuario. En mis fotos intento eliminar el mapa de ganancia HDR.
Antes, HDR significaba tomar tres fotos y combinarlas para eliminar las partes subexpuestas y sobreexpuestas, y la imagen resultante no llevaba información separada que indicara que era HDR.
Me pregunto si con un mapa de profundidad se pueden crear estereogramas o SIRDS. Recuerdo haber generado estereogramas a partir de imágenes en escala de grises muy parecidas hace tiempo.
Si una foto del álbum tiene un mapa de profundidad, o si la resolución es lo suficientemente alta como para que la aproximación por aprendizaje automático funcione bien, se puede convertir a “Spatial Format”.
También lee el EXIF y “escala” el tamaño físico de la imagen según el ángulo de visión original de la toma. Por eso, en un espacio de VR, una foto gran angular se ve físicamente mucho más grande que una foto con teleobjetivo.
Personalmente, solo este botón y esta función justifican los 4,000 dólares que gasté en el dispositivo. Ver una foto tomada en 2007 con una Nikon D7 en 3D completo y con la escala correcta hizo revivir una nostalgia y recuerdos que tenía muy olvidados, y fue bastante emotivo.
Es un error que Apple no presente esto como un punto de venta central del Vision Pro. Es realmente increíble.
Me pregunto si Apple usa esto para la función “create sticker”, que permite mantener presionado un sujeto en una foto para convertirlo en sticker o copiarlo a otra imagen.
La información de profundidad probablemente tampoco sería de mucha ayuda en la práctica. Si lo hiciera así, terminaría incluyendo casi todo el piso o la mesa donde está el sujeto.
Es más probable que sea un enfoque de segmentación semántica que usa solo aprendizaje automático.
Estoy esperando el día en que todo el hardware de los teléfonos pueda tomar imágenes 3D usando Gaussian splatting por defecto, sin sensores caros.
El costo computacional puede ser alto, pero probablemente sea más barato que agregar sensores caros y aumentar el peso.
El sitio se comporta raro en Chrome para iOS. Cuando desplazo la página hacia abajo, el tamaño de la fuente aumenta, y cuando desplazo hacia arriba vuelve a reducirse, lo cual resulta bastante confuso.
Aun así, no conocía oiiotool y me pareció muy genial.