第7次汇报 (2022.02.09)
直接从网上查找开源的静态心电图识别算法以失败告终; 但突然想到, 可以查阅相关文献进行学习; 一查才发现, 自己要实现的功能在两年前的外文期刊上就已实现; 所以现在转变学习方式, 开始对论文进行细致学习.
论文1: ECG Paper Record Digitization and Diagnosis Using Deep Learning (Mishra S,Khatwani G,Patil R, et al. )
We aim to make ECG diagnosis available to common people so that just by clicking the photo of a paper ECG record on their smartphone, the patient should able to get a diagnosis report without personally going to the doctor.
" 我们的目标是让普通民众也能得到心电图诊断,患者只需在智能手机上点击纸质心电图记录的照片,就可以得到诊断报告,而无需亲自去看医生。"
宏观处理流程:
- 预处理
- 12导联 → \rightarrow → 单导联
- 图像增强
- 阴影去除
- 二值图像提取
- 对0 ~ 255的每个灰度值阈值检测,并绘制特征曲线(LOB和NS)
- 将信号输入ML模型,利用特征曲线和相应的阈值进行训练,自动预测阈值, 并得到单导联纸心电记录的二值化图像,只保留心电信号,去除背景网格。
- 后处理
- 去除心电导联名称(如v1、avf等)
- 将破碎的心电信号转换为连续的心电信号
- 进行扩张和骨架化,以确保心电信号在每一列中只有一个像素值
- 对经过后处理的二值图像进行垂直扫描,将二维图像转换为一维心电信号
- 将这个一维信号作为深度学习诊断模型的输入,该模型预测患者的心脏相关问题,并进行类似心脏病专家的分析。
处理细节:
12–>单 :
After obtaining the images of 12 lead ECG, 12 different images were obtained with a single lead in each image. There were some files with continuous 12-leads that were manually converted which was done by writing a semi-manual algorithm using the OpenCV library. Here, the left and right mouse clicks were used to draw horizontal and vertical lines on the 12 lead ECG image to get a grid in which each box of the grid contains a single lead.
“获得12导联心电图图像后,每幅图像中单导联获得12个不同的图像。有一些连续12导联的文件是手工转换的,这是通过使用OpenCV库编写半手工算法完成的。在这里,使用鼠标左键和右键点击在12导联心电图图像上绘制水平线和垂直线,得到一个网格,网格中的每个框包含一个导联。”
These boxes were saved as separate images to get 12 different images from one single 12 lead ECG image. (Code is given in the Supplementary Information.) For improving the computation complexities and accuracy, it was important to study every lead of the ECG. Rectangular boxes were located by shape detection and appropriately cropped to get 12 different image files. (The code for automated single lead extraction is also given in Supplementary Information.)
“这些框被保存为独立的图像,从一个12导联心电图图像中得到12个不同的图像。(编号在补充资料中给出). 为了提高计算的复杂性和准确性,对心电图各导联都进行研究具有重要意义。通过形状检测定位矩形框,并进行适当裁剪,得到12个不同的图像文件。(自动单导联提取的代码也在补充资料中给出)”
**二值图像提取: **
LOB (Level of Binarization): 二值化等级; 其实就是一个阈值, 在定义域为0-255的二值函数中, 0-LOB时函数值为0, LOB-255时函数值为1;
NS (normalized sum): 归一化和; 全黑时为0, 全白时为1;
流程:
- 对图像进行二值化
- 垂直扫描, 将其转换为一维数组 (图像的宽度作为这个一维数组的大小)
- 特征曲线 —> 1 × 253的稠密层 —> 2 个 1 × 253大小的密集隐藏层 —> 1 × 253的dropout层(该层通过了维度为1 × 1的Dense模型)
- 得到了称为LOB的数字,即阈值。我们在这个值上对图像进行二值化。
后处理:
- 进行膨胀和骨架化: 使用了一维信号重建算法。该算法可以有效地将心电信号中破碎的部分连接起来,避免发生突变.
- 删除导联名称
- 去除阴影印象: 将图像分割成RGB值,再应用膨胀来减少黑色阴影
- 去除盐胡椒噪声: 先中值模糊,然后归一化 (上述过程是对所有三个RGB值实现的)
用深度学习模型进行分析:
基于深度学习的心电诊断算法将给定的心电图像分为5类(正常、STEMI、LBBB、RBBB、t波异常)。
正常心电图中最显著的波是P波、QRS波和T波。患者心电图可发现不同类型的异常,如st段抬高心肌梗死(STEMI)、左束支传导阻滞(LBBB)、右束支传导阻滞(RBBB)、t波异常。STEMI是心肌梗死的一种类型。一部分心肌由于该区域的血液供应受阻而死亡。LBBB是左心室收缩晚于右心室的心脏传导系统异常的一种心电图。在RBBB的情况下,右束支不直接被脉冲激活,而左心室功能正常。窦性心律对于心脏内电脉冲的传导是必要的。奇怪形状的T波可能意味着心跳再极化中断,可能被确定为窦性心律T波异常。
深度学习诊断模型:
- 输入: 二值化的心电图像
- 通过二维卷积网络连同3*16维的ReLU层
- 使用一系列384层,和2个完全连接的层,它们也有隐藏层。
- softmax有5个神经元输出层,分类层将异常分为5个不同的类别。
其他细节:
- 任何心电图数字化都必须去除阴影和均匀亮度校正。
- 字符去除帮助我们正确地解码信号,这应该在后期处理中完成。对于字符的去除,可以进行光学字符的OCR和减法。
我的收获:
- 该论文与我要实现的功能完全一致, 让我对整个流程有了大致了解
- 论文中一图胜千言的论述风格很值得借鉴
- 但了解与真正实践之间还有不小的差距, 该论文给出了核心代码, 但对我而言, 感觉短时间无法实现出来
论文2: Combining Optical Character Recognition With Paper ECG Digitization (SHAMBAVI GANESH et al.)
提出了一种基于matlab的工具,将心电图波形从基于纸的心电图记录转换成数字化的心电图信号, 而且适用于各种格式的ECG(这正是我想要的!)。该工具被打包为一个基于开源的独立图形用户界面(GUI)的应用程序。这篇论文似乎提供了开源接口, 但只是将纸质心电图转化为数字心电数据, 不涉及之后的分析.
方法和步骤:
- 预处理
- 倾斜校正
- 背景网格去除
- 线性滤波
- 对心电信号进行分段; 利用连接分量分析(CCA);
- 实现光学字符识别(OCR),去除重叠的心电导联字符,并实现患者人口信息与研究记录或电子病历(EMR)的接口。
**实现细节: **
- 去网格, 将纸质ECG作二值化转换
- 倾斜校正 (Hough 变换)
- 加载ECG模板参数
- 格线移除 (二值化阈值技术)
- 中值滤波和插值
- 将二值化心电记录中心电行波形分割成块
- 连接成分分析
- 设置心电行分割所需的3个参数
- 在处理过的心电记录中重新标记连接的部分
- 心电记录行分割
- 字符提取和移除
- 创建OCR模板库
- 对心电图进行形态学预处理
- 去除字符 (通过OCR)
- 提取病人信息 (通过OCR)
- 将图片转换为时间序列
- 对分段的心电行波进行列像素扫描
- 提取心电波形的线性插值
- 将提取的心电波形从像素单位变换到到电压时间单位
**短期计划: **(将在本周日汇报)
- 安装matlab, 尝试运行该程序
- 尝试在云上运行该matlab程序, 为小程序提供接口