|
import json |
|
import os |
|
from pathlib import Path |
|
|
|
import gradio as gr |
|
import numpy as np |
|
import obspy |
|
import pandas as pd |
|
import tensorflow as tf |
|
|
|
from phasenet.model import ModelConfig, UNet |
|
from phasenet.postprocess import extract_picks |
|
|
|
tf.compat.v1.disable_eager_execution() |
|
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) |
|
|
|
|
|
tf.compat.v1.reset_default_graph() |
|
model = UNet(mode="pred") |
|
sess_config = tf.compat.v1.ConfigProto() |
|
sess_config.gpu_options.allow_growth = True |
|
sess = tf.compat.v1.Session(config=sess_config) |
|
saver = tf.compat.v1.train.Saver(tf.compat.v1.global_variables()) |
|
init = tf.compat.v1.global_variables_initializer() |
|
sess.run(init) |
|
latest_check_point = tf.train.latest_checkpoint("./model/190703-214543") |
|
print(f"restoring model {latest_check_point}") |
|
saver.restore(sess, latest_check_point) |
|
|
|
|
|
def normalize(vec): |
|
mu = np.mean(vec, axis=1, keepdims=True) |
|
std = np.std(vec, axis=1, keepdims=True) |
|
std[std == 0] = 1.0 |
|
vec = (vec - mu) / std |
|
return vec |
|
|
|
|
|
def reshape_input(vec): |
|
if len(vec.shape) == 2: |
|
vec = vec[np.newaxis, :, np.newaxis, :] |
|
elif len(vec.shape) == 3: |
|
vec = vec[np.newaxis, :, :, :] |
|
else: |
|
pass |
|
return vec |
|
|
|
|
|
|
|
def predict(mseeds=[], waveforms="", stations=""): |
|
if len(stations) > 0: |
|
stations = json.loads(stations) |
|
print(f"{len(stations)}: {stations = }") |
|
if len(waveforms) > 0: |
|
waveforms = json.loads(waveforms) |
|
waveforms = np.array(waveforms) |
|
print(f"{waveforms.shape = }") |
|
picks = [] |
|
if mseeds is None: |
|
mseeds = [] |
|
for mseed in mseeds: |
|
file = mseed.name |
|
mseed = obspy.read(file) |
|
begin_time = min([tr.stats.starttime for tr in mseed]) |
|
end_time = max([tr.stats.endtime for tr in mseed]) |
|
mseed = mseed.trim(begin_time, end_time) |
|
vec = np.asarray([tr.data for tr in mseed]).T |
|
vec = reshape_input(vec) |
|
vec = normalize(vec) |
|
|
|
feed = {model.X: vec, model.drop_rate: 0, model.is_training: False} |
|
preds = sess.run(model.preds, feed_dict=feed) |
|
tmp_picks = extract_picks( |
|
preds, begin_times=[begin_time.datetime.isoformat(timespec="milliseconds")] |
|
) |
|
tmp_picks = [ |
|
{ |
|
"phase_time": x["phase_time"], |
|
"phase_index": x["phase_index"], |
|
"phase_score": x["phase_score"], |
|
"phase_type": x["phase_type"], |
|
} |
|
for x in tmp_picks |
|
] |
|
|
|
picks.extend(tmp_picks) |
|
|
|
if len(picks) > 0: |
|
picks_df = pd.DataFrame(picks) |
|
picks_df.to_csv("picks.csv", index=False) |
|
else: |
|
picks_df = None |
|
os.system("touch picks.csv") |
|
|
|
return picks_df, "picks.csv", json.dumps(picks) |
|
|
|
|
|
inputs = [ |
|
gr.File(label="mseeds", file_count="multiple"), |
|
gr.Textbox(label="waveform", visible=False), |
|
gr.Textbox(label="stations", visible=False), |
|
] |
|
|
|
outputs = [ |
|
gr.Dataframe(label="picks", headers=["phase_time", "phase_score", "phase_type"]), |
|
gr.File(label="csv"), |
|
gr.Textbox(label="json", visible=False), |
|
] |
|
gr.Interface( |
|
predict, |
|
inputs=inputs, |
|
outputs=outputs, |
|
title="PhaseNet", |
|
description="PhaseNet", |
|
examples=[[[os.path.join(os.path.dirname(__file__), "tests/test.mseed")]]], |
|
allow_flagging="never", |
|
).queue().launch() |
|
|
|
|
|
|
|
|
|
|