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.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
- 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 (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
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
Mean ± std over 3 seeds on the held-out test shot (FFID=9), evaluated on 2D-flattened data in the normalized domain. Raw (noisy) is the input before denoising.
Noise Level 1.0
| Method | Params (M) | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|---|---|---|---|---|---|---|---|
| Raw (noisy) | — | 2.7129±0.0000 | 21.8322±0.0000 | 0.9527±0.0000 | 0.015312±0.000000 | 0.006558±0.000000 | 0.080982±0.000000 |
| UNet | 7.76 | 28.3886±1.0929 | 47.5080±1.0930 | 0.9972±0.0004 | 0.000673±0.000129 | 0.000018±0.000004 | 0.004235±0.000524 |
| ResUNet | 8.11 | 31.6226±0.5664 | 50.7420±0.5664 | 0.9980±0.0001 | 0.000659±0.000105 | 0.000008±0.000001 | 0.002907±0.000186 |
| DnCNN | 0.14 | 19.7355±0.3250 | 38.8548±0.3250 | 0.9846±0.0014 | 0.004684±0.000236 | 0.000130±0.000010 | 0.011415±0.000425 |
| Attention UNet | 7.85 | 29.4786±1.3513 | 48.5979±1.3514 | 0.9974±0.0007 | 0.000577±0.000109 | 0.000014±0.000004 | 0.003745±0.000557 |
Noise Level 3.0
| Method | Params (M) | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|---|---|---|---|---|---|---|---|
| Raw (noisy) | — | -6.8295±0.0000 | 18.3104±0.0000 | 0.9477±0.0000 | 0.022968±0.000000 | 0.014756±0.000000 | 0.121473±0.000000 |
| UNet | 7.76 | 23.0729±0.0993 | 48.2128±0.0994 | 0.9961±0.0001 | 0.000676±0.000022 | 0.000015±0.000000 | 0.003885±0.000044 |
| ResUNet | 8.11 | 22.6469±0.9303 | 47.7869±0.9303 | 0.9924±0.0015 | 0.001194±0.000660 | 0.000017±0.000003 | 0.004095±0.000424 |
| DnCNN | 0.14 | 17.2389±0.2322 | 42.3788±0.2322 | 0.9883±0.0008 | 0.002676±0.000161 | 0.000058±0.000003 | 0.007606±0.000205 |
| Attention UNet | 7.85 | 24.3939±1.2177 | 49.5338±1.2177 | 0.9964±0.0011 | 0.000630±0.000141 | 0.000011±0.000003 | 0.003358±0.000453 |
Noise Level 5.0
| Method | Params (M) | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|---|---|---|---|---|---|---|---|
| Raw (noisy) | — | -11.2665±0.0000 | 17.3952±0.0000 | 0.9466±0.0000 | 0.025520±0.000000 | 0.018217±0.000000 | 0.134970±0.000000 |
| UNet | 7.76 | 20.2195±0.3210 | 48.8813±0.3210 | 0.9958±0.0001 | 0.000656±0.000033 | 0.000013±0.000001 | 0.003599±0.000133 |
| ResUNet | 8.11 | 18.1078±2.1170 | 46.7695±2.1170 | 0.9898±0.0021 | 0.001265±0.000143 | 0.000023±0.000011 | 0.004679±0.001134 |
| DnCNN | 0.14 | 15.5662±0.2235 | 44.2280±0.2236 | 0.9898±0.0006 | 0.002042±0.000221 | 0.000038±0.000002 | 0.006147±0.000159 |
| Attention UNet | 7.85 | 21.9546±1.0678 | 50.6163±1.0678 | 0.9965±0.0011 | 0.000618±0.000068 | 0.000009±0.000002 | 0.002961±0.000359 |
Noise Level 7.0
| Method | Params (M) | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|---|---|---|---|---|---|---|---|
| Raw (noisy) | — | -14.1891±0.0000 | 16.9715±0.0000 | 0.9461±0.0000 | 0.026796±0.000000 | 0.020084±0.000000 | 0.141719±0.000000 |
| UNet | 7.76 | 17.8984±0.2809 | 49.0590±0.2809 | 0.9955±0.0003 | 0.000620±0.000054 | 0.000012±0.000001 | 0.003526±0.000114 |
| ResUNet | 8.11 | 16.6023±1.4399 | 47.7628±1.4399 | 0.9895±0.0039 | 0.001264±0.000417 | 0.000017±0.000005 | 0.004128±0.000649 |
| DnCNN | 0.14 | 15.1741±0.1268 | 46.3346±0.1268 | 0.9925±0.0003 | 0.001628±0.000134 | 0.000023±0.000001 | 0.004823±0.000071 |
| Attention UNet | 7.85 | 17.9454±2.7925 | 49.1059±2.7925 | 0.9947±0.0031 | 0.000686±0.000241 | 0.000014±0.000008 | 0.003623±0.001098 |
Noise Level 9.0
| Method | Params (M) | SNR (dB) | PSNR (dB) | SSIM | MAE | MSE | RMSE |
|---|---|---|---|---|---|---|---|
| Raw (noisy) | — | -16.3720±0.0000 | 16.7268±0.0000 | 0.9458±0.0000 | 0.027561±0.000000 | 0.021248±0.000000 | 0.145768±0.000000 |
| UNet | 7.76 | 16.5997±0.4636 | 49.6984±0.4636 | 0.9956±0.0005 | 0.000673±0.000096 | 0.000011±0.000001 | 0.003277±0.000177 |
| ResUNet | 8.11 | 13.8944±1.2448 | 46.9932±1.2448 | 0.9873±0.0053 | 0.001799±0.000734 | 0.000021±0.000006 | 0.004502±0.000670 |
| DnCNN | 0.14 | 14.8737±0.1844 | 47.9725±0.1845 | 0.9942±0.0003 | 0.001366±0.000120 | 0.000016±0.000001 | 0.003994±0.000085 |
| Attention UNet | 7.85 | 15.7861±2.7603 | 48.8849±2.7604 | 0.9940±0.0033 | 0.000822±0.000303 | 0.000015±0.000008 | 0.003715±0.001128 |
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