File size: 5,213 Bytes
4b212fb 0060854 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 4b212fb d55f138 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
- **Attention UNet** (`atten_unet`) β U-Net with additive attention gates on skip connections (Oktay et al., 2018, MIDL). Base channels: 32, depth: 4.
- **DnCNN** (`dncnn`) β Flat 17-layer Conv-BN-ReLU stack with residual learning (Zhang et al., 2017, IEEE TIP). Base channels: 64.
### 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
|