Segmentação semântica (poro × matriz) de imagens de micro-tomografia de raios-X (micro-CT) de rochas-reservatório, aplicada à Física de Rochas Digital (Digital Rock Physics, DRP) — o passo que destrava a estimativa de porosidade e permeabilidade para óleo & gás e para armazenamento geológico de CO₂ (CCS).
O método tradicional de laboratório leva meses por amostra. A DRP escaneia a rocha, segmenta o espaço poroso e simula as propriedades físicas direto na imagem 3D. Este projeto cobre o pipeline completo: dados → segmentação → propriedade física → validação contra laboratório, em datasets públicos reais.
Em micro-CT com artefato forte (beam hardening), o limiar global de Otsu erra um lado
inteiro da imagem; a U-Net usa contexto espacial e se mantém robusta (IoU 0.95 vs. 0.82).
Varredura em profundidade de um volume micro-CT 3D (sintético, para ilustração):
grayscale à esquerda, espaço poroso segmentado à direita.
- Pipeline reprodutível da geração de dados à validação física (porosidade estimada vs. medida de laboratório por porosímetro de Hélio).
- Datasets públicos reais com DOI: 11 arenitos (DRP-317) e carbonatos do pré-sal
brasileiro (DRP-503), em formatos científicos
.raw(memmap) e NetCDF.nc(leitura lazy). - Comparação de arquiteturas: U-Net enxuta (≈482k parâmetros) × baseline clássico (Otsu) × foundation model (SAM2-UNet, encoder Hiera congelado + adapters PEFT).
- Engenharia honesta: split espacial sem vazamento, diagnóstico de IoU inflado, efeito da resolução (alta × baixa) e do pré-processamento (grayscale puro × filtrado), e discussão explícita de por que a porosidade digital subestima a de laboratório.
- Rastreamento de experimentos com MLflow (painel único comparando todas as execuções).
- Técnicas de alta resolução / GigaVoxel:
memmap, leitura lazy de NetCDF, tiling com overlap + blending e streaming write — para volumes 3D de bilhões de voxels e vários GB que não cabem na RAM/GPU (ver seção abaixo).
| Experimento | Métrica | Resultado |
|---|---|---|
| U-Net × Otsu (artefato forte, sintético) | IoU poro | 0.95 × 0.83 — ganho de +12 pts |
| U-Net × Otsu (artefato forte) | Erro de porosidade | 0.001 × 0.020 |
| Pré-sal DRP-503 (carbonato real) | IoU validação | 0.94 (alta res.) · 0.98 (baixa res.) |
| Arenito DRP-317 — grayscale × filtrado | IoU teste | 0.875 (bruto) → 0.951 (filtrado) |
| Validação de porosidade (11 arenitos) | Erro médio vs. laboratório | 3.4 pontos percentuais |
| SAM2-UNet × U-Net (rótulos densos) | IoU validação | 0.988 × 0.991 |
Conclusão técnica do SAM2-UNet: com rótulos densos abundantes, o foundation model (213M parâmetros) não supera a U-Net treinada do zero (482k parâmetros) — confirmando empiricamente que a vantagem do prior pré-treinado encolhe nesse regime. A U-Net iguala a uma fração do custo computacional.
Empate prático em IoU (0.991 × 0.988), mas o foundation model carrega ~440× mais parâmetros —
ilustrando quando não vale a pena pagar pelo prior pré-treinado.
| Dados sintéticos (ground truth perfeito) | Arenito real (Bandera Brown) |
|---|---|
![]() |
![]() |
| Carbonato do pré-sal — alta × baixa resolução |
|---|
![]() |
Volumes de micro-CT são enormes — o gargalo de engenharia é tão importante quanto o modelo. As escalas reais usadas aqui:
| Dataset | Dimensões | Tipo | Tamanho | Total de voxels |
|---|---|---|---|---|
| DRP-317 (arenitos) | 1000 × 1000 × 1000 | uint8 (2,25 µm/voxel) |
~1 GB / volume | 1 bilhão |
| DRP-503 (pré-sal, alta res.) | até 1488 × 1340 × 1200 | NetCDF 16-bit | ~5 GB / volume | ~2,4 bilhões |
Carregar um único volume inteiro estoura a RAM e a VRAM. As técnicas aplicadas nos notebooks:
memmap(lazy loading) — os.rawsão mapeados em disco como se fossem arrays NumPy; só os blocos efetivamente acessados entram na memória. Nunca materializamos o volume inteiro.- Leitura lazy de NetCDF (
xarray) — para os.ncde 16 bits do pré-sal, lemos fatias 2D sob demanda sem carregar os GBs do volume. UmCachedVolumeguarda as fatias já lidas. - Tiling / sliding-window adaptável — cada fatia 2D é quebrada em tiles (ex.: 256×256) que cabem na GPU. O tiling se adapta a volumes não-cúbicos (cada amostra do pré-sal tem dimensões próprias) e usa padding por reflexão nas bordas.
- Overlap + blending — tiles com sobreposição, remontados com blending, eliminam as costuras nas fronteiras entre tiles.
- Streaming write — ao gerar/gravar volumes grandes, escrevemos por blocos em vez de materializar tudo de uma vez.
- Normalização por amostra — cada scan tem faixa de intensidade própria (ainda mais sendo 16-bit), então a normalização é feita amostra a amostra, não globalmente.
Para slides 2D gigapixel (patologia) o padrão seria OpenSlide/VIPS; para stacks 3D científicos, memmap + zarr/dask (chunking + lazy). Aqui
memmap+ tiling já é suficiente e mantém o projeto enxuto.
.
├── notebooks/
│ ├── 01_microct_sintetico_e_arenitos.ipynb # didático: sintético + 11 arenitos reais (DRP-317)
│ ├── 02_presal_unet_resolucao.ipynb # pré-sal real (DRP-503): alta × baixa resolução
│ └── 03_presal_sam2unet_vs_unet.ipynb # foundation model (SAM2-UNet) × U-Net baseline
├── assets/ # figuras de resultado usadas neste README
├── data/ # instruções de download dos datasets (os volumes NÃO vão no Git)
├── requirements.txt
└── LICENSE
Os notebooks foram escritos para o Google Colab com GPU (cada um tem os outputs já salvos, então dá para lê-los sem executar).
- Abra o notebook desejado no Colab.
- Notebooks 01–02: baixe o dataset correspondente — veja
data/README.md. O notebook 01 roda as seções sintéticas sem dados externos; só a seção de arenitos reais exige o download. - Notebook 03 (SAM2-UNet): as células instalam o SAM2 (clone do repositório do Meta + checkpoint) automaticamente.
- Ajuste a variável
DATA_ROOTpara apontar para a pasta do dataset no seu Drive.
Para rodar localmente: pip install -r requirements.txt (mais o SAM2, para o notebook 03).
PyTorch · xarray/netcdf4 (NetCDF lazy) · scikit-image/scipy (Otsu, watershed, métodos
clássicos) · numpy (memmap) · matplotlib · MLflow · SAM2 (Meta).
- DRP-317 — Neumann, R., Andreeta, M., Lucas-Oliveira, E. (2020). "11 Sandstones: raw, filtered and segmented data". Digital Porous Media Portal. DOI 10.17612/f4h1-w124. Licença ODC-BY 1.0.
- DRP-503 — Vidal, A. et al. (2024). Multi-resolution X-ray microcomputed tomography images of carbonate rocks from Brazilian pre-salt. Scientific Data 11:1361.
- Ronneberger, O. et al. (2015). U-Net: Convolutional Networks for Biomedical Image Segmentation.
- Xiong, X. et al. (2026). SAM2-UNet: Segment Anything 2 Makes Strong Encoder for Natural and Medical Image Segmentation. Visual Intelligence.
- Ravi, N. et al. (2024). SAM 2: Segment Anything in Images and Videos. Meta AI.
Código sob licença MIT. Os datasets têm licenças próprias (ver acima) e não estão incluídos neste repositório.


