Home

Awesome

synthoseis

alt text

Generating seismic data and associated labels to train deep learning networks.

Overview

Synthoseis is an open-source, Python-based tool used for generating pseudo-random seismic data, as described in Synthetic seismic data for training deep learning networks.

The goal of synthoseis is to generate realistic seismic data for training a deep learning network to identify features of interest in field-acquired seismic data. Such training data should be plentiful, cover a diverse range of subsurface scenarios and provide quality training labels.

Documentation

Read our documentation: https://sede-open.github.io/synthoseis/datagenerator.html

Installation

We provide an environment.yml to install the required packages for synthoseis.

Resources

Quick Start

Run a model with parameters provided in the example config file

conda activate synthoseis
python main.py --config config/example.json --num_runs 1 --run_id seismic_example

Overview of workflow

Load user-parameters from config file
Build initial horizon at base and deposit layers of random thickness on top until some minimum depth is reached
Choose facies for each layer
Convert stack of horizons into a geologic age model
Generate faults and apply to age model
Identify closures using flood-filling algorithm
Fill closures randomly with fluids
Calculate elastic rock properties
Calculate reflection coefficients for each required incident angle
Apply random noise
Convolve using Butterworth bandpass filter to generate bandlimited seismic reflectivity
Apply geophysical augmentation (such as lateral smoothing, trace integration, amplitude balancing, RMO)

User parameters

An example user-parameter json format file is provided in the config folder, and is used to set parameters for generating a batch of training data.

KeyDescription
projectName of project. Used to select the rock property model associated with the project
project_folderOutput directory for models
work_folderTemporary folder used for storing intermediate data. Deleted on model completion
cube_shapeNumber of samples in [X, Y, Z] for output data
incident_anglesCentral angle for the output seismic angle-stacks
digiVertical sampling rate
infill_factorInitial oversampling multiplier in the Z direction. Due to memory contraints, this is only used to construct the initial, unfaulted horizons
initial_layer_stdevStandard deviation of the depth of initial horizon at the base of the model, random value is chosen between the provided [low, high] range
thickness_minMinimum thickness of layers (in samples)
thickness_maxMaximum thickness of layers (in samples)
seabed_min_depthRandom thickness layers are "deposited" on top of previous layers. When a horizon's minimum depth is below this value, this becomes the top-most horizon, usually the seabed
signal_to_noise_ratio_dbSignal to noise ratio in decibels to control the noise level of the output seismic data. A random value is chosen from a (trimmed) triangular distribution from the provided [left, mode, right] values
bandwidth_lowBandpass low-cut value is chosen at random between the [low, high] values provided
bandwidth_highBandpass high-cut value is chosen at random between the [low, high] values provided
bandwidth_ordOrder of the slope used in the bandpass filter
dip_factor_maxA scaling factor applied to the dip of each layer
min_number_faultsMinimum number of faults in the model
max_number_faultsMaximum number of faults in the model
pad_samplesAdditional padding in Z-direction to avoid edge effects, given in samples
max_column_heightMaximum vertical height of column in a 3D closure
closure_typesUsed to enable specific closure types, from "simple" (4-way), "faulted" (3-way), or "onlap" (stratigraphic)
min_closure_voxels_simpleOil or gas filled simple closures with fewer voxels than this threshold will be filled with brine
min_closure_voxels_faultedAs min_closure_voxels_simple but for faulted closures
min_closure_voxels_onlapAs min_closure_voxels_simple but for stratigraphic closures
sand_layer_thicknessAverage thickness of stacked sand layers a priori, given in number of layers
sand_layer_fractionAverage percentage of sand layers in model a priori
extra_qc_plotsSwitch to turn on/off additional QC output png plots
verboseSwitch to turn on/off verbosity
partial_voxelsIf true, calculate an average property inside voxels that span multiple layers
variable_shale_ngIf true, enable net to gross to vary laterally in shale layers, otherwise use a net to gross of 0
basin_floor_fansSwitch to turn on/off basin floor fan-shaped features in layers
include_channelsSwitch to turn on/off channels (deprecated, always false)
include_saltSwitch to turn on/off salt bodies
write_to_hdfWrite QC and additional volumes to HDF file
broadband_qc_volumeOutput a bandpassed seismic data with a low-cut of 2Hz and high-cut of 90Hz to simulate broadband seismic
model_qc_volumesSave QC volumes to disk
multiprocess_bpUse multiprocessing to speed up the bandpass operations

Rock properties

An example rock property model is provided in rpm_example.py, and consists of trends as functions of depth for Vp, Vs and Rho for shales and fluid-filled sands.

To add a new rock property model, use the rpm_example.py as a template to create a similar python script containing the new depth trends for each fluid/facies combination, for example rockphysics/new_rpm.py. Create a new config.json file and replace the project value to "new_rpm".

Examples Gallery

<!-- <details><summary>Geologic Age</summary> -->

Geologic Age

<table> <tr> <td> <img src="img/geologic_age_01.png" width=300> </td> <td> <img src="img/geologic_age_02.png" width=300> </td> <td> <img src="img/geologic_age_03.png" width=300> </td> </tr> </table> <!-- </details> --> <!-- <details><summary>Basin Floor Fans</summary> -->

Basin Floor Fans

<table> <tr> <td> <img src="img/fan_01.png" width=300> </td> <td> <img src="img/fan_02.png" width=300> </td> <td> <img src="img/fan_03.png" width=300> </td> </tr> </table> <!-- </details> --> <!-- <details><summary>Salt bodies</summary> -->

Salt Bodies

Cross-section through example salt bodies, coloured by lithology, where shale=0, sand=1, salt=2

<table> <tr> <td> <img src="img/salt_01.png" width=300> </td> <td> <img src="img/salt_02.png" width=300> </td> <td> <img src="img/salt_03.png" width=300> </td> </table> <!-- <details><summary>Faulting Styles</summary> -->

Faulting Styles

Faulting style is chosen from self branching, stair case, horst graben or relay ramp, as shown from left to right. Alternatively, faults can be entirely random (not shown).

<table><tr> <td> <img src="img/fault_self_branching_01.png" width=300> </td> <td> <img src="img/fault_stair_case_01.png" width=300> </td> <td> <img src="img/fault_horst_graben_01.png" width=300> </td> <td> <img src="img/fault_relay_ramp_01.png" width=300> </td> </tr> </table> <!-- </details> --> <!-- <details><summary>Closures</summary> -->

Closures

Example closures, coloured by closure number

<table> <tr> <td> <img src="img/closures_01.png" width=300> </td> <td> <img src="img/closures_02.png" width=300> </td> <td> <img src="img/closures_03.png" width=300> </td> </tr> </table> <!-- </details> -->

Seismic Data

Cross-sections through the centre of some example models, showing the layered earth model coloured by facies on left, and fullstack RAI seismic data on the right. Sand content for models is chosen using a Markov process, values a priori (input) and a posteriori (output) are shown in the facies plot.

<table> <tr> <td> <img src="img/seismic_01.png" width=300> </td> <td> <img src="img/seismic_02.png" width=300> </td> <td> <img src="img/seismic_03.png" width=300> </td> </tr> </table>

Contributing

We welcome all kinds of contributions. The preferred way of submitting a contribution is to either make an issue on GitHub or by forking the project on GitHub and making a pull request.

Citation

@article{doi:10.1190/INT-2021-0193.1,
author = {Tom P. Merrifield and Donald P. Griffith and S. Ahmad Zamanian and Stephane Gesbert and Satyakee Sen and Jorge De La Torre Guzman and R. David Potter and Henning Kuehl},
title = {Synthetic seismic data for training deep learning networks},
journal = {Interpretation},
volume = {10},
number = {3},
pages = {SE31-SE39},
year = {2022},
doi = {10.1190/INT-2021-0193.1},