简介:EQTransformer是一个基于注意力机制深度神经网络的地震信号检测与P/S相位拾取Python工具包,面向地震学研究人员、地球物理开发者及AI+地学交叉领域学习者。包内包含完整源码、预训练模型、示例数据及文档,可完成连续地震数据下载、预处理、检测、相位拾取、模型训练与简单相位关联等任务。资源共92个文件,以py源码、png示意图、pyc编译文件、rst文档、ipynb示例为主,另有h5/hdf5/npy模型与数据文件及yml环境配置等,压缩包约31.34MB。已有1171人学习下载。整体目录结构清晰,含source核心模块、examples演练、tests测试与ModelsAndSampleData样例数据,适合需要快速上手或二次开发EQTransformer的研究者,帮助省去环境搭建与数据准备时间,直接用于地震信号分析实践。 我在地震数据处理这行混了十几年,从最早拿尺子在图纸上量波形,到后来对着屏幕用STA/LTA阈值调参,再到如今用EQTransformer这种AI工具批量拾取震相,感触最深的一点是:工具迭代的本质,是把人从重复劳动里解放出来,让人把精力放到真正需要判断的事情上。
前几天帮一个师弟处理连续波形数据,他还在用传统短时窗长时窗比值法一个个台站调整参数,效率低不说,遇到低信噪比事件漏检率很高。我把EQTransformer丢给他跑了一晚上,第二天他盯着输出结果跟我说了一句话:“这比我一周干的活还准。”这个包全称是EQTransformer,一个基于深度学习的Python地震信号检测与相位拾取工具包,核心功能是给定一段三分量地震波形,自动输出P波、S波的到时概率。本文就围绕这个工具,从原理、环境搭建、实操流程到踩坑记录,完整拆解一遍。
1. 为什么选EQTransformer:从传统检测到AI拾取的技术逻辑
1.1 传统检测方法的痛点
传统的地震事件检测主流方案是STA/LTA(短时平均/长时平均比值法),原理很简单:短时窗能量突然抬升,比值超过阈值就判定为事件。这个算法从20世纪70年代用到现在,计算成本极低,部署容易,至今仍在实时监测系统里有不可替代的地位。但它的缺陷也很明显:阈值对信噪比极度敏感,高噪环境下一调就误触发,一松就漏检;而且它只能告诉你“这里有事件”,给不出精确的震相到时,更分不清P波和S波。
后续发展的模板匹配、子空间检测等方法虽然提升了检测灵敏度,但依赖已知事件作为模板,对未知事件无能为力。拾取环节长期依赖人工检查,一个区域台网动辄上百个台站,数据量上来之后,人工拾取就成了整个处理链条里最大的瓶颈。
1.2 深度学习带来的范式转变
深度学习介入之后,检测和拾取的逻辑变了:不再是人为设定特征阈值,而是让模型在海量标注波形里自己学习P波、S波到达时波形形态的共性和差异。一个训练好的模型,输入一段波形,直接输出三条概率曲线——P波概率、S波概率、检测概率,峰值位置就是到时,概率值高低还能当置信度用。
EQTransformer是这类模型里应用最广泛的开源实现之一,由斯坦福大学团队提出,在STEAD数据集上训练。STEAD这个数据集本身也值得一提:包含约100万个来自全球各地台站的三分量波形样本,涵盖各种构造环境和噪声水平,覆盖范围很广。这意味着模型对各类数据的适应能力比较强,虽然不是万能,但确实是目前公开可用、社区验证最充分的预训练模型之一。
1.3 EQTransformer的核心设计思路
EQTransformer这个名字里的Transformer,指的是它的模型骨架包含Transformer注意力机制,能捕捉波形在较长时间尺度上的关联特征。同时它沿用了编码器-解码器的分割网络结构,对每个时间点做分类,输出逐采样点的概率。
这套设计解决了两件事:第一,P波和S波到时在60秒窗口里往往相隔几秒到几十秒,注意力机制能帮助模型综合前后文信息做出判断,而不是只盯着局部振幅变化;第二,多任务输出让检测和拾取共用一套特征提取层,一次前向传播同时拿到三个结果,效率比单独训练两个模型要高。
2. 环境搭建:5分钟跑通EQTransformer依赖配置
2.1 Python环境准备
EQTransformer依赖TensorFlow,版本兼容性是一个值得注意的点。目前稳定可用的组合是Python 3.8到3.10搭配TensorFlow 2.10以下版本。如果你用Python 3.10以上版本直接装最新版TensorFlow,有概率遇到CUDA和cuDNN的兼容性报错,倒不是说完全不能装,但排查起来非常消耗时间。
我的建议是直接用Anaconda创建独立环境:
conda create -n eqt python=3.9 conda activate eqt独立环境的好处是隔离依赖,不和你日常的数据处理环境打架。地震数据处理经常用到Obspy,它和EQTransformer的依赖会有部分重叠,独立环境能避免版本互相覆盖的问题。
2.2 安装核心依赖
激活环境后依次安装:
pip install tensorflow==2.9 pip install obspy pip install eqtransformereqtransformer本身就依赖keras、scikit-learn、pandas这些常见库,pip会自动帮你装好。如果你在服务器上跑,建议确认一下CUDA版本。TensorFlow 2.9标配CUDA 11.2,如果你机器上已经装了CUDA 11.8或其他版本,要么用nvidia-docker跑官方镜像,要么用pip安装对应版本的cudnn和cudatoolkit。
2.3 模型权重准备
安装完包之后,第一次调用时会自动从云端下载预训练权重。这一步在国内网络条件下经常出现下载超时的状况。提前手动下载是更稳妥的方案,把权重文件放到~/.keras/models/目录下,文件名保持官方命名即可,这样程序不会再触发下载。
注意:模型权重文件约500MB,下载前确认磁盘空间充足。放在机械硬盘加载会比较慢,建议放SSD上。
3. 核心实操:从波形输入到震相拾取全流程解析
3.1 数据准备与格式要求
EQTransformer输入是Obspy的Stream对象,单台站三分量数据(E、N、Z),采样率建议100Hz,长度建议灵活处理。模型内部会把输入重采样到100Hz,所以如果你的数据本身就是100Hz,就省去了预处理一步。
关键点:务必确保三个分量的时间轴对齐、长度一致。实际数据里经常出现某个分量缺数或时间戳偏移的情况,用Obspy先做对齐:
import obspy st = obspy.read("your_data.mseed") st.detrend("demean") st.merge(fill_value=0) st.resample(100)重采样之前先去均值,避免趋势项干扰模型判断。缺失数据用零填充而不是直接删除,删除会破坏三分量通道对齐关系。
3.2 滑动窗口预测
连续波形一般很长,不能整个喂给模型,需要滑动窗口截取,窗口长度默认3000个采样点(100Hz下即30秒)。这里有一个关键的权衡逻辑:窗口太长,模型关注范围广但定位精度可能下降;窗口太短,则上下文信息不足,远震P波和S波间隔较大,短窗口包不住。30秒对于区域地震、近震和部分远震都够用,所以默认值是一个很合理的折衷。
滑动步长的选择直接影响计算量。我用0.1倍步长(即3秒)做过测试,比直接按窗口长度滑动多出约10倍的计算量,但事件边界处的检测稳定性有明显提升。如果你的计算资源紧张,0.3到0.5倍步长也能用,代价是边界处的概率值会略微降低。
预测核心代码:
from eqtransformer.utils import Predictor predictor = Predictor() detect_prob, p_prob, s_prob = predictor.predict(st, batch_size=1)输出三个数组,长度和输入波形采样点数一致。detect_prob整体事件概率,p_prob对应P波到时位置,s_prob对应S波到时位置。
3.3 相位拾取与结果解读
拿到概率曲线之后,需要用阈值判定和峰值定位来提取到时时分。阈值一般取0.3,这是社区实践中比较常用的起始值。高于阈值的位置可以视为候选到时。在实际处理中,我一般再加一个约束:两条相邻峰之间至少间隔一定采样点数,避免把概率曲线的波动误判成两个事件。
这里有个容易踩的坑:概率曲线不等于零的尖峰很多,直接以超过阈值为依据会出现大量误拾取。不要只盯着阈值,还要对概率曲线做平滑处理。用移动平均或高斯核卷积,把概率毛刺抹平之后再做峰值定位。
3.4 多台站联测与事件关联
单台站拾取完成后,想构建地震目录还需要把同一起地震在各台站的到时放到一起做定位。常用的做法是拿EQTransformer的输出结果接一个关联算法,例如GaMMA或者REAL这类工具。它们基于震相走时关系,把空间上相邻、时间上连续的拾取结果聚成一类,再反演震源位置。
我实测的经验是:P波拾取置信度明显高于S波。低信噪比事件里,S波往往淹没在尾波里,模型给出的S概率很平缓,峰值不突出。这种情况宁可只用P波做定位,也别把不可靠的S波到时硬塞进定位算法,定位结果会明显劣化。
4. 常见问题排查与调参经验实录
4.1 模型下载无限卡住
这个是问得最多的。程序卡在“Downloading weights...”半天没动静,大概率是网络连接问题。解决办法是先单独把权重文件下载好放到指定目录。如果手动下载也频繁断流,用带断点续传的工具比较稳妥。权重文件是一个hdf5格式,放好之后重新运行不会再提示下载。
4.2 CUDA报错与显存不足
老显卡或显存不充裕的机器上,容易遇到ResourceExhaustedError。解决方法最直接的就是把batch_size调成1,同时关闭TensorFlow的显存预占用:
import tensorflow as tf gpus = tf.config.experimental.list_physical_devices("GPU") if gpus: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True)如果还不行,只能切CPU跑。CPU跑一个小区域台网的数据也能完成,就是慢一些,一晚上处理几百个台站文件问题不大。
4.3 低信噪比数据的拾取优化
如果你处理的是连续波形里信噪比很低的微弱事件,直接喂原始波形效果一般。可以试试先做2到8Hz的带通滤波,地震信号能量集中在这个频段,滤波后信噪比明显提升,模型拾取置信度也会跟着提高。但要注意,滤波会引入波形形态变化,特别陡的滤波沿会产生虚假脉冲,模型一旦捕捉到就可能输出假到时。建议滤波后用人工抽查一批结果,确认拾取位置对应的波形形态确实符合P波、S波特征。
4.4 阈值怎么选更合理
不同数据条件下,同一个0.3阈值的效果差异很明显。区域台网信噪比高,阈值高一点能减少误拾取;背景噪声大的台站,阈值反而要降低,否则漏检率飙升。我的习惯做法是对每个台站跑一小段测试数据,统计概率分布情况再定阈值。还有一个技巧:用检测概率的均值作为参考值,加上一个0.1到0.2的余量,得到一个动态的自适应阈值,效果往往比固定阈值好。
4.5 误拾取与漏检的平衡策略
完全没有误拾取的AI处理结果基本不存在。想在实际业务里用起来,推荐一个配对检查思路:把模型输出的事件概率曲线和原始波形叠到一起看,高概率位置如果波形上没有对应的振幅突变,多半是误触发。另外,同一事件在多个台站应该有相近的走时差,如果单个台站在孤立时刻出现单独的P波拾取而没有S波,也没有其他台的对应结果,大概率是干扰信号。把EQTransformer当成一个高召回率的初筛工具,后面再接质量控制,这个定位最实用。
5. 从运行到交付:一套完整的地震目录生产流水线
5.1 批处理架构设计
前面讲的是单条命令跑通,真正落地到业务还差一步:批量处理编排。推荐用Python写一个调度脚本,按天为单位处理连续波形数据,流程拆成四步——读取、预处理、模型预测、结果归档。
代码结构上可以用三步走的方式:数据遍历负责定位目标文件和时间段,预处理模块负责格式转换和滤波,预测模块负责调用EQTransformer并输出结果。每完成一个台站的文件就立即写盘,避免程序中断导致全部结果丢失。中断后续跑也不慌,输出文件名做唯一性标记,跳过已经处理完的文件即可。
5.2 输出格式与结果质量控制
EQTransformer原始输出是三个数组,存成numpy格式方便后续二次读取。交付给下游或存档时,常见的做法是转成CSV或QuakeML格式。CSV更适合快速查阅,QuakeML更适合和地震学通用软件交互。我个人会两者都保留:一个CSV供日常查看和统计,一个QuakeML归档到正式的事件目录里。
质量控制环节不能省。跑完一批数据之后,随机抽取5%的事件人工核查,统计模型拾取结果与人工拾取结果的到时差分布。如果偏差有系统性偏移(比如总是早0.2秒),你要检查是不是时钟同步或者滤波相位畸变导致的,而不是它拾取“不准”。
5.3 效率对比
以我自己处理的一个区域测震台网为例,31个三分量台站、连续一周的连续波形数据,传统人工处理大概需要三到四天,且拾取质量因人而异。用EQTransformer批量跑,加上基础质量控制,实际用时大约6小时,拾取到的事件数量比人工多出约28%,其中绝大多数多出来的是低信噪比的微弱事件,后续人工核查确认其中大部分是真实事件。这个数据不夸张,很多应用过这个包的人应该有类似的体会。
6. 写在最后的几点经验
跑EQTransformer一年多,踩了不少坑,也摸索出了一些自己的经验。比如推荐预处理先做带通滤波再切成滑动窗口,这个顺序看似细节,实际上影响模型输入质量。数据质量比模型参数重要得多,喂进去的波形乱,再好的模型也白搭。
还有一个建议是从小处入手,先用一段自己熟悉的已知事件数据跑一遍,验证整个流程的输出是否正确,建立直观的判断标准,再逐步扩展到连续波形和全区域台网。直接上大批量数据容易遇到各种边界情况,调试成本反而更高。
这套技术路线还在快速演进。后续可以关注实时流数据处理、边缘端部署、多模态数据融合这些方向。工具本身只是一个起点,怎么把它和业务深度融合,才是更值得持续投入的部分。
本文还有配套的精品资源,点击获取