O Depth Map do iPhone 15 Pro
(tech.marksblogg.com)- Desde 2017, o iPhone vem salvando junto às imagens capturadas um Depth Map, usando LiDAR, 3D time-of-flight e varredura 3D por luz estruturada, e isso também pode ser extraído dos arquivos HEIC do iPhone 15 Pro
- O contêiner HEIC/HEIF pode armazenar não só a imagem original, mas também HDR gain map, Depth Map e uma grande quantidade de metadados, oferecendo muito mais informação para análise do que um JPEG simples
- O HEIC Shenanigans, de Finn Jaeger, é uma coleção de scripts em Python para separar imagens internas e metadados do HEIC e convertê-los para EXR; no momento da escrita, o projeto tinha 374 linhas
- Em um HEIC de exemplo de 1,57 MB, foram gerados um TIFF base de 71 MB, um TIFF de HDR gain map de 5,9 MB, um TIFF de depth de 433 KB e um JSON de metadados de 14 KB; a resolução do Depth Map é 768×576, menor que a original de 5712×4284
- A conversão para OpenEXR passa por OpenImageIO, OpenColorIO e configuração ACES para combinar os canais de SDR, HDR gain map e Depth Map, e o arquivo EXR final chega a 468 MB
Como o Depth Map é armazenado dentro das fotos do iPhone
- A Apple oferece suporte a Depth Map nas imagens capturadas pelo iPhone desde 2017
- Entre os métodos suportados estão scanner LiDAR, scanner-less LIDAR 3D de time-of-flight e varredura 3D por structured-light
- O Depth Map e outras imagens são armazenados juntos em um arquivo contêiner HEIF
- O HEIF pode conter várias imagens e muitos metadados
- O formato foi projetado entre 2013 e 2015, e a Apple adotou a variação HEIC em 2017
- Desde então, as imagens capturadas no iPhone são salvas por padrão em um contêiner HEIC
- Se não houver necessidade de Depth Map e HDR, também é possível usar o formato JPEG
Separando as imagens internas com HEIC Shenanigans
- Finn Jaeger publicou capturas de tela mostrando o iPhone gerando vários Depth Maps
- O HEIC Shenanigans fornece scripts para separar imagens e metadados do contêiner HEIC e convertê-los em arquivos EXR
- No momento da escrita, o projeto tinha 374 linhas de código Python
- O exemplo segue o codebase de Finn usando uma imagem HEIC fotografada com um iPhone 15 Pro
Ambiente de execução e ferramentas necessárias
- A execução exige Python 3.12.3 e várias ferramentas de linha de comando
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv
- O pacote
libimage-exiftool-perlinstala o exiftool 12.76+dfsg-1- Essa versão foi lançada no fim de janeiro de 2024
- Depois disso, houve pelo menos 10 releases com correções ou melhorias relacionadas ao suporte a HEIC
- Para as etapas do exemplo essa versão basta, mas, se surgir algum problema depois, ele pode já ter sido resolvido no exiftool mais recente
- O JSON Convert
jcé usado para transformar a saída de várias ferramentas CLI em JSON - As imagens EXR foram verificadas com o DJV v2.0.8
Extraindo Gain Map e Depth Map do HEIC
- O arquivo HEIC de exemplo tem 1,57 MB
- Ao executar
gain_map_extract.py, os seguintes arquivos são geradosIMG_E2153_metadata.json: 14 KBIMG_E2153_depth_0.tiff: 433 KBIMG_E2153_hdrgainmap_48.tiff: 5,9 MBIMG_E2153_base.tiff: 71 MB
- Os metadados EXIF do TIFF base têm as seguintes características
- Formato do arquivo: TIFF
- Compressão: Uncompressed
- Cor: RGB
- Tamanho da imagem: 5712×4284
- Megapixels: 24.5
- Bits Per Sample: 8 8 8
- O HDR Gain Map e o Depth Map têm resolução menor que a da imagem original
- Imagem original: 5712×4284
- HDR Gain Map: 2856×2142
- Depth Map: 768×576
- Os metadados JSON incluem
aux,nclx_profile,primary,xmpe outros- O item
urn:com:apple:photo:2020:aux:hdrgainmaptem o valor[48] - O tamanho de
primaryaparece como[5712, 4284]
- O item
- Foram registrados três issues no GitHub pedindo a decodificação, em formato legível por humanos, dos valores codificados em base64
Fluxo de conversão de HEIC para OpenEXR
- A Academy Software Foundation apoia projetos e padrões open source usados na indústria de cinema, TV e criação
- Entre os membros estão Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix e outros
- O OpenEXR é um formato de arquivo de imagem HDR
- Foi desenvolvido inicialmente pela Industrial Light and Magic em 1999
- Tornou-se open source em 2003
- É usado na produção de efeitos visuais e renderização 3D
- Ao executar
heic_to_exr.py, a imagem HEIC do iPhone 15 Pro é convertida em um arquivo OpenEXR- O arquivo resultante tem 468 MB
- O script de conversão chama várias vezes o
oiiotool, ferramenta de processamento de imagem do OpenImageIO
Composição dos canais na etapa de geração do EXR
- Primeiro, usa-se
oiiotool --infopara verificar o tamanho da imagem de origem - A imagem base renomeia os canais RGB para
sdr.R,sdr.G,sdr.Be faz conversão de espaço de cor- Passa da curva sRGB para Linear Rec.709
- Converte de Linear P3-D65 para ACEScg
- A conversão de cor usa um arquivo de configuração do OpenColorIO
- O arquivo OCIO usado é
studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio - Esse arquivo é baseado em texto e tem 1.242 linhas
- A descrição inclui
Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
- O arquivo OCIO usado é
- O HDR gain map usa o canal Y do TIFF para gerar um EXR
- Ele é nomeado como canal
gainmap.Y - É redimensionado para 4032×3024
- É convertido da curva Rec.709 para Linear
- Ele é nomeado como canal
- O gain map é transformado em RGB duplicando o canal Y três vezes
gainmap.Rgainmap.Ggainmap.B
- Depois de extrair o valor
HDRGainMapHeadroomcomexiftool, o gain map é escalado usando o inverso desse valor de headroom - A imagem base HDR é criada multiplicando a imagem base pelo gain map escalado
- O Depth Map usa o canal Y do TIFF para gerar o canal EXR
depth.Y- Ele é redimensionado para 4032×3024
- O arquivo EXR final é montado adicionando vários canais em sequência
R,G,Bda base HDRsdr.R,sdr.G,sdr.Bda base SDRgainmap.R,gainmap.G,gainmap.Bdo gain mapdepth.Ydo Depth Map
- Se a imagem de origem tivesse matte, essa camada também seria processada e adicionada nessa etapa
- O arquivo
final.exré movido ao lado da imagem de origem com o nome<prefix>_acesCG.exr
1 comentários
Opiniões no Hacker News
Como outros comentários apontaram corretamente, a resolução do LIDAR é baixa demais para ser usada como principal dado do mapa de profundidade
Pelo que sei, o iPhone obtém dados de profundidade de aproximadamente quatro maneiras, dependendo do modelo e da câmera. Antes, esses mapas de profundidade eram salvos apenas no modo Retrato, mas os iPhones recentes parecem salvá-los também em fotos comuns
As imagens auxiliares mostradas no artigo, que marcam pessoas, óculos, cabelo e pele em branco, são chamadas pela Apple de portrait effects mattes e são geradas por aprendizado de máquina
Antigamente, criei um app que usava mapas de profundidade e portrait effects mattes de fotos em modo Retrato para fazer filtros criativos, e foi bem divertido, mas ele já saiu do ar. Há muitas novas possibilidades artísticas nos mapas de profundidade
Fiquei curioso para saber qual era o nome desse app e se ainda existe algum vídeo. Eu também fiz uma pequena ferramenta chamada Matte Viewer, como parte de uma série de ferramentas de fotografia; ela não tem efeitos, só visualização e exportação: https://apps.apple.com/us/app/matte-viewer/id6476831058
Artigo interessante. Esses mapas de profundidade parecem ser usados no desfoque de fundo por profundidade de campo do modo “Retrato”, ou seja, no bokeh falso
Sempre achei interessante poder mudar o foco depois de tirar a foto e ajustar a profundidade de campo pela “abertura”, mas o formato do bokeh falso é ruim. Sempre parece um Photoshop malfeito
Parece haver um erro de digitação na indicação do formato do arquivo: “HEIC” 14 vezes, “HIEC” 3 vezes
Parece possível criar um app de câmera melhor com a matemática correta da abertura, mas fico me perguntando se as pessoas pagariam por isso ou se usuários de celular nem perceberiam a diferença nem se importariam
Se você quer retratos bonitos, comprar ou pegar emprestada uma DSLR barata dá um resultado 100 vezes melhor
O Reality Composer para iOS tem um recurso dedicado para capturar objetos usando LIDAR
Fiquei decepcionado ao descobrir que, em dispositivos Apple sem LIDAR, ele não é substituído por fotogrametria. Isso serve de referência para quem, como eu, quer trabalhar com modelagem 3D ou fotogrametria
Comprei no TikTok um Creality Ferret SE por cerca de US$ 100 para escanear objetos pequenos, e ele é excelente
Também ouvi boas avaliações dizendo que o Canvas exige LiDAR, enquanto no Scaniverse o LiDAR é opcional
Mapas de profundidade e mapas semânticos são bem divertidos de ver e, se você os colocar em programas como TouchDesigner, Blender ou Cinema 4D, dá para criar efeitos de profundidade interessantes a partir de fotos
Eles também podem ser usados no processamento de imagens, e a própria Apple acaba usando para isso
Antes eram salvos apenas no modo Retrato, mas iPhones recentes os salvam quase automaticamente quando detectam pessoas ou animais de estimação na cena
Estou criando apps e ferramentas de fotografia (https://heliographe.net), e uma delas, Matte Viewer, é uma ferramenta para visualizar e exportar esses dados: https://apps.apple.com/us/app/matte-viewer/id6476831058
A resolução do LIDAR em si é muito menor do que a do mapa de profundidade mostrado no artigo. Ele precisa ser criado combinando dados do LIDAR e da câmera comum
O texto trata de mapas de ganho HDR por bastante tempo, mas não entendo bem por que isso estaria relacionado ao mapa de profundidade
Fico curioso se dá para pular o processamento relacionado ao mapa de ganho HDR e ainda manter o mapa de profundidade
Pessoalmente, não gosto da exibição HDR do iPhone. Isso porque ela aumenta o brilho da tela acima do brilho máximo definido pelo usuário. Nas minhas fotos, tento remover o mapa de ganho HDR
Antigamente, HDR significava tirar três fotos e combiná-las para remover áreas subexpostas e superexpostas, e a imagem resultante não carregava uma informação separada dizendo que era HDR
Fico curioso se dá para criar estereogramas ou SIRDS a partir do mapa de profundidade. Lembro de já ter gerado estereogramas a partir de imagens em tons de cinza muito parecidas há muito tempo
Se uma foto do álbum tiver um mapa de profundidade, ou se a resolução for alta o suficiente para uma aproximação por aprendizado de máquina funcionar bem, dá para convertê-la para “Spatial Format”
Ele também lê o EXIF e “escala” o tamanho físico da imagem para corresponder ao ângulo de visão original da captura. Por isso, fotos grande-angulares aparecem fisicamente muito maiores no espaço de VR do que fotos tiradas com teleobjetiva
Pessoalmente, só esse botão e essa função já justificam os 4.000 dólares que gastei no dispositivo. Ver fotos que tirei em 2007 com uma Nikon D7 em 3D completo e na escala correta trouxe de volta uma nostalgia e lembranças há muito esquecidas, e foi bem emocionante
É um erro a Apple não apresentar isso como um dos principais argumentos de venda do Vision Pro. É realmente incrível
Fico curioso se a Apple usa isso no recurso “create sticker”, que permite pressionar e segurar um sujeito em uma foto para transformá-lo em figurinha ou copiá-lo para outra imagem
A informação de profundidade provavelmente também não ajudaria muito na prática. Se fosse usada assim, acabaria incluindo quase todo o chão ou a mesa onde o sujeito está
Isso provavelmente é uma abordagem de segmentação semântica usando apenas aprendizado de máquina
Estou esperando o dia em que todo hardware de celular consiga, por padrão, capturar imagens 3D usando Gaussian splatting, sem sensores caros
O custo computacional pode ser alto, mas talvez ainda seja mais barato do que adicionar sensores caros e aumentar o peso
O site se comporta de forma estranha no Chrome do iOS. Quando rolo a página para baixo, o tamanho da fonte aumenta; quando rolo para cima, diminui de novo, o que é bem confuso
Ainda assim, eu não conhecia o oiiotool, e ele é muito bacana