diff --git a/Main_Quality_Relabel.py b/Main_Quality_Relabel.py index 76d759f..9ca5dc7 100644 --- a/Main_Quality_Relabel.py +++ b/Main_Quality_Relabel.py @@ -40,7 +40,7 @@ back_add_second = 60 # 样本编号 sampNo = 670 # 从第几个心晓事件数量开始 -start_bcg_index = 0 +start_bcg_index = 1 if __name__ == '__main__': parser = argparse.ArgumentParser() @@ -69,6 +69,6 @@ if __name__ == '__main__': bcg_frequency=bcg_frequency, focus_event_list=focus_event_list) - qualityRelabel.show_all_event(start_bcg_index=opt.start_bcg_index, + qualityRelabel.show_all_event(start_bcg_index=opt.start_bcg_index - 1, front_add_second=opt.front_add_second, back_add_second=opt.back_add_second) diff --git a/README.md b/README.md index 57cd032..4524935 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ ```bash Quality_Relabel 主目录 ├── Data 数据 -│ ├── BCG -│ ├── BCG_label -│ ├── PSG -│ └── PSG_label +│ ├── Artifact_label 体动标签 +│ │ └──20220421Artifact_offset_value.xlsx 体动信号位置相对于心晓信号位置偏移量 +│ ├── BCG 心晓信号 +│ ├── BCG_label 心晓事件标签 +│ ├── PSG PSG信号 +│ └── PSG_label PSG事件标签 ├── history 存放历史记录 │ └── history.log 历史记录 ├── utils 基本库 @@ -18,9 +20,57 @@ Quality_Relabel 主目录 ``` -## 测试数据集 -670 [测试数据集](https://kod.server.marques22.com/#s/799gDeDw) + +## 数据来源与格式 + +### PSG数据 + +直接从Alice中导出的EDF文件,包括如下通道 + +| Signal Name | Frequency | Signal Name | Frequency | +| :---------: | :-------: | :---------: | :-------: | +| EEG C3-A2 | 200 | Flow T | 200 | +| EEG C4-A1 | 100 | Flow P | 100 | +| EEG F3-A2 | 200 | Effort Tho | 200 | +| EEG F3-A1 | 200 | Effort Abd | 10 | +| EEG O3-A2 | 200 | SpO2 | 1 | +| EEG O4-A1 | 200 | RR | 10 | +| EEG A1-A2 | 200 | ECG I | 200 | +| EOG Left | 200 | ECG II | 200 | +| EOG Right | 100 | Leg LEG1 | 200 | +| EMG Chin | 200 | leg LEG2 | 200 | +| Snore | 200 | Body | 1 | +| Imp | 200 | Pleth | 100 | +| Pluse | 1 | | | + + + +### 心晓数据 + +由new_org_1000hz.txt, 通过读取后保存成numpy的npy文件,以加速读取。此份数据为相对于PSG信号对齐,进行过补0与裁剪信号 + +### PSG标签 + +从Alice中导出包含所有事件的标签 + + + +### 心晓标签 + +打标后从Alice中导出,并重新计算标签的epoch、start、end + +其中CSA标签为质量打标后的第三次修正的位置 + + + +### 体动标签 + +每个标签由四行构成, 其中体动位置相对于未经对齐的心晓信号,故增加20220421Artifact_offset_value.xlsx 用于对齐 + +第一行为第几个事件, 第二行为事件标签编码, 第三行为事件起始点, 第四行为事件终止点 + + @@ -34,10 +84,130 @@ Quality_Relabel 主目录 | 3 | 阻塞型呼吸暂停 | 红色 | | 4 | 混合型呼吸暂停 | 灰色 | | 5 | 血氧饱和度下降 | 绿色 | +| 6 | 大体动 | 橙色 | +| 7 | 小体动 | 橙色 | +| 8 | 深呼吸 | 橙色 | +| 9 | 脉冲体动 | 橙色 | +| 10 | 无效片段 | 橙色 | -## 示例 +## 依赖库 + +- pyedflib + +- numpy + +- pandas + +- matplotlib + +- tqdm + +- pywt + +- scipy + +如果在windows服务器106上运行直接默认Anaconda环境就已满足 + + + +## 使用方法 + +### 1. 从PyCharm中运行 + +首先取消在pycharm的窗口内显示图片 + +File --> Settings --> Tools --> Python Scientific --> Show plots in tools window **取消勾选** + + + +打开Main_Quality_Relabel.py + +修改 + +focus_event_list 显示事件 + +sampNo 样本编号 + +start_bcg_index 从第几个事件开始显示 + + + + + +点击右上角红色方块停止程序 + + + + + +### 2. 从命令行运行 + +最新的代码支持从命令行中传入参数,无需打开pycharm + +在代码文件夹的路径栏输入cmd后回车,进入到命令提示符 + + + + + +再在命令提示符中运行python 程序名 参数 即可运行 + + + +#### 支持参数 + +```bash +usage: Main_Quality_Relabel.py [-h] [-n [SAMPNO]] + [-e [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]]] + [-i [START_BCG_INDEX]] [-f [FRONT_ADD_SECOND]] + [-b [BACK_ADD_SECOND]] + +optional arguments: + -h, --help show this help message and exit + -n [SAMPNO], --sampNo [SAMPNO] + 样本编号 + -e [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]], --event [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]] + 显示事件,从[OSA,CSA,MSA,HPY] 选择一个或多个 默认值:OSA + -i [START_BCG_INDEX], --start_bcg_index [START_BCG_INDEX] + 开始事件序号 默认值:1 + -f [FRONT_ADD_SECOND], --front_add_second [FRONT_ADD_SECOND] + 在事件前添加信号长度 默认值:60 + -b [BACK_ADD_SECOND], --back_add_second [BACK_ADD_SECOND] + 在事件后添加信号长度 默认值:60 + +``` + + + +#### 命令行示例 + +##### 1. 打开样本编号为670,查看事件OSA + +```bash +python Main_Quality_Relabel.py -n 670 +``` + +或 + +```bash +python Main_Quality_Relabel.py -n 670 -e OSA +``` + + + +##### 2. 打开样本编号为703,查看事件OSA、CSA, 从第三个事件开始 + +```bash +python Main_Quality_Relabel.py -n 703 -e OSA CSA -i 3 +``` + + + + + +## 窗口示例 @@ -67,9 +237,10 @@ Quality_Relabel 主目录 2022-04-15 22:06 - 1. ~~删除了PSG开头部分不存在于心晓中的标签,以后不用计算shifting~~ +1. ~~删除了PSG开头部分不存在于心晓中的标签,以后不用计算shifting~~ 2022-04-17 20:00 -​ 1. 添加命令行传入参数功能 + 1. ~~添加命令行传入参数功能~~ + 2. ~~添加显示目前位于第几个~~ diff --git a/graph/Quality_Relabel.svg b/graph/Quality_Relabel.svg index 257866a..f4cb1ce 100644 --- a/graph/Quality_Relabel.svg +++ b/graph/Quality_Relabel.svg @@ -246,9 +246,9 @@ 动态连接线.21 - + 数据.24 - 提取获得 心晓 心晓呼吸 ABD THO Flow T Flow P SpO2 + 提取获得 心晓 心晓呼吸 ABD THO Flow T Flow P SpO2 体动 @@ -270,29 +270,29 @@ - + - - - 提取获得 + + 提取获得心晓心晓呼吸ABDTHOFlow TFlow PSpO2 - + x="24.66" dy="1.2em" class="st4">SpO2体动 + 动态连接线.25 - + - + 动态连接线.26 - + - + 动态连接线.27 - + - + 判定 根据心晓事件个数遍历 @@ -322,7 +322,7 @@ 根据心晓事件个数遍历 - + 开始/结束.30 结束 @@ -352,7 +352,7 @@ 结束 - + 流程.31 获取PSG事件 长度、标签 @@ -382,7 +382,7 @@ 获取PSG事件长度、标签 - + 流程.32 获取心晓事件 长度、标签 @@ -412,7 +412,7 @@ 获取心晓事件长度、标签 - + 流程.33 向前、向后 获取一分钟 @@ -442,7 +442,7 @@ 向前、向后获取一分钟 - + 流程.34 向前、向后 获取一分钟+与PSG信号长度差值/2 @@ -473,7 +473,7 @@ 向前、向后获取一分钟+PSG信号长度差值/2 - + 流程.36 事件上色标注 @@ -502,7 +502,7 @@ 事件上色标注 - + 流程.38 事件上色标注 @@ -531,7 +531,7 @@ 事件上色标注 - + 流程.39 显示 @@ -560,49 +560,227 @@ 显示 - + 动态连接线.40 - + - + 动态连接线.41 - + 动态连接线.42 - + 动态连接线.43 - + 动态连接线.44 - + 动态连接线.45 - + 动态连接线.46 - + 动态连接线.47 - + - + 动态连接线.48 - + - + 动态连接线.49 - + 动态连接线.51 - + + + + 数据.53 + 输入体动标签 获取偏移数量 + + + + + + + + + + + + + + + + + + + 输入体动标签获取偏移数量 + + 流程.54 + 重新计算体动片段位置 + + + + + + + + + + + + + + + + + + + 重新计算体动片段位置 + + 动态连接线.55 + + + + 动态连接线.56 + + + + 动态连接线.57 + + + + 流程.58 + 获取体动事件 长度、标签 + + + + + + + + + + + + + + + + + + + 获取体动事件长度、标签 + + 流程.59 + 向前、向后 获取一分钟+与PSG信号长度差值/2 + + + + + + + + + + + + + + + + + + + 向前、向后获取一分钟+PSG信号长度差值/2 + + 流程.60 + 事件上色标注 + + + + + + + + + + + + + + + + + + + 事件上色标注 + + 动态连接线.61 + + + + 动态连接线.62 + + + + 动态连接线.63 + + + + 动态连接线.65 + diff --git a/graph/Quality_Relabel.vsdx b/graph/Quality_Relabel.vsdx index 1c6b960..c2fb15c 100644 Binary files a/graph/Quality_Relabel.vsdx and b/graph/Quality_Relabel.vsdx differ diff --git a/graph/example.png b/graph/example.png index af5107e..7695f94 100644 Binary files a/graph/example.png and b/graph/example.png differ diff --git a/utils/Quality_Relabel.py b/utils/Quality_Relabel.py index 032c85f..78582f9 100644 --- a/utils/Quality_Relabel.py +++ b/utils/Quality_Relabel.py @@ -63,12 +63,12 @@ class Quality_Relabel: # 3 ɫ # 4 ɫ # 5 ɫ ѪͶ½ - # 6 ɫ 嶯 - # 7 ɫ С嶯 - # 8 ɫ - # 9 ɫ 嶯 - # 10 ɫ ЧƬ - color_cycle = ["black", "pink", "blue", "red", "silver", "green", "yellow", "yellow", "yellow", "yellow", "yellow"] + # 6 ɫ 嶯 + # 7 ɫ С嶯 + # 8 ɫ + # 9 ɫ 嶯 + # 10 ɫ ЧƬ + color_cycle = ["black", "pink", "blue", "red", "silver", "green", "orange", "orange", "orange", "orange", "orange"] # assert len(color_cycle) == len(base_event) + 1, "¼ɫһ" @@ -348,7 +348,7 @@ class Quality_Relabel: # Flow2 plt.subplot(gs[1]) self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow P", - title=f"PSG sampNo:{self.sampNo} Index:{ecg_index}/{len(self.ecg_event_label_df)} " + title=f"PSG sampNo:{self.sampNo} Index:{ecg_index+1}/{len(self.ecg_event_label_filtered_df)} " f"Epoch:{one_ecg_data['Epoch']} Duration:{ecg_duration}") plt.subplot(gs[2]) @@ -370,7 +370,7 @@ class Quality_Relabel: event_code=[1, 2, 3, 4, 6, 7, 8, 9, 10], event_show_under=False, ax_bottom=True, - title=f" sampNo:{self.sampNo} Index:{bcg_index}/{len(self.bcg_event_label_df)} " + title=f" sampNo:{self.sampNo} Index:{bcg_index+1}/{len(self.bcg_event_label_filtered_df)} " f"Epoch:{one_bcg_data['Epoch']} Duration:{bcg_duration}", ) @@ -405,11 +405,11 @@ class Quality_Relabel: if channel == "SpO2": mask = self.spo2_event_label[SP * self.frequency:EP * self.frequency] == j elif channel == "orgdata" or channel == "0.7lowpass_resp": - if j < 4: + if j <= 5: mask = self.bcg_event_label[SP * self.frequency:EP * self.frequency] == j else: mask = self.artifact_event_label[SP * self.frequency:EP * self.frequency] == j - linestyle = "--" + linestyle = "-" else: mask = self.ecg_event_label[SP * self.frequency:EP * self.frequency] == j