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()