Skip to content

Caio-Fis/digital-rock-segmentation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Segmentação de Rocha Digital — Espaço Poroso em micro-CT

Notebook 01 Notebook 02 Notebook 03 Python PyTorch License: MIT

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.

U-Net supera o limiar clássico de Otsu em imagens com artefato 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 segmentado
Varredura em profundidade de um volume micro-CT 3D (sintético, para ilustração): grayscale à esquerda, espaço poroso segmentado à direita.


Destaques

  • 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).

Resultados

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.

U-Net vs. SAM2-UNet: mesmo IoU, ~440x mais parâmetros 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.

Galeria

Dados sintéticos (ground truth perfeito) Arenito real (Bandera Brown)
Carbonato do pré-sal — alta × baixa resolução

Trabalhando com imagens de alta 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 .raw sã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 .nc de 16 bits do pré-sal, lemos fatias 2D sob demanda sem carregar os GBs do volume. Um CachedVolume guarda 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 + blendingtiles 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.

Estrutura

.
├── 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

Como rodar

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).

  1. Abra o notebook desejado no Colab.
  2. 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.
  3. Notebook 03 (SAM2-UNet): as células instalam o SAM2 (clone do repositório do Meta + checkpoint) automaticamente.
  4. Ajuste a variável DATA_ROOT para apontar para a pasta do dataset no seu Drive.

Para rodar localmente: pip install -r requirements.txt (mais o SAM2, para o notebook 03).

Stack

PyTorch · xarray/netcdf4 (NetCDF lazy) · scikit-image/scipy (Otsu, watershed, métodos clássicos) · numpy (memmap) · matplotlib · MLflow · SAM2 (Meta).

Datasets & referências

  • 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.

Licença

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.

About

Segmentação de espaço poroso em micro-CT de rochas-reservatório (Digital Rock Physics): U-Net, datasets reais do pré-sal e arenitos, comparação com foundation model SAM2-UNet e validação de porosidade contra laboratório.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors