File size: 4,369 Bytes
4b212fb b64515d 4b212fb 0060854 4b212fb 6459c9c 4b212fb be9870d 4b212fb b64515d 4b212fb be9870d 4b212fb be9870d 4b212fb be9870d 4b212fb b64515d 4b212fb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | ---
tags:
- seismic
- ground-roll
- denoising
- unet
- resunet
- dncnn
- attention-unet
- pytorch
library_name: pytorch
---
# Ground-Roll Attenuation Benchmark
Deep-learning-based ground-roll suppression on pre-stack seismic shot gathers, using the SEG C3 synthetic dataset.
## Task
Given a noisy shot gather contaminated by dispersive ground-roll noise, the model predicts the additive noise component. The denoised signal is obtained by:
```
denoised = noisy_input - predicted_noise
```
This is a **paired regression** task trained with a noise-label objective (the ground-truth noise component). The supervision target is the residual between the noisy input and the clean reference.
## Dataset
- **Source**: SEG C3 pre-stack synthetic data, 9 regular shot gathers
- **Geometry**: 201 traces Γ 625 time samples per shot, dt = 2 ms
- **Noise modeling**: Reflection signals modeled with the acoustic wave equation; ground roll modeled with the elastic wave equation to capture its dispersive, low-velocity character
- **Split**: Shot-level (FFID) sequential 7:1:1 β 7 training shots, 1 validation, 1 held-out test
### Noise Intensity Levels
Five ground-roll intensity levels produce paired noisy / noise-label records:
| Level | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|-------|----------|-----------|------|-----|-----|------|
| 1.0 | 2.7129 | 21.8322 | 0.9527 | 0.015312 | 0.006558 | 0.080982 |
| 3.0 | -6.8295 | 18.3104 | 0.9477 | 0.022968 | 0.014756 | 0.121473 |
| 5.0 | -11.2665 | 17.3952 | 0.9466 | 0.025520 | 0.018217 | 0.134970 |
| 7.0 | -14.1891 | 16.9715 | 0.9461 | 0.026796 | 0.020084 | 0.141719 |
| 9.0 | -16.3720 | 16.7268 | 0.9458 | 0.027561 | 0.021248 | 0.145768 |
*Metrics computed on the test set (2D flattened shot gathers) in the normalized domain before denoising.*
## Model Architectures
- **DFB-CNN** (`dfb_cnn`) β Dual-Filter-Bank CNN with two DnCNN-style subnetworks (5Γ5 kernel for low-freq, 3Γ3 for high-freq) operating in the radial-trace (RT) domain. Low-freq CNN: 9 layers, 100 feat; High-freq CNN: 5 layers, 64 feat.
### Preprocessing
- **Normalization**: `max_abs`, global scope β the entire dataset scaled to [-1, 1]
- **Patching**: Overlapping 2D patches (128 Γ 256) with 50% overlap, channel-last format (1, H, W)
## Repository Structure
```
models/
βββ unet/
β βββ level1.0_seed42/
β β βββ best.pt # Best checkpoint (minimum validation loss)
β β βββ config.yaml # Full training configuration
β βββ level1.0_seed43/
β βββ level1.0_seed44/
β βββ level3.0_seed42/
β βββ ...
βββ res_unet/
βββ ...
```
Each subdirectory corresponds to one experiment: a model architecture trained at a specific noise level with a specific random seed.
## Training Details
| Hyperparameter | Value |
|----------------|-------|
| Loss | MSE (noise-prediction models) / GAN+L1 (pix2pix) / L1 (DDPM) / hybrid MSE+AFM (enhanced) |
| Optimizer | Adam / AdamW (lr=1e-4β1e-3, varies per model) |
| Scheduler | Cosine annealing (min_lr=1e-6) |
| Epochs | 100β200 (varies per model) |
| Gradient clipping | 1.0 (max norm) |
| Seeds | 42, 43, 44 per experiment |
## Usage
```python
import torch
from huggingface_hub import hf_hub_download
# Download a checkpoint
repo = "GeoBrain/coherent-noise-attenuation"
model_key = "res_unet"
level = "3.0"
seed = "42"
ckpt_path = hf_hub_download(
repo_id=repo,
filename=f"models/{model_key}/level{level}_seed{seed}/best.pt",
)
# Load state dict
state_dict = torch.load(ckpt_path, map_location="cpu", weights_only=True)
# For full model loading, instantiate the corresponding architecture
# and load the state dict (see config.yaml for exact architecture params).
```
See the companion benchmark documentation for detailed experimental setup and full evaluation results.
## Results
*Results pending β run batch_evaluate.py to populate.*
## References
- Ronneberger et al., U-Net: Convolutional Networks for Biomedical Image Segmentation, MICCAI 2015
- He et al., Deep Residual Learning for Image Recognition, CVPR 2016
- Zhang et al., Image Denoising via Deep CNN (DnCNN), IEEE TIP 2017
- Oktay et al., Attention U-Net: Learning Where to Look for the Pancreas, MIDL 2018
- SEG C3 Velocity Model: https://wiki.seg.org/wiki/C3
|