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