File size: 5,215 Bytes
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
126
127
128
129
130
131
132
133
134
135
---
tags:
- seismic
- ground-roll
- denoising
- unet
- resunet
- dncnn
- attention-unet
- pytorch
library_name: pytorch
---

# Ground-Roll Attenuation Benchmark

Deep-learning-based coherent noise (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.71     | 15.81     | 0.9480 | 0.030624 | 0.026232 | 0.161964 |
| 3.0   | -6.83    | 6.27      | 0.9418 | 0.091871 | 0.236091 | 0.485892 |
| 5.0   | -11.27   | 1.83      | 0.9402 | 0.153118 | 0.655809 | 0.809820 |
| 7.0   | -14.19   | -1.09     | 0.9395 | 0.214366 | 1.285386 | 1.133749 |
| 9.0   | -16.37   | -3.27     | 0.9390 | 0.275613 | 2.124822 | 1.457677 |

*Metrics computed on the full dataset in the original amplitude domain before normalization.*

## Model Architectures

- **ResUNet** (`res_unet`) β€” U-Net with residual blocks replacing plain double-conv layers (He et al., 2016; Zhang et al., 2018). Base channels: 32, depth: 4.
- **UNet** (`unet`) β€” Classic encoder-decoder with skip connections (Ronneberger et al., 2015). Base channels: 32, depth: 4.

### 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 (predicted noise vs. label noise) |
| Optimizer | AdamW (lr=1e-3, weight_decay=1e-4) |
| Scheduler | Cosine annealing (min_lr=1e-6) |
| Epochs | 200 |
| Gradient clipping | 1.0 (max norm) |
| Batch size | 196 |
| Distributed training | 2 Γ— NVIDIA RTX 4090, DDP |
| 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 (SNR dB)

| Model | Params (M) | Level 1.0 | Level 3.0 | Level 5.0 | Level 7.0 | Level 9.0 |
|-------|:----------:|:---------:|:---------:|:---------:|:---------:|:---------:|
| Raw (noisy) | β€” | 2.71 | βˆ’6.83 | βˆ’11.27 | βˆ’14.19 | βˆ’16.37 |
| UNet | 7.76 | 28.39Β±1.09 | 23.07Β±0.10 | 20.22Β±0.32 | 17.90Β±0.28 | 16.60Β±0.46 |
| ResUNet | 8.11 | 31.62Β±0.56 | 22.65Β±0.93 | 18.11Β±2.12 | 16.60Β±1.44 | 14.61Β±0.01 |
| DnCNN | 0.56 | 31.67Β±0.11 | 30.02Β±0.43 | 22.91Β±3.74 | β€” | β€” |
| Attention UNet | 7.85 | 28.79Β±0.46 | 23.10Β±1.00 | 19.66Β±0.22 | 17.57Β±0.11 | 16.61Β±0.19 |

Mean Β± std over 3 seeds. All models achieve 15–31 dB SNR improvement. DnCNN delivers the best performance at low-to-mid noise levels with the smallest footprint (0.56 M parameters). See the benchmark documentation for per-level detailed metrics (PSNR, SSIM, MAE, MSE, RMSE).

## 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