
简介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 python3.9 conda activate eqt独立环境的好处是隔离依赖不和你日常的数据处理环境打架。地震数据处理经常用到Obspy它和EQTransformer的依赖会有部分重叠独立环境能避免版本互相覆盖的问题。2.2 安装核心依赖激活环境后依次安装pip install tensorflow2.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_value0) 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_size1)输出三个数组长度和输入波形采样点数一致。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一年多踩了不少坑也摸索出了一些自己的经验。比如推荐预处理先做带通滤波再切成滑动窗口这个顺序看似细节实际上影响模型输入质量。数据质量比模型参数重要得多喂进去的波形乱再好的模型也白搭。还有一个建议是从小处入手先用一段自己熟悉的已知事件数据跑一遍验证整个流程的输出是否正确建立直观的判断标准再逐步扩展到连续波形和全区域台网。直接上大批量数据容易遇到各种边界情况调试成本反而更高。这套技术路线还在快速演进。后续可以关注实时流数据处理、边缘端部署、多模态数据融合这些方向。工具本身只是一个起点怎么把它和业务深度融合才是更值得持续投入的部分。本文还有配套的精品资源点击获取