add functionality for apple data
Browse files- app.py +27 -7
- apple_test.py +41 -0
- import_apple_data.ipynb +0 -0
- models/__pycache__/inception.cpython-38.pyc +0 -0
- sample_data/ecg_2021-10-16.csv +0 -0
- sample_data/ecg_2021-10-17_1.csv +0 -0
app.py
CHANGED
@@ -5,14 +5,24 @@ import numpy as np
|
|
5 |
import gradio as gr
|
6 |
from models.inception import *
|
7 |
from scipy.signal import resample
|
|
|
8 |
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
def load_data(sample_data):
|
11 |
ecg, meta_data = wfdb.rdsamp(sample_data)
|
12 |
lead_I = ecg[:,0]
|
13 |
sample_frequency = meta_data["fs"]
|
14 |
return lead_I, sample_frequency
|
15 |
|
|
|
|
|
16 |
def preprocess_ecg(ecg,fs):
|
17 |
if fs != 100:
|
18 |
ecg = resample(ecg, int(len(ecg)*(100/fs)))
|
@@ -43,13 +53,23 @@ def run(header_file, data_file):
|
|
43 |
SAMPLE_FREQUENCY = 100
|
44 |
TIME = 10
|
45 |
NUM_LEADS = 1
|
|
|
46 |
demo_dir = f"{CWD}/sample_data"
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
age_model = load_age_model(sample_frequency=SAMPLE_FREQUENCY,recording_time=TIME,num_leads=NUM_LEADS)
|
54 |
gender_model = load_gender_model(sample_frequency=SAMPLE_FREQUENCY,recording_time=TIME,num_leads=NUM_LEADS)
|
55 |
age_estimate = age_model.predict(np.expand_dims(ecg,0)).ravel()[0]
|
@@ -66,7 +86,7 @@ with gr.Blocks() as demo:
|
|
66 |
with gr.Row():
|
67 |
with gr.Column(scale=1):
|
68 |
header_file = gr.File(label = "header_file", file_types=[".hea"],)
|
69 |
-
data_file = gr.File(label = "data_file", file_types=[".dat"])
|
70 |
with gr.Column(scale=1):
|
71 |
output_age = gr.Textbox(label = "Estimated age")
|
72 |
output_gender = gr.Label( label = "Predicted gender")
|
|
|
5 |
import gradio as gr
|
6 |
from models.inception import *
|
7 |
from scipy.signal import resample
|
8 |
+
import pandas as pd
|
9 |
|
10 |
|
11 |
+
|
12 |
+
def load_apple_data():
|
13 |
+
return None
|
14 |
+
|
15 |
+
|
16 |
+
|
17 |
+
# load wfdb data
|
18 |
def load_data(sample_data):
|
19 |
ecg, meta_data = wfdb.rdsamp(sample_data)
|
20 |
lead_I = ecg[:,0]
|
21 |
sample_frequency = meta_data["fs"]
|
22 |
return lead_I, sample_frequency
|
23 |
|
24 |
+
|
25 |
+
|
26 |
def preprocess_ecg(ecg,fs):
|
27 |
if fs != 100:
|
28 |
ecg = resample(ecg, int(len(ecg)*(100/fs)))
|
|
|
53 |
SAMPLE_FREQUENCY = 100
|
54 |
TIME = 10
|
55 |
NUM_LEADS = 1
|
56 |
+
NEW_SAMPLE_FREQUENCY = 100
|
57 |
demo_dir = f"{CWD}/sample_data"
|
58 |
+
|
59 |
+
if data_file.name.endswith(".csv"):
|
60 |
+
_, data_basename = os.path.split(data_file.name)
|
61 |
+
shutil.copyfile(data_file.name, f"{demo_dir}/{data_basename}")
|
62 |
+
df= pd.read_csv(f"{demo_dir}/{data_basename}", skiprows=12, sep=";", header=None, decimal=',')
|
63 |
+
ecg = np.asarray(df[0].str.replace(',', '.').str.replace('−', '-').astype(float))
|
64 |
+
ecg = resample(ecg[(TIME*SAMPLE_FREQUENCY):(TIME*SAMPLE_FREQUENCY*2)],TIME * NEW_SAMPLE_FREQUENCY)
|
65 |
+
ecg = ecg/1000
|
66 |
+
else:
|
67 |
+
_, hdr_basename = os.path.split(header_file.name)
|
68 |
+
_, data_basename = os.path.split(data_file.name)
|
69 |
+
shutil.copyfile(data_file.name, f"{demo_dir}/{data_basename}")
|
70 |
+
shutil.copyfile(header_file.name, f"{demo_dir}/{hdr_basename}")
|
71 |
+
data, fs = load_data(f"{demo_dir}/{hdr_basename.split('.')[0]}")
|
72 |
+
ecg = preprocess_ecg(data,fs)
|
73 |
age_model = load_age_model(sample_frequency=SAMPLE_FREQUENCY,recording_time=TIME,num_leads=NUM_LEADS)
|
74 |
gender_model = load_gender_model(sample_frequency=SAMPLE_FREQUENCY,recording_time=TIME,num_leads=NUM_LEADS)
|
75 |
age_estimate = age_model.predict(np.expand_dims(ecg,0)).ravel()[0]
|
|
|
86 |
with gr.Row():
|
87 |
with gr.Column(scale=1):
|
88 |
header_file = gr.File(label = "header_file", file_types=[".hea"],)
|
89 |
+
data_file = gr.File(label = "data_file", file_types=[".dat",".csv"])
|
90 |
with gr.Column(scale=1):
|
91 |
output_age = gr.Textbox(label = "Estimated age")
|
92 |
output_gender = gr.Label( label = "Predicted gender")
|
apple_test.py
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
import pandas as pd
|
3 |
+
import matplotlib.pyplot as plt
|
4 |
+
from scipy import signal
|
5 |
+
import os
|
6 |
+
import wfdb
|
7 |
+
import shutil
|
8 |
+
import gradio as gr
|
9 |
+
from models.inception import *
|
10 |
+
|
11 |
+
SAMPLE_FREQUENCY = 512
|
12 |
+
TIME = 10
|
13 |
+
NEW_SAMPLE_FREQUENCY = 100
|
14 |
+
|
15 |
+
def load_age_model(sample_frequency,recording_time, num_leads):
|
16 |
+
cwd = os.getcwd()
|
17 |
+
weights = f"{cwd}/models/weights/model_weights_leadI_age.h5"
|
18 |
+
model = build_age_model((sample_frequency * recording_time, num_leads), 1)
|
19 |
+
model.load_weights(weights)
|
20 |
+
return model
|
21 |
+
|
22 |
+
def load_gender_model(sample_frequency,recording_time, num_leads):
|
23 |
+
cwd = os.getcwd()
|
24 |
+
weights = f"{cwd}/models/weights/model_weights_leadI_gender.h5"
|
25 |
+
model = build_gender_model((sample_frequency * recording_time, num_leads), 1)
|
26 |
+
model.load_weights(weights)
|
27 |
+
return model
|
28 |
+
|
29 |
+
age_model = load_age_model(100,10,1)
|
30 |
+
gender_model = load_gender_model(100,10,1)
|
31 |
+
ecg_path = "../../apple_health_export/electrocardiograms/"
|
32 |
+
for i in os.listdir(ecg_path):
|
33 |
+
df= pd.read_csv(os.path.join(ecg_path,i), skiprows=12, sep=";", header=None, decimal=',')
|
34 |
+
ecg = np.asarray(df[0].str.replace(',', '.').str.replace('−', '-').astype(float))
|
35 |
+
new_ecg = signal.resample(ecg[(TIME*SAMPLE_FREQUENCY):(TIME*SAMPLE_FREQUENCY*2)],TIME * NEW_SAMPLE_FREQUENCY)
|
36 |
+
# from uV to mV
|
37 |
+
new_ecg = new_ecg/1000
|
38 |
+
age_estimate = age_model.predict(np.expand_dims(new_ecg,0)).ravel()[0]
|
39 |
+
gender_prediction = gender_model.predict(np.expand_dims(new_ecg,0)).ravel()[0]
|
40 |
+
print("Estimated age: ", age_estimate)
|
41 |
+
print("Predicted gender: Male = {}, Female = {}".format((1- gender_prediction),(gender_prediction)))
|
import_apple_data.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/__pycache__/inception.cpython-38.pyc
CHANGED
Binary files a/models/__pycache__/inception.cpython-38.pyc and b/models/__pycache__/inception.cpython-38.pyc differ
|
|
sample_data/ecg_2021-10-16.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
sample_data/ecg_2021-10-17_1.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|