第12次汇报 (2022.04.17)
实现了第三部分(分析数字化的心电数据)! 并将二、三两部分(“纸质心电图数字化”和“分析数字化的心电数据”)连通成了一个python项目,并部署到了后端,可以对V1波形进行分析诊断。接下来就是写好微信小程序这个前端了。但还存在很多问题有待解决,在下文中用高亮标出。
(参考了 该"分析心电数据"项目,给源码加了注释, 详细学习了实现原理:)
刚进行完毕设中期答辩, 将一些感想记于文末保留;
上传V1心电波形图:
可以返回分析结果:
如何检验模型的准确程度?
第一组:
第二组:
第三组:
第四组:
"分析数字化后的心电数据"的实现原理
框架
- 前端采用了 html + css + js 的经典架构.
- js中为"Predict!"按钮写了点击时会触发的函数; 函数中采用了jQuery所提供的ajax方法, 用url调用了后端接口. 这和我之前做的Map2Text数据收集系统所采用的前后端数据交换方式是相同的.
- 后端为了部署python的深度学习模型, 采用了Flask框架. 后端其实就是一个app.py的文件, 里面主要实现了’/predict’这个url对应的接口.
核心功能
模型原理: (之后再分析)
train: (之后再分析)
predict:
-
预处理 (preprocess)
-
重采样(横): 将数据重采样成360 (MIT-BIH dataset 的心电数据采样率就是360);
-
标准化(纵):
sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True) # 作用:数据标准化; # X : 待处理的数组 # axis : 处理哪个维度,0表示处理横向的数据(行), 1表示处理纵向的数据(列 # with_mean: True是表示使均值为0 # with_std: True表示使标准差为1 # !!! 这样在"纸质心电图数字化"那一步就不用进行"信号归零"了!!!
-
找峰值:
scipy.signal.find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, rel_height=0.5, plateau_size=None) # 参数: # x: 带有峰值的信号序列 # height: 低于指定height的信号都不考虑 # threshold: 其与相邻样本的垂直距离 # distance: 相邻峰之间的最小水平距离, 先移除较小的峰,直到所有剩余峰的条件都满足为止。 # prominence: 个人理解是突起程度,详见peak_prominences # width: 波峰的宽度,详见peak_widths # plateau_size: 保证峰对应的平顶数目大于给定值 # 返回值: # peaks: x对应的峰值的索引 # properties: # height--> ‘peak_heights’ # threshold-->‘left_thresholds’, ‘right_thresholds’ # prominence-->‘prominences’, ‘right_bases’, ‘left_bases’ # width-->‘width_heights’, ‘left_ips’, ‘right_ips’ # plateau_size-->‘plateau_sizes’, left_edges’, ‘right_edges’
-
-
真正开始预测
- 读取训练好的深度学习模型;
- 将每个波峰附近的256个数据作为模型的输入数据, 来进行预测;
- 返回从每个波峰附近预测出的疾病, 和该疾病的可能性;
文件格式说明
The first value of the column become sample rate(抽样率) of the web app. If you use your own heart beat csv file, insert the sample at the first, too.
抽样率指的是: 在单位时间内的信号样值数目
问题
utils.py
def uploadedData(filename, csvbool = True):
if csvbool:
csvlist = list()
with open(filename, 'r') as csvfile:
for e in csvfile:
# 这个条件判断语句在做什么?
if len(e.split()) == 1 : # 感觉这是在判断e中有没有空格? 没有空格的话就是==1的;
csvlist.append(float(e))
else: # e中有空格就直接append? 不转化成float?
csvlist.append(e)
return csvlist
app.py
- model_predict()函数:
- sr = data[0] # csv文件的第一行是抽样率(sample rate) <-- 这里可以做修改:一方面是通过将"纸质心电图数字化"得到的网格大小来规定sr,另一方面是进一步了解MIT的数据格式,比如电压单位是多少等; 不一定要将抽样率放在csv文件中; # 而且这里的sr赋给了config中的sr吗? 不是吧? config中的叫sample_rate啊, 但如果没赋值到config中, 这句话岂不是就毫无意义? 果然, 输出了一下predict时用的sr, 不是csv文件的第一行数据, 而是默认的300;
- div = size // 1000 # div在之后的语句中也没有用到, 它有什么用?
待完成的工作
- 怎么对最终模型的预测结果进行检测???
- 将python项目部署在后端,使微信小程序可以调用。
- 拍照的图片质量差, 要进行一些校正
- 进一步完善微信小程序。
- 创建后台数据库,将每个用户提交记录和诊断记录保存起来。
- 提高用户使用小程序的体验。如用户点击诊断结果中的疾病,就可以查看该疾病的简介和康复建议。