Author: He XingChen
Last Updated: 2026-03-21

Welcome to SeisPolarity

_images/seispolarity_logo_title.svg

SeisPolarity is a comprehensive seismic first-motion polarity picking framework.

SeisPolarity provides a unified API for applying deep learning models to seismic waveforms for polarity classification, supporting multiple datasets and models.

Features

  • Unified Data Interface: Support for SCSN, Txed, DiTing, Instance, PNW datasets with automatic downloading

  • Multiple Models: Ross, Eqpolarity, APP, DiTingMotion, CFM, RPNet, PolarCAP with pretrained weights

  • Flexible Data Loading: RAM/disk streaming support for datasets of any scale

  • Advanced Inference: Predictor class with automatic pretrained model downloading from Hugging Face/ModelScope

  • Data Augmentation: Balanced sampling with various augmentation techniques

  • Unified Training: Checkpoint saving and early stopping mechanisms

  • Cross-platform Support: Linux, macOS, and Windows

Quick Start

Installation

pip install seispolarity
git clone https://github.com/Chuan1937/SeisPolarity.git
cd SeisPolarity
pip install -e .

Inference

1from seispolarity.inference import Predictor
2import numpy as np
3
4predictor = Predictor("ROSS_SCSN")  
5waveforms = np.random.randn(10, 400)  # (Batch, Length)
6predictions = predictor.predict(waveforms)

Data Loading

1from seispolarity.data import WaveformDataset
2
3# Use disk streaming for large datasets
4dataset = WaveformDataset(path="data.hdf5", name="SCSN", preload=False)
5loader = dataset.get_dataloader(batch_size=1024, num_workers=4)
6
7# Use RAM preloading for small datasets
8dataset_ram = WaveformDataset(path="data.hdf5", name="SCSN", preload=True)

Automatic Dataset Download

 1from seispolarity.data import PNW
 2from pathlib import Path
 3
 4output_dir = Path('datasets/PNW')
 5processor = PNW(
 6    csv_path=str(output_dir / 'PNW.csv'),
 7    hdf5_path=str(output_dir / 'PNW.hdf5'),
 8    output_polarity=str(output_dir),
 9    auto_download=True,  # Automatically download missing data
10    use_hf=False,         # Use ModelScope instead of Hugging Face
11    component='Z',        # Extract vertical component
12    sampling_rate=100     # Target sampling rate (Hz)
13)
14processor.process()

Training

 1from seispolarity.models.scsn import SCSN
 2from seispolarity.training import Trainer, TrainingConfig
 3
 4model = SCSN(num_fm_classes=3)
 5config = TrainingConfig(
 6    batch_size=256,
 7    epochs=50,
 8    learning_rate=1e-4,
 9    device='cuda'  # or 'cpu'
10)
11trainer = Trainer(model=model, dataset=dataset, config=config)
12trainer.train()

Data Augmentation

 1from seispolarity.generate import GenericGenerator
 2from seispolarity.generate.augmentation import (
 3    Demean, Normalize, RandomTimeShift, 
 4    BandpassFilter, PolarityInversion
 5)
 6
 7generator = GenericGenerator(dataset)
 8generator.add_augmentations([
 9    Demean(),
10    Normalize(amp_norm_type="peak"),
11    RandomTimeShift(max_shift=10),
12    BandpassFilter(freqmin=1, freqmax=20),
13    PolarityInversion(prob=0.5)
14])
15loader = generator.get_dataloader(batch_size=256)

Supported Datasets

Dataset

Description

Samples

Auto Download

SCSN

Southern California Seismic Network

100k+

Yes

Txed

Texas Earthquake Dataset

50k+

Yes

DiTing

China Earthquake Networks Center

80k+

No (request required)

Instance

Instance-based Dataset

30k+

Yes

PNW

Pacific Northwest

20k+

Yes

Supported Models

Model

Input Length

Classes

Ross (SCSN)

400

3 (U/D/N)

Eqpolarity

600

2 (U/D)

DiTingMotion

128

3 (U/D/N)

CFM

160

2 (U/D)

RPNet

400

2 (U/D)

PolarCAP

64

2 (U/D)

APP

400

3 (U/D/N)

Documentation

Examples

See complete examples in the examples/ directory:

Citation

The paper will be published subsequently, please stay tuned.

Contact

For questions and support, please submit an issue on GitHub or contact: [chuanjun1978@gmail.com]