File size: 1,904 Bytes
fc79af8
 
 
 
 
 
 
 
 
 
 
f11c484
fc79af8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a2c58e2
fc79af8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import gradio as gr
import numpy as np
import tensorflow as tf
from scipy.signal import find_peaks

model = tf.keras.models.load_model('aritmi_distilled.h5')

def extract_features(ekg_signal):
    if len(ekg_signal) < 10:
        return None

    r_peaks, _ = find_peaks(ekg_signal, height=0.5, distance=60)

    if len(r_peaks) < 2:
        return None

    features = []
    rr_intervals = np.diff(r_peaks)

    if len(rr_intervals) == 0:
        return None

    features.append(np.nanmean(rr_intervals))
    features.append(np.nanstd(rr_intervals))
    features.append(np.nanmean(ekg_signal))
    features.append(np.nanmean(r_peaks))
    features.append(np.nanmean(np.diff(r_peaks)))

    pq_interval = np.nanmean(rr_intervals)
    qt_interval = np.nanmean(rr_intervals)
    st_interval = np.nanmean(rr_intervals)

    features.extend([pq_interval, qt_interval, st_interval])
    return features

def predict(ekg_signal):
    try:
        ekg_signal_list = [float(value.strip()) for value in ekg_signal.split(',') if value.strip()]
        ekg_signal_array = np.array(ekg_signal_list, dtype=np.float32)
    except Exception as e:
        return f"Invalid dtype. Error: {str(e)}"

    if ekg_signal_array.size == 0:
        return "Empty ECG signal."

    features = extract_features(ekg_signal_array)
    if features is None:
        return "Couldn't extract feature."

    features = np.array(features).reshape(1, -1)
    prediction = model.predict(features)
    risk_probabilities = prediction[0]
    aritmi_riski_yuzde = risk_probabilities[1] * 100

    return f"%{aritmi_riski_yuzde:.2f}"



interface = gr.Interface(
    fn=predict,
    inputs=gr.Textbox(
        label="ECG Signal",
        placeholder="0.034, 0.181, 0.264, ...",
    ),
    outputs="text",
    description="Arrhythmia risk predicting model from ECG data",
    live=False
)



if __name__ == "__main__":
    interface.launch()