From 713318e1842c105ad79f9fcb41851ab5c4891498 Mon Sep 17 00:00:00 2001
From: Yorusora <2944763079@qq.com>
Date: Fri, 21 Feb 2025 20:40:04 +0800
Subject: [PATCH] =?UTF-8?q?=E6=89=80=E6=9C=89=E5=8A=9F=E8=83=BD=E5=B7=B2?=
=?UTF-8?q?=E5=AE=8C=E5=96=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Deep_Model/Unet.py | 1955 +++++++++++++++++++++++++++
Deep_Model/__init__.py | 1 +
MainWindow.py | 699 ----------
MainWindow.ui | 1058 ---------------
detect_Jpeak.py | 286 ++++
detect_Rpeak2.py => detect_Rpeak.py | 2 -
heartbeat_annotation.py | 394 ++++--
ui/MainWindow.py | 117 ++
ui/MainWindow.ui | 134 ++
ui/widget_detect_Jpeaks.py | 402 ++++++
ui/widget_detect_Jpeaks.ui | 605 +++++++++
ui/widget_detect_Rpeaks.py | 332 +++++
ui/widget_detect_Rpeaks.ui | 489 +++++++
ui/widget_func.py | 115 ++
ui/widget_func.ui | 210 +++
ui/widget_resample1000Hz.py | 209 +++
ui/widget_resample1000Hz.ui | 308 +++++
17 files changed, 5429 insertions(+), 1887 deletions(-)
create mode 100644 Deep_Model/Unet.py
create mode 100644 Deep_Model/__init__.py
delete mode 100644 MainWindow.py
delete mode 100644 MainWindow.ui
create mode 100644 detect_Jpeak.py
rename detect_Rpeak2.py => detect_Rpeak.py (96%)
create mode 100644 ui/MainWindow.py
create mode 100644 ui/MainWindow.ui
create mode 100644 ui/widget_detect_Jpeaks.py
create mode 100644 ui/widget_detect_Jpeaks.ui
create mode 100644 ui/widget_detect_Rpeaks.py
create mode 100644 ui/widget_detect_Rpeaks.ui
create mode 100644 ui/widget_func.py
create mode 100644 ui/widget_func.ui
create mode 100644 ui/widget_resample1000Hz.py
create mode 100644 ui/widget_resample1000Hz.ui
diff --git a/Deep_Model/Unet.py b/Deep_Model/Unet.py
new file mode 100644
index 0000000..4e9f189
--- /dev/null
+++ b/Deep_Model/Unet.py
@@ -0,0 +1,1955 @@
+# encoding:utf-8
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torchvision.models.resnet import resnet34
+
+class _ConvBnReLU(nn.Sequential):
+ def __init__(self, in_ch,out_ch,kernel_size,padding,dilation=1,stride=1,bn=True, relu=True):
+ super(_ConvBnReLU, self).__init__()
+ self.add_module("conv",nn.Conv1d(in_ch, out_ch, kernel_size, stride, padding, dilation, bias=False))
+ if bn :
+ self.add_module("bn", nn.BatchNorm1d(out_ch))
+ if relu:
+ self.add_module("relu", nn.ReLU())
+
+class _conv_block(nn.Module):
+ def __init__(self,in_ch,out_ch,kernel_size,padding,dilation=1,stride=1,bn=True, relu=True):
+ super(_conv_block, self).__init__()
+ self.conv = nn.Sequential(
+ _ConvBnReLU(in_ch, out_ch, kernel_size=kernel_size, padding=padding, stride=stride,dilation=dilation),
+ _ConvBnReLU(out_ch, out_ch, kernel_size=kernel_size, padding=padding, stride=stride,dilation=dilation)
+ )
+
+ def forward(self,x):
+ x = self.conv(x)
+ return x
+
+class _conv_2block(nn.Module):
+ def __init__(self,in_ch,out_ch,kernel_size,padding,dilation=1,stride=1,bn=True, relu=True):
+ super(_conv_2block, self).__init__()
+ self.conv = nn.Sequential(
+ _ConvBnReLU(in_ch, out_ch, kernel_size=kernel_size, padding=padding, stride=stride,dilation=dilation),
+ _ConvBnReLU(out_ch, out_ch, kernel_size=kernel_size, padding=padding, stride=stride,dilation=dilation),
+ _ConvBnReLU(out_ch, out_ch, kernel_size=kernel_size, padding=padding, stride=stride, dilation=dilation)
+ )
+
+ def forward(self,x):
+ x = self.conv(x)
+ return x
+class up_conv(nn.Module): #数据扩大两倍,通道减小两倍
+ def __init__(self,ch_in,ch_out,kernel_size,padding):
+ super(up_conv,self).__init__()
+ self.up = nn.Sequential(
+ nn.Upsample(scale_factor=2),
+ nn.Conv1d(ch_in,ch_out,kernel_size=kernel_size,stride=1,padding=padding,bias=True),
+ nn.BatchNorm1d(ch_out),
+ nn.ReLU(inplace=True)
+ )
+
+ def forward(self,x):
+ x = self.up(x)
+ return x
+
+class up_conv_down(nn.Module):
+ def __init__(self,ch_in,ch_out,kernel_size,padding):
+ super(up_conv_down,self).__init__()
+ self.up = nn.Sequential(
+ nn.Upsample(size=(125)), #指定点数
+ nn.Conv1d(ch_in,ch_out,kernel_size=kernel_size,stride=1,padding=padding,bias=True),
+ nn.BatchNorm1d(ch_out),
+ nn.ReLU(inplace=True)
+ )
+
+ def forward(self,x):
+ x = self.up(x)
+ return x
+
+class up_conv2_down(nn.Module):
+ def __init__(self,ch_in,ch_out,kernel_size,padding):
+ super(up_conv2_down,self).__init__()
+ self.up = nn.Sequential(
+ nn.Upsample(size=(31)), #指定点数
+ nn.Conv1d(ch_in,ch_out,kernel_size=kernel_size,stride=1,padding=padding,bias=True),
+ nn.BatchNorm1d(ch_out),
+ nn.ReLU(inplace=True)
+ )
+
+ def forward(self,x):
+ x = self.up(x)
+ return x
+
+
+class Unet(nn.Module):
+ def __init__(self):
+ super(Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8)
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8)
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(128,256,kernel_size=17,padding=8) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2,padding=1) #62
+
+ self.feature5 = _conv_block(256, 512, kernel_size=17, padding=8)
+ self.drop = nn.Dropout(0.5)
+
+
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8)
+
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8)
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8)
+
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8)
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.7),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #63
+ x5 = self.drop(self.feature5(x5))
+
+
+ d5 = self.up4(x5) #125
+ d5 = torch.cat([x4,d5], dim=1) #125 通道数相加
+ d5 = self.up4_conv(d5)
+ d4 = self.up3(d5) #250
+ d4 = torch.cat([x3,d4], dim=1) #250
+ d4 = self.up3_conv(d4)
+ d3 = self.up2(d4) #500
+ d3 = torch.cat([x2,d3], dim=1) #500
+ d3 = self.up2_conv(d3)
+ d2 = self.up1(d3) #1000
+ d2 = torch.cat([x1,d2], dim=1) #1000
+ d2 = self.up1_conv(d2)
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+class paper_Unet(nn.Module):
+ def __init__(self):
+ super(paper_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,16,kernel_size=9,padding=4)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(16,32,kernel_size=9,padding=4)
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(32,64,kernel_size=9,padding=4)
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(64,128,kernel_size=9,padding=4) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2,padding=1) #62
+
+ self.feature5 = _conv_block(128, 256, kernel_size=9, padding=4)
+ self.drop = nn.Dropout(0.5)
+
+
+ self.up4 = up_conv_down(256,128,kernel_size=9,padding=4)
+
+ self.up4_conv = _conv_block(256,128,kernel_size=9,padding=4)
+
+ self.up3 = up_conv(128,64,kernel_size=9,padding=4)
+ self.up3_conv = _conv_block(128,64,kernel_size=9,padding=4)
+
+ self.up2 = up_conv(64,32,kernel_size=9,padding=4)
+ self.up2_conv = _conv_block(64,32,kernel_size=9,padding=4)
+
+ self.up1 = up_conv(32, 16, kernel_size=9,padding=4)
+ self.up1_conv = _conv_block(32, 16,kernel_size=9,padding=4)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=16, out_channels=16, kernel_size=1),
+ nn.Dropout(0.7),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #63
+ x5 = self.drop(self.feature5(x5))
+
+
+ d5 = self.up4(x5) #125
+ d5 = torch.cat([x4,d5], dim=1) #125 通道数相加
+ d5 = self.up4_conv(d5)
+ d4 = self.up3(d5) #250
+ d4 = torch.cat([x3,d4], dim=1) #250
+ d4 = self.up3_conv(d4)
+ d3 = self.up2(d4) #500
+ d3 = torch.cat([x2,d3], dim=1) #500
+ d3 = self.up2_conv(d3)
+ d2 = self.up1(d3) #1000
+ d2 = torch.cat([x1,d2], dim=1) #1000
+ d2 = self.up1_conv(d2)
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+class Threelayer_Unet(nn.Module):
+ def __init__(self):
+ super(Threelayer_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8)
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8)
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+
+ self.feature4 = _conv_block(128, 256, kernel_size=17, padding=8)
+ self.drop = nn.Dropout(0.5)
+
+
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8)
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8)
+
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8)
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.7),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+
+ x4 = self.drop(self.feature4(x4))
+
+
+ d4 = self.up3(x4) #250
+ d4 = torch.cat([x3,d4], dim=1) #250
+ d4 = self.up3_conv(d4)
+ d3 = self.up2(d4) #500
+ d3 = torch.cat([x2,d3], dim=1) #500
+ d3 = self.up2_conv(d3)
+ d2 = self.up1(d3) #1000
+ d2 = torch.cat([x1,d2], dim=1) #1000
+ d2 = self.up1_conv(d2)
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+
+
+class Fivelayer_Unet(nn.Module):
+ def __init__(self):
+ super(Fivelayer_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(128,256,kernel_size=17,padding=8) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature5 = _conv_block(256,512,kernel_size=17,padding=8) #62 512通道
+ self.maxpool5 = nn.MaxPool1d(kernel_size=2) #31*512
+
+ self.feature6 = _conv_block(512, 1024, kernel_size=17, padding=8) #最底层的一个卷积块 31*1024
+ self.drop = nn.Dropout(0.5)
+
+ self.up5 = up_conv(1024,512,kernel_size=17,padding=8) #62*512
+
+ # 跨层连接
+ self.up5_conv = _conv_block(1024,512,kernel_size=17,padding=8) #连接之后的卷积层 64*512
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8) #250*128
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8) ##每一个up之后都会跟一个跨层连接操作的
+
+ # 跨层连接
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #125
+ x5 = self.feature5(x5)
+ x6 = self.maxpool5(x5) #62
+ x6 = self.drop(self.feature6(x6))
+
+
+ d6 = self.up5(x6) #64*512
+ d6 = torch.cat([x5,d6], dim=1) #64*1024 通道数相加
+ d6 = self.up5_conv(d6) #64*512
+
+ d5 = self.up4(d6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+class imp_Fivelayer_Unet(nn.Module):
+ def __init__(self):
+ super(imp_Fivelayer_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=21,padding=10)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=13,padding=6) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(128,256,kernel_size=9,padding=4) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature5 = _conv_block(256,512,kernel_size=5,padding=2) #62 512通道
+ self.maxpool5 = nn.MaxPool1d(kernel_size=2) #31*512
+
+ self.feature6 = _conv_block(512, 1024, kernel_size=3, padding=1) #最底层的一个卷积块 31*1024
+ self.drop = nn.Dropout(0.5)
+
+ self.up5 = up_conv(1024,512,kernel_size=5,padding=2) #62*512
+
+ # 跨层连接
+ self.up5_conv = _conv_block(1024,512,kernel_size=5,padding=2) #连接之后的卷积层 64*512
+ self.up4 = up_conv_down(512,256,kernel_size=9,padding=4) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(512,256,kernel_size=9,padding=4)
+ self.up3 = up_conv(256,128,kernel_size=13,padding=6) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(256,128,kernel_size=13,padding=6) #250*128
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+ self.up1 = up_conv(64, 32, kernel_size=21, padding=10)
+
+
+ self.up1_conv = _conv_block(64, 32, kernel_size=15, padding=7) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #125
+ x5 = self.feature5(x5)
+ x6 = self.maxpool5(x5) #62
+ x6 = self.drop(self.feature6(x6))
+
+
+ d6 = self.up5(x6) #64*512
+ d6 = torch.cat([x5,d6], dim=1) #64*1024 通道数相加
+ d6 = self.up5_conv(d6) #64*512
+
+ d5 = self.up4(d6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+# class Unetplusplus(nn.Module):
+# def __init__(self, c_in=1, nf=[16, 32, 64, 128]):
+# super(Unetplusplus, self).__init__()
+# self.conv1_1 = _conv_block(c_in, nf[0],kernel_size=17,padding=8)
+# self.pool1 = nn.MaxPool1d(2, stride=2)
+# self.conv2_1 = _conv_block(nf[0], nf[1],kernel_size=17,padding=8)
+# self.pool2 = nn.MaxPool1d(2, stride=2)
+# self.up1_2 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up1_2 = nn.ConvTranspose1d(nf[1], nf[1], kernel_size=2, stride=2)
+# self.conv_up1_2 = nn.Conv1d(nf[1], nf[0], kernel_size=3, stride=1, padding=1)
+# self.relu1_2 = nn.ReLU()
+# self.conv1_2 = _conv_block(nf[1], nf[0],kernel_size=17,padding=8)
+#
+# self.conv3_1 = _conv_block(nf[1], nf[2],kernel_size=17,padding=8)
+# self.pool3 = nn.MaxPool1d(2, stride=2)
+# self.up2_2 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up2_2 = nn.ConvTranspose1d(nf[2], nf[2], kernel_size=2, stride=2)
+# self.conv_up2_2 = nn.Conv1d(nf[2], nf[1], kernel_size=3, stride=1, padding=1)
+# self.relu2_2 = nn.ReLU()
+# self.conv2_2 = _conv_block(nf[2], nf[1],kernel_size=17,padding=8)
+# self.up1_3 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up1_3 = nn.ConvTranspose1d(nf[1], nf[1], kernel_size=2, stride=2)
+# self.conv_up1_3 = nn.Conv1d(nf[1], nf[1], kernel_size=3, stride=1, padding=1)
+# self.relu1_3 = nn.ReLU()
+# self.conv1_3 = _conv_block(nf[2], nf[0],kernel_size=17,padding=8)
+#
+# self.conv4_1 = _conv_block(nf[2], nf[3],kernel_size=17,padding=8)
+# self.up3_2 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up3_2 = nn.ConvTranspose1d(nf[3], nf[3], kernel_size=2, stride=2)
+# self.conv_up3_2 = nn.Conv1d(nf[3], nf[2], kernel_size=3, stride=1, padding=1)
+# self.relu3_2 = nn.ReLU()
+# self.conv3_2 = _conv_block(nf[3], nf[2],kernel_size=17,padding=8)
+# self.up2_3 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up2_3 = nn.ConvTranspose1d(nf[2], nf[2], kernel_size=2, stride=2)
+# self.conv_up2_3 = nn.Conv1d(nf[2], nf[1], kernel_size=3, stride=1, padding=1)
+# self.relu2_3 = nn.ReLU()
+# self.conv2_3 = _conv_block(nf[1] * 3, nf[1],kernel_size=17,padding=8)
+# self.up1_4 = nn.Upsample(scale_factor=2, mode='linear', align_corners=True)
+# # self.up1_4 = nn.ConvTranspose1d(nf[1], nf[1], kernel_size=2, stride=2)
+# self.conv_up1_4 = nn.Conv1d(nf[1], nf[0], kernel_size=3, stride=1, padding=1)
+# self.relu1_4 = nn.ReLU()
+# self.conv1_4 = _conv_block(nf[2], nf[1],kernel_size=17,padding=8)
+#
+# self.output_conv = nn.Conv1d(nf[1], 32, kernel_size=1, stride=1)
+#
+# self.detection = nn.Sequential(
+# nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+# nn.Dropout(0.5),
+# nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+# )
+#
+# def forward(self, x):
+# conv1_1 = self.conv1_1(x)
+# # print("conv1_1",conv1_1.shape)
+# pool1 = self.pool1(conv1_1)
+# # print("pool1", pool1.shape)
+# conv2_1 = self.conv2_1(pool1)
+# # print("conv2_1", conv2_1.shape)
+# pool2 = self.pool2(conv2_1)
+# # print("pool2", pool2.shape)
+# up1_2 = self.relu1_2(self.conv_up1_2(self.up1_2(conv2_1))) # 12.9上采样没有起作用,导致维度不对
+# # print("up1_2", up1_2.shape)
+# conv1_2 = torch.cat([up1_2, conv1_1], dim=1)
+# # print("conv1_2", conv1_2.shape)
+# conv1_2 = self.conv1_2(conv1_2)
+# conv3_1 = self.conv3_1(pool2)
+# pool3 = self.pool3(conv3_1)
+# # print("pool3", pool3.shape)
+# up2_2 = self.relu2_2(self.conv_up2_2(self.up2_2(conv3_1)))
+# conv2_2 = torch.cat([up2_2, conv2_1], dim=1)
+# conv2_2 = self.conv2_2(conv2_2)
+# up1_3 = self.relu1_3(self.conv_up1_3(self.up1_3(conv2_2)))
+# conv1_3 = torch.cat([up1_3, conv1_1, conv1_2], dim=1)
+# conv1_3 = self.conv1_3(conv1_3)
+# conv4_1 = self.conv4_1(pool3)
+# # print("conv4_1", conv4_1.shape)
+# up3_2 = self.relu3_2(self.conv_up3_2(self.up3_2(conv4_1)))
+# # print("up3_2", up3_2.shape)
+# # print("conv3_1", conv3_1.shape)
+# conv3_2 = torch.cat([up3_2, conv3_1], dim=1)
+# conv3_2 = self.conv3_2(conv3_2)
+# up2_3 = self.relu2_3(self.conv_up2_3(self.up2_3(conv3_2)))
+# conv2_3 = torch.cat([up2_3, conv2_1, conv2_2], dim=1)
+# conv2_3 = self.conv2_3(conv2_3)
+# up1_4 = self.relu1_4(self.conv_up1_4(self.up1_4(conv2_3)))
+# conv1_4 = torch.cat([up1_4, conv1_1, conv1_2, conv1_3], dim=1)
+# conv1_4 = self.conv1_4(conv1_4)
+# output_conv = self.output_conv(conv1_4)
+# # output_conv = output_conv.reshape(-1, output_conv.shape[1] * output_conv.shape[2])
+#
+# result = self.detection(output_conv)
+# return result
+
+class Unetplusplus(nn.Module):
+ def __init__(self, c_in=1, nf=[16, 32, 64, 128]):
+ super(Unetplusplus, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.conv1_1 = _conv_block(c_in, nf[0], kernel_size=17, padding=8)
+ self.pool1 = nn.MaxPool1d(2, stride=2)
+ self.conv2_1 = _conv_block(nf[0], nf[1], kernel_size=17, padding=8)
+ self.pool2 = nn.MaxPool1d(2, stride=2)
+ self.up1_2 = up_conv(nf[1], nf[0],kernel_size=13,padding=6)
+ self.conv1_2 = _conv_block(nf[1], nf[0], kernel_size=17, padding=8)
+
+ self.conv3_1 = _conv_block(nf[1], nf[2], kernel_size=17, padding=8)
+ self.pool3 = nn.MaxPool1d(2, stride=2)
+ self.up2_2 = up_conv(nf[2], nf[1], kernel_size=13, padding=6)
+
+ self.conv2_2 = _conv_block(nf[2], nf[1], kernel_size=17, padding=8)
+ self.up1_3 = up_conv(nf[1], nf[0], kernel_size=13, padding=6)
+ #跨层连接操作
+ self.conv1_3 = _conv_block(nf[0]*3, nf[0], kernel_size=17, padding=8)
+
+ self.conv4_1 = _conv_block(nf[2], nf[3], kernel_size=17, padding=8)
+ self.up3_2 = up_conv(nf[3], nf[2], kernel_size=13, padding=6) ##输入通道与上一个输出通道一样,输出通道是输入通道的两倍
+
+ self.conv3_2 = _conv_block(nf[3], nf[2], kernel_size=17, padding=8)
+ self.up2_3 = up_conv(nf[2], nf[1], kernel_size=13, padding=6)
+
+ self.conv2_3 = _conv_block(nf[1] * 3, nf[1], kernel_size=17, padding=8)
+ self.up1_4 = up_conv(nf[1], nf[0], kernel_size=13, padding=6)
+ self.conv1_4 = _conv_block(nf[2], nf[1], kernel_size=17, padding=8)
+
+ self.output_conv = nn.Conv1d(nf[1], 32, kernel_size=1, stride=1)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self, x):
+ x = self.norm(x)
+ conv1_1 = self.conv1_1(x)
+ # print("conv1_1",conv1_1.shape)
+ pool1 = self.pool1(conv1_1)
+ # print("pool1", pool1.shape)
+ conv2_1 = self.conv2_1(pool1)
+ # print("conv2_1", conv2_1.shape)
+ pool2 = self.pool2(conv2_1)
+ # print("pool2", pool2.shape)
+ up1_2 = self.up1_2(conv2_1) # 12.9上采样没有起作用,导致维度不对
+ # print("up1_2", up1_2.shape)
+ conv1_2 = torch.cat([up1_2, conv1_1], dim=1)
+ # print("conv1_2", conv1_2.shape)
+ conv1_2 = self.conv1_2(conv1_2)
+
+ conv3_1 = self.conv3_1(pool2)
+ pool3 = self.pool3(conv3_1)
+ # print("pool3", pool3.shape)
+ up2_2 = self.up2_2(conv3_1)
+ conv2_2 = torch.cat([up2_2, conv2_1], dim=1)
+ conv2_2 = self.conv2_2(conv2_2)
+ up1_3 = self.up1_3(conv2_2)
+ conv1_3 = torch.cat([up1_3, conv1_1, conv1_2], dim=1)
+ conv1_3 = self.conv1_3(conv1_3)
+ conv4_1 = self.conv4_1(pool3)
+ # print("conv4_1", conv4_1.shape)
+ up3_2 = self.up3_2(conv4_1)
+ # print("up3_2", up3_2.shape)
+ # print("conv3_1", conv3_1.shape)
+ conv3_2 = torch.cat([up3_2, conv3_1], dim=1)
+ conv3_2 = self.conv3_2(conv3_2)
+ up2_3 = self.up2_3(conv3_2)
+ conv2_3 = torch.cat([up2_3, conv2_1, conv2_2], dim=1)
+ conv2_3 = self.conv2_3(conv2_3)
+ up1_4 = self.up1_4(conv2_3)
+ conv1_4 = torch.cat([up1_4, conv1_1, conv1_2, conv1_3], dim=1)
+ conv1_4 = self.conv1_4(conv1_4)
+ output_conv = self.output_conv(conv1_4)
+ # output_conv = output_conv.reshape(-1, output_conv.shape[1] * output_conv.shape[2])
+
+ result = self.detection(output_conv)
+ return result
+
+class Fourlayer_Unetplusplus(nn.Module):
+ def __init__(self, c_in=1, nf=[16, 32, 64, 128,256]):
+ super(Fourlayer_Unetplusplus, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.conv1_1 = _conv_block(c_in, nf[0], kernel_size=21, padding=10)
+ self.pool1 = nn.MaxPool1d(2, stride=2)
+ self.conv2_1 = _conv_block(nf[0], nf[1], kernel_size=17, padding=8)
+ self.pool2 = nn.MaxPool1d(2, stride=2)
+ self.up1_2 = up_conv(nf[1], nf[0], kernel_size=17, padding=8)
+ self.conv1_2 = _conv_block(nf[1], nf[0], kernel_size=21, padding=10)
+
+ ###########################################################################
+ self.conv3_1 = _conv_block(nf[1], nf[2], kernel_size=13, padding=6)
+ self.pool3 = nn.MaxPool1d(2, stride=2)
+ self.up2_2 = up_conv(nf[2], nf[1], kernel_size=13, padding=6)
+
+ self.conv2_2 = _conv_block(nf[2], nf[1], kernel_size=17, padding=8)
+ self.up1_3 = up_conv(nf[1], nf[0], kernel_size=17, padding=8)
+ # 跨层连接操作
+ self.conv1_3 = _conv_block(nf[0] * 3, nf[0], kernel_size=21, padding=10)
+
+ ###################################################################
+ self.conv4_1 = _conv_block(nf[2], nf[3], kernel_size=9, padding=4)
+ self.up3_2 = up_conv(nf[3], nf[2], kernel_size=9, padding=4) ##输入通道与上一个输出通道一样,输出通道是输入通道的两倍
+
+ self.conv3_2 = _conv_block(nf[3], nf[2], kernel_size=13, padding=6)
+ self.up2_3 = up_conv(nf[2], nf[1], kernel_size=13, padding=6)
+
+ self.conv2_3 = _conv_block(nf[1] * 3, nf[1], kernel_size=17, padding=8)
+ self.up1_4 = up_conv(nf[1], nf[0], kernel_size=17, padding=8)
+ self.conv1_4 = _conv_block(nf[2], nf[1], kernel_size=21, padding=10)
+ ##########################################################################
+
+
+ ####################再加深一层##############################################
+ self.pool4 = nn.MaxPool1d(2, stride=2)
+ self.conv5_1 = _conv_block(nf[3], nf[4], kernel_size=5, padding=2)
+ self.up4_2 = up_conv_down(nf[4], nf[3], kernel_size=5, padding=2)
+ self.conv4_2 = _conv_block(nf[4], nf[3], kernel_size=9, padding=4)
+ self.up3_3 = up_conv(nf[3], nf[2], kernel_size=9, padding=4)
+ self.conv3_3 = _conv_block(nf[2]*3, nf[2], kernel_size=13, padding=6)
+ self.up2_4 = up_conv(nf[2], nf[1], kernel_size=13, padding=6)
+ self.conv2_4= _conv_block(nf[3], nf[2], kernel_size=17, padding=8) #128->64
+ self.up1_5 = up_conv(nf[2], nf[1], kernel_size=17, padding=8)
+ self.conv1_5 = _conv_block(nf[2]+nf[0]*3, nf[2], kernel_size=17, padding=8)
+
+ ####################################################################
+ self.output_conv = nn.Conv1d(nf[2], 32, kernel_size=1, stride=1)
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self, x):
+ x = self.norm(x)
+ conv1_1 = self.conv1_1(x)
+ # print("conv1_1",conv1_1.shape)
+ pool1 = self.pool1(conv1_1)
+ # print("pool1", pool1.shape)
+ conv2_1 = self.conv2_1(pool1)
+ # print("conv2_1", conv2_1.shape)
+ pool2 = self.pool2(conv2_1)
+ # print("pool2", pool2.shape)
+ up1_2 = self.up1_2(conv2_1) # 12.9上采样没有起作用,导致维度不对
+ # print("up1_2", up1_2.shape)
+ conv1_2 = torch.cat([up1_2, conv1_1], dim=1)
+ # print("conv1_2", conv1_2.shape)
+ conv1_2 = self.conv1_2(conv1_2)
+
+ conv3_1 = self.conv3_1(pool2)
+ pool3 = self.pool3(conv3_1)
+ # print("pool3", pool3.shape)
+ up2_2 = self.up2_2(conv3_1)
+ conv2_2 = torch.cat([up2_2, conv2_1], dim=1)
+ conv2_2 = self.conv2_2(conv2_2)
+ up1_3 = self.up1_3(conv2_2)
+ conv1_3 = torch.cat([up1_3, conv1_1, conv1_2], dim=1)
+ conv1_3 = self.conv1_3(conv1_3)
+ conv4_1 = self.conv4_1(pool3)
+ # print("conv4_1", conv4_1.shape)
+ up3_2 = self.up3_2(conv4_1)
+ # print("up3_2", up3_2.shape)
+ # print("conv3_1", conv3_1.shape)
+ conv3_2 = torch.cat([up3_2, conv3_1], dim=1)
+ conv3_2 = self.conv3_2(conv3_2)
+ up2_3 = self.up2_3(conv3_2)
+ conv2_3 = torch.cat([up2_3, conv2_1, conv2_2], dim=1)
+ conv2_3 = self.conv2_3(conv2_3)
+ up1_4 = self.up1_4(conv2_3)
+ conv1_4 = torch.cat([up1_4, conv1_1, conv1_2, conv1_3], dim=1)
+ conv1_4 = self.conv1_4(conv1_4)
+
+ pool4 = self.pool4(conv4_1)
+ conv5_1 = self.conv5_1(pool4)
+ up4_2 = self.up4_2(conv5_1)
+ conv4_2 = torch.cat([up4_2, conv4_1], dim=1)
+ conv4_2 = self.conv4_2(conv4_2)
+ up3_3 = self.up3_3(conv4_2)
+ conv3_3 = torch.cat([up3_3, conv3_1, conv3_2], dim=1)
+ conv3_3 = self.conv3_3(conv3_3)
+ up2_4 = self.up2_4(conv3_3)
+ conv2_4 = torch.cat([up2_4, conv2_1, conv2_2, conv2_3], dim=1)
+ conv2_4 = self.conv2_4(conv2_4)
+ up1_5 = self.up1_5(conv2_4)
+ conv1_5 = torch.cat([up1_5, conv1_1, conv1_2, conv1_3,conv1_4], dim=1)
+ conv1_5 = self.conv1_5(conv1_5)
+
+ output_conv = self.output_conv(conv1_5)
+ # output_conv = output_conv.reshape(-1, output_conv.shape[1] * output_conv.shape[2])
+
+ result = self.detection(output_conv)
+ return result
+
+class Fivelayer_Lstm_Unet(nn.Module):
+ def __init__(self):
+ super(Fivelayer_Lstm_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(128,256,kernel_size=17,padding=8) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature5 = _conv_block(256,512,kernel_size=13,padding=6) #62 512通道
+ self.maxpool5 = nn.MaxPool1d(kernel_size=2) #31*512
+
+ self.feature6 = _conv_block(512, 1024, kernel_size=9, padding=4) #最底层的一个卷积块 31*1024
+
+ self.feature6_median = nn.LSTM(input_size=1024, hidden_size=1024,bidirectional=True,batch_first=True)
+ self.feature6_last = _conv_block(2048,1024,kernel_size=9,padding=4)
+
+ self.drop = nn.Dropout(0.5)
+
+ self.up5 = up_conv(1024,512,kernel_size=17,padding=8) #62*512
+
+ # 跨层连接
+ self.up5_conv = _conv_block(1024,512,kernel_size=17,padding=8) #连接之后的卷积层 64*512
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8) #250*128
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+
+
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #125
+ x5 = self.feature5(x5)
+ x6 = self.maxpool5(x5) #62
+
+ x6 = self.feature6(x6)
+ x6,(hh,hc) = self.feature6_median(x6.permute(0,2,1)) #改变维度
+ x6 = self.feature6_last(x6.permute((0,2,1)))
+
+ x6 = self.drop(x6)
+
+
+ d6 = self.up5(x6) #64*512
+ d6 = torch.cat([x5,d6], dim=1) #64*1024 通道数相加
+ d6 = self.up5_conv(d6) #64*512
+
+ d5 = self.up4(d6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+
+class Fourlayer_Lstm_Unet(nn.Module):
+ def __init__(self):
+ super(Fourlayer_Lstm_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(128,256,kernel_size=17,padding=8) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+
+ self.feature5 = _conv_block(256, 512, kernel_size=9, padding=4) #最底层的一个卷积块 62*512
+
+ self.feature5_median = nn.LSTM(input_size=512, hidden_size=512,bidirectional=True,batch_first=True)
+ self.feature5_last = _conv_block(1024,512,kernel_size=9,padding=4)
+
+ self.drop = nn.Dropout(0.5)
+
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8) #250*128
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+
+
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #125
+
+
+ x6 = self.feature5(x5)
+ x6,(hh,hc) = self.feature5_median(x6.permute(0,2,1)) #改变维度
+ x6 = self.feature5_last(x6.permute((0,2,1)))
+
+ x6 = self.drop(x6)
+
+
+ d5 = self.up4(x6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+class Fourlayer_LUnet(nn.Module):
+ def __init__(self):
+ super(Fourlayer_LUnet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(64,128,kernel_size=17,padding=8) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature3_median = nn.LSTM(input_size=128, hidden_size=128,bidirectional=True,batch_first=True)
+ self.feature3_last = _conv_block(256,128,kernel_size=17,padding=8)
+
+ self.feature4 = _conv_block(128,256,kernel_size=17,padding=8) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature4_median = nn.LSTM(input_size=256, hidden_size=256,bidirectional=True,batch_first=True)
+ self.feature4_last = _conv_block(512,256,kernel_size=17,padding=8)
+
+ self.feature5 = _conv_block(256, 512, kernel_size=9, padding=4) #最底层的一个卷积块 62*512
+
+ self.feature5_median = nn.LSTM(input_size=512, hidden_size=512,bidirectional=True,batch_first=True)
+ self.feature5_last = _conv_block(1024,512,kernel_size=9,padding=4)
+
+ self.drop = nn.Dropout(0.5)
+
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8) #250*128
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+
+
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #125
+
+
+ xx3,(hh,hc) = self.feature3_median(x3.permute(0,2,1)) #改变维度
+ xx3 = self.feature3_last(xx3.permute((0,2,1)))
+
+ xx4,(hh,hc) = self.feature4_median(x4.permute(0,2,1)) #改变维度
+ xx4 = self.feature4_last(xx4.permute((0,2,1)))
+
+ x6 = self.feature5(x5)
+ x6,(hh,hc) = self.feature5_median(x6.permute(0,2,1)) #改变维度
+ x6 = self.feature5_last(x6.permute((0,2,1)))
+
+ x6 = self.drop(x6)
+
+
+ d5 = self.up4(x6) #125*256
+ d5 = torch.cat([xx4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([xx3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+class Sixlayer_Unet(nn.Module):
+ def __init__(self):
+ super(Sixlayer_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,16,kernel_size=13,padding=6)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(16,32,kernel_size=13,padding=6) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(32,64,kernel_size=13,padding=6) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(64,128,kernel_size=13,padding=6) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature5 = _conv_block(128,256,kernel_size=13,padding=6) #62 512通道
+ self.maxpool5 = nn.MaxPool1d(kernel_size=2) #31*512
+
+ self.feature6 = _conv_block(256,512,kernel_size=13,padding=6) #31 1024通道
+ self.maxpool6 = nn.MaxPool1d(kernel_size=2,padding=1) #16*1024
+
+ self.feature7 = _conv_block(512, 1024, kernel_size=9, padding=4) #最底层的一个卷积块 31*1024
+ self.drop = nn.Dropout(0.5)
+
+
+ self.up6 = up_conv2_down(1024,512,kernel_size=9,padding=4) #31*1024
+
+ # 跨层连接
+ self.up6_conv = _conv_block(1024,512,kernel_size=13,padding=6) #连接之后的卷积层 64*512
+ self.up5 = up_conv(512,256,kernel_size=13,padding=6) #62*512
+
+ # 跨层连接
+ self.up5_conv = _conv_block(512,256,kernel_size=13,padding=6) #连接之后的卷积层 64*512
+ self.up4 = up_conv_down(256,128,kernel_size=13,padding=6) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(256,128,kernel_size=13,padding=6)
+ self.up3 = up_conv(128,64,kernel_size=13,padding=6) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(128,64,kernel_size=13,padding=6) #250*128
+ self.up2 = up_conv(64,32,kernel_size=13,padding=6) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(64,32,kernel_size=13,padding=6)
+ self.up1 = up_conv(32, 16, kernel_size=13, padding=6)
+
+
+ self.up1_conv = _conv_block(32, 16, kernel_size=13, padding=6) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=16, out_channels=16, kernel_size=1),
+ nn.Dropout(0.7),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #62
+
+ x5 = self.feature5(x5)
+ x6 = self.maxpool5(x5) #31
+
+ x6 = self.feature6(x6)
+
+ x7 = self.maxpool6(x6) #16
+ x7 = self.drop(self.feature7(x7))
+
+
+ d7 = self.up6(x7) #31*1024
+ d7 = torch.cat([x6,d7], dim=1) #31*2048 通道数相加
+ d7 = self.up6_conv(d7) #31*1024
+
+ d6 = self.up5(d7) #62*512
+ d6 = torch.cat([x5,d6], dim=1) #62*1024 通道数相加
+ d6 = self.up5_conv(d6) #62*512
+
+ d5 = self.up4(d6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+class Sixlayer_Lstm_Unet(nn.Module):
+ def __init__(self):
+ super(Sixlayer_Lstm_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,16,kernel_size=13,padding=6)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(16,32,kernel_size=13,padding=6) #500
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_block(32,64,kernel_size=13,padding=6) #250
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_block(64,128,kernel_size=13,padding=6) #125
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2) #62 (125-1)/2 = 62
+
+ self.feature5 = _conv_block(128,256,kernel_size=13,padding=6) #62 512通道
+ self.maxpool5 = nn.MaxPool1d(kernel_size=2) #31*512
+
+ self.feature6 = _conv_block(256,512,kernel_size=13,padding=6) #31 1024通道
+ self.maxpool6 = nn.MaxPool1d(kernel_size=2,padding=1) #16*1024
+
+ self.feature7 = _conv_block(512, 1024, kernel_size=9, padding=4) #最底层的一个卷积块 16*1024
+
+ self.feature7_median = nn.LSTM(input_size=1024, hidden_size=1024,bidirectional=True,batch_first=True)
+ self.feature7_last = _conv_block(2048,1024,kernel_size=9,padding=4)
+
+ self.drop = nn.Dropout(0.3)
+
+
+ self.up6 = up_conv2_down(1024,512,kernel_size=9,padding=4) #31*1024
+
+
+ # 跨层连接
+ self.up6_conv = _conv_block(1024,512,kernel_size=13,padding=6) #连接之后的卷积层 64*512
+ self.up5 = up_conv(512,256,kernel_size=13,padding=6) #62*512
+
+ # 跨层连接
+ self.up5_conv = _conv_block(512,256,kernel_size=13,padding=6) #连接之后的卷积层 64*512
+ self.up4 = up_conv_down(256,128,kernel_size=13,padding=6) #最底层的一个上采用,变为125个点 125*256
+
+ # 跨层连接
+ self.up4_conv = _conv_block(256,128,kernel_size=13,padding=6)
+ self.up3 = up_conv(128,64,kernel_size=13,padding=6) #250*128
+
+ # 跨层连接
+ self.up3_conv = _conv_block(128,64,kernel_size=13,padding=6) #250*128
+ self.up2 = up_conv(64,32,kernel_size=13,padding=6) #500*64
+
+ # 跨层连接
+ self.up2_conv = _conv_block(64,32,kernel_size=13,padding=6)
+ self.up1 = up_conv(32, 16, kernel_size=13, padding=6)
+
+
+ self.up1_conv = _conv_block(32, 16, kernel_size=13, padding=6) #最后一个卷积层
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=16, out_channels=16, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #62
+
+ x5 = self.feature5(x5)
+ x6 = self.maxpool5(x5) #31
+
+ x6 = self.feature6(x6)
+
+ x7 = self.maxpool6(x6) #16*1024
+ # x7 = self.drop(self.feature7(x7))
+##############################添加LSTM的地方###########################################
+ x7 = self.feature7(x7)
+ x7,(hh,hc) = self.feature7_median(x7.permute(0,2,1)) #改变维度
+ x7 = self.feature7_last(x7.permute((0,2,1)))
+
+ x7 = self.drop(x7)
+#####################################################################################
+
+ d7 = self.up6(x7) #31*1024
+ d7 = torch.cat([x6,d7], dim=1) #31*2048 通道数相加
+ d7 = self.up6_conv(d7) #31*1024
+
+ d6 = self.up5(d7) #62*512
+ d6 = torch.cat([x5,d6], dim=1) #62*1024 通道数相加
+ d6 = self.up5_conv(d6) #62*512
+
+ d5 = self.up4(d6) #125*256
+ d5 = torch.cat([x4,d5], dim=1) #125*512
+ d5 = self.up4_conv(d5) #125*256
+
+ d4 = self.up3(d5) #250*128
+ d4 = torch.cat([x3,d4], dim=1) #250*256
+ d4 = self.up3_conv(d4) #250*128
+
+ d3 = self.up2(d4) #500*64
+ d3 = torch.cat([x2,d3], dim=1) #500*128
+ d3 = self.up2_conv(d3) #500*64
+
+ d2 = self.up1(d3) #1000*32
+ d2 = torch.cat([x1,d2], dim=1) #1000*64
+ d2 = self.up1_conv(d2) #1000*32
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+
+class deep_Unet(nn.Module):
+ def __init__(self):
+ super(deep_Unet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,32,kernel_size=17,padding=8)
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2) #500
+
+ self.feature2 = _conv_block(32,64,kernel_size=17,padding=8)
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2) #250
+
+ self.feature3 = _conv_2block(64,128,kernel_size=17,padding=8)
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2) #125
+
+ self.feature4 = _conv_2block(128,256,kernel_size=17,padding=8)
+ self.maxpool4 = nn.MaxPool1d(kernel_size=2,padding=1) #62
+
+ self.feature5 = _conv_block(256, 512, kernel_size=17, padding=8)
+ self.drop = nn.Dropout(0.5)
+
+
+ self.up4 = up_conv_down(512,256,kernel_size=17,padding=8)
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8)
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8)
+
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8)
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+
+ self.up1 = up_conv(64, 32, kernel_size=17, padding=8)
+ self.up1_conv = _conv_block(64, 32, kernel_size=17, padding=8)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=32, out_channels=16, kernel_size=1),
+ nn.Dropout(0.7),
+ nn.Conv1d(in_channels=16, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1) #500
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2) #250
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3) #125
+ x4 = self.feature4(x4)
+ x5 = self.maxpool4(x4) #63
+ x5 = self.drop(self.feature5(x5))
+
+
+ d5 = self.up4(x5) #125
+ d5 = torch.cat([x4,d5], dim=1) #125 通道数相加
+ d5 = self.up4_conv(d5)
+ d4 = self.up3(d5) #250
+ d4 = torch.cat([x3,d4], dim=1) #250
+ d4 = self.up3_conv(d4)
+ d3 = self.up2(d4) #500
+ d3 = torch.cat([x2,d3], dim=1) #500
+ d3 = self.up2_conv(d3)
+ d2 = self.up1(d3) #1000
+ d2 = torch.cat([x1,d2], dim=1) #1000
+ d2 = self.up1_conv(d2)
+
+
+ result = self.detection(d2)
+
+
+ return result
+
+
+class Unet_lstm(nn.Module):
+ def __init__(self):
+ super(Unet_lstm, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature1 = _conv_block(1,64,kernel_size=17,padding=8) #原来是35,17
+ self.maxpool1 = nn.MaxPool1d(kernel_size=2)
+
+ self.feature2 = _conv_block(64,128,kernel_size=17,padding=8)
+ self.maxpool2 = nn.MaxPool1d(kernel_size=2)
+
+ self.feature3 = _conv_block(128,256,kernel_size=17,padding=8) #若要加层或者加lstm 修改从这里开始
+ self.maxpool3 = nn.MaxPool1d(kernel_size=2)
+
+ self.feature4 = _conv_block(256,512,kernel_size=17,padding=8)
+ self.feature4_median = nn.LSTM(input_size=512, hidden_size=512,bidirectional=True,batch_first=True)
+ self.feature4_last = _conv_block(1024,512,kernel_size=13,padding=6)
+
+
+ self.up4 = up_conv(512,256,kernel_size=17,padding=8)
+ self.up4_conv = _conv_block(512,256,kernel_size=17,padding=8)
+
+ self.up3 = up_conv(256,128,kernel_size=17,padding=8)
+ self.up3_conv = _conv_block(256,128,kernel_size=17,padding=8)
+
+ self.up2 = up_conv(128,64,kernel_size=17,padding=8)
+ self.up2_conv = _conv_block(128,64,kernel_size=17,padding=8)
+
+ self.detection = nn.Sequential(
+ nn.Conv1d(in_channels=64, out_channels=32, kernel_size=1),
+ nn.Dropout(0.5),
+ nn.Conv1d(in_channels=32, out_channels=1, kernel_size=1),
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ x1 = self.feature1(x)
+ x2 = self.maxpool1(x1)
+ x2 = self.feature2(x2)
+ x3 = self.maxpool2(x2)
+ x3 = self.feature3(x3)
+ x4 = self.maxpool3(x3)
+ x4 = self.feature4(x4)
+ x4,(hh,hc) = self.feature4_median(x4.permute(0,2,1)) #改变维度
+ x4 = self.feature4_last(x4.permute((0,2,1)))
+
+
+ d4 = self.up4(x4)
+ d4 = torch.cat([x3,d4], dim=1)
+ d4 = self.up4_conv(d4)
+ d3 = self.up3(d4)
+ d3 = torch.cat([x2,d3], dim=1)
+ d3 = self.up3_conv(d3)
+ d2 = self.up2(d3)
+ d2 = torch.cat([x1,d2], dim=1)
+ d2 = self.up2_conv(d2)
+
+ result = self.detection(d2)
+
+
+ return result
+
+###修改卷积核的大小试试
+# class Unet_lstm(nn.Module):
+# def __init__(self):
+# super(Unet_lstm, self).__init__()
+# self.norm = nn.BatchNorm1d(1)
+# self.feature1 = _conv_block(1,64,kernel_size=35,padding=17) #原来是35,17
+# self.maxpool1 = nn.MaxPool1d(kernel_size=2)
+#
+# self.feature2 = _conv_block(64,128,kernel_size=35,padding=17)
+# self.maxpool2 = nn.MaxPool1d(kernel_size=2)
+#
+# self.feature3 = _conv_block(128,256,kernel_size=35,padding=17) #若要加层或者加lstm 修改从这里开始
+# self.maxpool3 = nn.MaxPool1d(kernel_size=2)
+#
+# self.feature4 = _conv_block(256,512,kernel_size=35,padding=17)
+# self.feature4_median = nn.LSTM(input_size=512, hidden_size=512,bidirectional=True)
+# self.feature4_last = _conv_block(1024,512,kernel_size=13,padding=6)
+#
+#
+# self.up4 = up_conv(512,256,kernel_size=35,padding=17)
+# self.up4_conv = _conv_block(512,256,kernel_size=35,padding=17)
+#
+# self.up3 = up_conv(256,128,kernel_size=35,padding=17)
+# self.up3_conv = _conv_block(256,128,kernel_size=35,padding=17)
+#
+# self.up2 = up_conv(128,64,kernel_size=35,padding=17)
+# self.up2_conv = _conv_block(128,64,kernel_size=35,padding=17)
+#
+# self.detection = nn.Sequential(
+# nn.Conv1d(in_channels=64, out_channels=32, kernel_size=1),
+# nn.Dropout(0.5),
+# nn.Conv1d(in_channels=32, out_channels=1, kernel_size=1),
+# )
+#
+# def forward(self,x):
+# x = self.norm(x)
+#
+# x1 = self.feature1(x)
+# x2 = self.maxpool1(x1)
+# x2 = self.feature2(x2)
+# x3 = self.maxpool2(x2)
+# x3 = self.feature3(x3)
+# x4 = self.maxpool3(x3)
+# x4 = self.feature4(x4)
+# x4,(hh,hc) = self.feature4_median(x4.permute(0,2,1)) #改变维度
+# x4 = self.feature4_last(x4.permute((0,2,1)))
+#
+#
+# d4 = self.up4(x4)
+# d4 = torch.cat([x3,d4], dim=1)
+# d4 = self.up4_conv(d4)
+# d3 = self.up3(d4)
+# d3 = torch.cat([x2,d3], dim=1)
+# d3 = self.up3_conv(d3)
+# d2 = self.up2(d3)
+# d2 = torch.cat([x1,d2], dim=1)
+# d2 = self.up2_conv(d2)
+#
+# result = self.detection(d2)
+#
+#
+# return result
+class _Bottleneck(nn.Module):
+ """
+ Bottleneck block of ResNet.
+ """
+ def __init__(self, in_ch, out_ch, stride,kernel_size, padding, downsample):
+ super(_Bottleneck, self).__init__()
+ self.conv1 = _ConvBnReLU(in_ch, out_ch, kernel_size,padding, stride=stride)
+ self.conv2 = _ConvBnReLU(out_ch, out_ch, kernel_size, padding)
+ self.shortcut = (
+ _ConvBnReLU(in_ch, out_ch, 1, 0,stride=stride) if downsample else lambda x: x # identity #把第一个块通道数加倍,宽和高减半,然后与卷积层相加
+ )
+
+ def forward(self, x):
+ h = self.conv1(x)
+ h = self.conv2(h)
+ h += self.shortcut(x)
+ return F.relu(h)
+
+class _ResLayer(nn.Sequential):
+ def __init__(self,in_ch,out_ch,kernel_size,padding,stride,n_layers):
+ super(_ResLayer, self).__init__()
+ for i in range(n_layers):
+ self.add_module(
+ "block{}".format(i + 1),
+ _Bottleneck(
+ in_ch=(in_ch if i == 0 else out_ch),
+ out_ch=out_ch,
+ stride=(stride if i == 0 else 1),
+ kernel_size=kernel_size,
+ padding=padding,
+ downsample=(True if i == 0 else False),
+ ),
+ )
+
+class ResUNet(nn.Module):
+ def __init__(self):
+ super(ResUNet, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+ self.feature = _conv_block(1,16,kernel_size=17,padding=8)
+
+ self.encoder1 = _ResLayer(in_ch=16,out_ch=32,kernel_size=35,padding=17,stride=2,n_layers=4)
+ self.encoder2 = _ResLayer(in_ch=32,out_ch=64,kernel_size=35,padding=17,stride=2,n_layers=4)
+ self.encoder3 = _ResLayer(in_ch=64,out_ch=128,kernel_size=35,padding=17,stride=2,n_layers=4)
+
+
+
+ self.up3 = up_conv(128,64,kernel_size=35,padding=17)
+ self.decoder3 = _conv_block(128,64,kernel_size=35,padding=17)
+
+ self.up2 = up_conv(64,32,kernel_size=35,padding=17)
+ self.decoder2 = _conv_block(64,32,kernel_size=35,padding=17)
+
+ self.up1 = up_conv(32,16,kernel_size=35,padding=17)
+ self.decoder1 = _conv_block(32,16,kernel_size=35,padding=17)
+
+ self.detection = nn.Sequential(
+ nn.Dropout(0.3),
+ _ConvBnReLU(16,1,kernel_size=1,padding=0,stride=1,bn=False)
+ )
+
+ def forward(self,x):
+ x = self.norm(x)
+
+ out1 = self.feature(x)
+ out2 = self.encoder1(out1)
+ out3 = self.encoder2(out2)
+ out4 = self.encoder3(out3)
+
+ up3 = self.up3(out4)
+ up3 = torch.cat([up3, out3], dim=1)
+ up2 = self.up2(self.decoder3(up3))
+ up2 = torch.cat([up2, out2], dim=1)
+ up1 = self.up1(self.decoder2(up2))
+ up1 = torch.cat([up1, out1], dim=1)
+ up1 = self.decoder1(up1)
+
+ result = self.detection(up1)
+
+ return result
+
+class _MultiKernelLayer(nn.Module):
+ def __init__(self,in_ch,out_ch,kernel_size,padding):
+ super(_MultiKernelLayer, self).__init__()
+ self.MultiKernel = nn.Module()
+ for k,p in zip(kernel_size,padding):
+ self.MultiKernel.add_module(
+ "k{}".format(k),
+ nn.Sequential(
+ _ConvBnReLU(in_ch,out_ch,kernel_size=k,padding=p),
+ _ConvBnReLU(out_ch, out_ch, kernel_size=k, padding=p),
+ )
+ )
+ def forward(self,x):
+ return torch.cat( [conv(x) for conv in self.MultiKernel.children()],dim=1 )
+
+class DUNet(nn.Module):
+ def __init__(self):
+ super(DUNet, self).__init__()
+ self.encoder1 = _MultiKernelLayer(1, 16 , kernel_size=[3,11,21,31],padding=[1,5,10,15])
+ self.down1 = nn.MaxPool1d(kernel_size=2)
+ self.encoder2 = _MultiKernelLayer(64,64,kernel_size=[3,11,21,31],padding=[1,5,10,15])
+ self.down2 = nn.MaxPool1d(kernel_size=2)
+ self.encoder3 = _MultiKernelLayer(256, 256, kernel_size=[3, 11, 21, 31], padding=[1, 5, 10, 15])
+ self.down3 = nn.MaxPool1d(kernel_size=2)
+
+ self.classify = _Bottleneck(in_ch=1024, out_ch=1024,kernel_size=7,padding=3,stride=1,downsample=True)
+
+ self.up3 = nn.Upsample(scale_factor=2,mode='linear',align_corners=True)
+ self.decoder3 = nn.Sequential(
+ _ConvBnReLU(2048, 256, kernel_size=31, padding=15),
+ _ConvBnReLU(256, 256, kernel_size=31, padding=15),
+ )
+ self.up2 = nn.Upsample(scale_factor=2,mode='linear',align_corners=True)
+ self.decoder2 = nn.Sequential(
+ _ConvBnReLU(512, 64, kernel_size=31, padding=15),
+ _ConvBnReLU(64, 64, kernel_size=31, padding=15),
+ )
+ self.up1 = nn.Upsample(scale_factor=2,mode='linear',align_corners=True)
+ self.decoder1 = nn.Sequential(
+ _ConvBnReLU(128, 64, kernel_size=31, padding=15),
+ _ConvBnReLU(64, 64, kernel_size=31, padding=15),
+ )
+
+ self.outconv = nn.Conv1d(64,1,kernel_size=1)
+
+ def forward(self,x):
+ x1 = self.encoder1(x)
+ x2 = self.encoder2(self.down1(x1))
+ x3 = self.encoder3(self.down2(x2))
+
+ x4 = self.classify(self.down3(x3))
+
+ x = torch.cat([self.up3(x4),x3],dim=1)
+ x = self.decoder3(x)
+ x = torch.cat([self.up2(x),x2],dim=1)
+ x = self.decoder2(x)
+ x = torch.cat([self.up1(x),x1],dim=1)
+ x = self.decoder1(x)
+
+ out = self.outconv(x)
+ return out
+
+class LSTM_UNet(nn.Module):
+
+ def __init__(self):
+ super(LSTM_UNet, self).__init__()
+ self.stem = nn.BatchNorm1d(1)
+ self.lstm1 = nn.LSTM(input_size=1,hidden_size=16, bidirectional=True)
+ self.lstm2 = nn.LSTM(input_size=2,hidden_size=32, bidirectional=True)
+ self.lstm3 = nn.LSTM(input_size=4,hidden_size=64, bidirectional=True)
+ self.lstm4 = nn.LSTM(input_size=8,hidden_size=128,bidirectional=True)
+
+ self.up3 = nn.Sequential(
+ nn.Upsample(scale_factor=2,mode='linear',align_corners=False),
+ nn.Conv1d(256,128,kernel_size=1),
+ )
+ self.decoder3 = nn.Sequential(
+ _ConvBnReLU(256,128,kernel_size=11,padding=5),
+ _ConvBnReLU(128, 128, kernel_size=11, padding=5),
+ )
+ self.up2 = nn.Sequential(
+ nn.Upsample(scale_factor=2, mode='linear', align_corners=False),
+ nn.Conv1d(128, 64, kernel_size=1),
+ )
+ self.decoder2 = nn.Sequential(
+ _ConvBnReLU(128, 64, kernel_size=11, padding=5),
+ _ConvBnReLU(64, 64, kernel_size=11, padding=5),
+ )
+ self.up1 = nn.Sequential(
+ nn.Upsample(scale_factor=2, mode='linear', align_corners=False),
+ nn.Conv1d(64, 32, kernel_size=1),
+ )
+ self.decoder1 = nn.Sequential(
+ _ConvBnReLU(64, 32, kernel_size=11, padding=5),
+ _ConvBnReLU(32, 32, kernel_size=11, padding=5),
+ )
+
+ self.output = nn.Conv1d(32,1,kernel_size=1)
+
+ def forward(self,x):
+ x = self.stem(x)
+ x1,(h_h,hc) = self.lstm1(x.view(-1, 1000, 1))
+ x2,(h_h,hc) = self.lstm2(x.view(-1, 500, 2))
+ x3,(h_h,hc) = self.lstm3(x.view(-1, 250, 4))
+ x4,(h_h,hc) = self.lstm4(x.view(-1, 125, 8))
+
+ x1 = x1.permute((0, 2, 1))
+ x2 = x2.permute((0, 2, 1))
+ x3 = x3.permute((0, 2, 1))
+ x4 = x4.permute((0, 2, 1))
+
+ x4 = self.up3(x4)
+ x3 = torch.cat([x4,x3],dim=1)
+ x3 = self.decoder3(x3)
+ x3 = self.up2(x3)
+ x2 = torch.cat([x3,x2],dim=1)
+ x2 = self.decoder2(x2)
+ x2 = self.up1(x2)
+ x1 = torch.cat([x2,x1],dim=1)
+ x1 = self.decoder1(x1)
+
+ out = self.output(x1)
+
+ return out
+
+
+class Recurrent_block(nn.Module):
+ def __init__(self, ch_out,kernel_size,padding,stride=1,t=2):
+ super(Recurrent_block, self).__init__()
+ self.t = t
+ self.ch_out = ch_out
+ self.conv = nn.Sequential(
+ nn.Conv1d(ch_out, ch_out, kernel_size=kernel_size, stride=stride, padding=padding, bias=True),
+ nn.BatchNorm1d(ch_out),
+ nn.ReLU(inplace=True)
+ )
+
+ def forward(self, x):
+ for i in range(self.t):
+
+ if i == 0:
+ x1 = self.conv(x)
+
+ x1 = self.conv(x + x1)
+ return x1
+
+class RRCNN_block(nn.Module):
+ def __init__(self, ch_in, ch_out,kernel_size,padding,stride=1, t=2):
+ super(RRCNN_block, self).__init__()
+ self.RCNN = nn.Sequential(
+ Recurrent_block(ch_out,kernel_size=kernel_size,padding=padding, stride=stride,t=t),
+ Recurrent_block(ch_out,kernel_size=kernel_size,padding=padding, stride=stride,t=t)
+ )
+ self.Conv_1x1 = nn.Conv1d(ch_in, ch_out, kernel_size=1, stride=1, padding=0)
+
+ def forward(self, x):
+ x = self.Conv_1x1(x)
+ x1 = self.RCNN(x)
+ return x + x1
+
+class R2U_Net(nn.Module):
+ def __init__(self, t=2):
+ super(R2U_Net, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+
+ self.Maxpool = nn.MaxPool1d(kernel_size=2, stride=2)
+
+ self.RRCNN1 = RRCNN_block(1,64,kernel_size=35,padding=17, t=t)
+
+ self.RRCNN2 = RRCNN_block(64, 128, kernel_size=35,padding=17,t=t)
+
+ self.RRCNN3 = RRCNN_block(128, 256, kernel_size=35,padding=17,t=t)
+
+ self.RRCNN4 = RRCNN_block(256, 512, kernel_size=35,padding=17,t=t)
+
+
+ self.Up4 = up_conv(ch_in=512, ch_out=256,kernel_size=35,padding=17)
+ self.Up_RRCNN4 = RRCNN_block(ch_in=512, ch_out=256,kernel_size=35,padding=17, t=t)
+
+ self.Up3 = up_conv(ch_in=256, ch_out=128,kernel_size=35,padding=17)
+ self.Up_RRCNN3 = RRCNN_block(ch_in=256, ch_out=128,kernel_size=35,padding=17, t=t)
+
+ self.Up2 = up_conv(ch_in=128, ch_out=64,kernel_size=35,padding=17)
+ self.Up_RRCNN2 = RRCNN_block(ch_in=128, ch_out=64,kernel_size=35,padding=17, t=t)
+
+ self.Conv_1x1 = nn.Conv1d(64, 1, kernel_size=1, stride=1, padding=0)
+
+ def forward(self, x):
+ # encoding path
+ x = self.norm(x)
+ x1 = self.RRCNN1(x)
+
+ x2 = self.Maxpool(x1)
+ x2 = self.RRCNN2(x2)
+
+ x3 = self.Maxpool(x2)
+ x3 = self.RRCNN3(x3)
+
+ x4 = self.Maxpool(x3)
+ x4 = self.RRCNN4(x4)
+
+
+ # decoding + concat path
+ d4 = self.Up4(x4)
+ d4 = torch.cat((x3, d4), dim=1)
+ d4 = self.Up_RRCNN4(d4)
+
+ d3 = self.Up3(d4)
+ d3 = torch.cat((x2, d3), dim=1)
+ d3 = self.Up_RRCNN3(d3)
+
+ d2 = self.Up2(d3)
+ d2 = torch.cat((x1, d2), dim=1)
+ d2 = self.Up_RRCNN2(d2)
+
+ d1 = self.Conv_1x1(d2)
+
+ return d1
+
+
+class Attention_block(nn.Module):
+ def __init__(self, F_g, F_l, F_int):
+ super(Attention_block, self).__init__()
+ self.W_g = nn.Sequential(
+ nn.Conv1d(F_g, F_int, kernel_size=1, stride=1, padding=0, bias=True),
+ nn.BatchNorm1d(F_int)
+ )
+
+ self.W_x = nn.Sequential(
+ nn.Conv1d(F_l, F_int, kernel_size=1, stride=1, padding=0, bias=True),
+ nn.BatchNorm1d(F_int)
+ )
+
+ self.psi = nn.Sequential(
+ nn.Conv1d(F_int, 1, kernel_size=1, stride=1, padding=0, bias=True),
+ nn.BatchNorm1d(1),
+ nn.Sigmoid()
+ )
+
+ self.relu = nn.ReLU(inplace=True)
+
+ def forward(self, g, x):
+ g1 = self.W_g(g)
+ x1 = self.W_x(x)
+ psi = self.relu(g1 + x1)
+ psi = self.psi(psi)
+
+ return x * psi
+
+
+class AttU_Net(nn.Module):
+ def __init__(self):
+ super(AttU_Net, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+
+ self.Maxpool = nn.MaxPool1d(kernel_size=2, stride=2)
+
+ self.Conv1 = _conv_block(1, 64,kernel_size=17,padding=8) #原来为35 17
+ self.Conv2 = _conv_block(64, 128,kernel_size=17,padding=8)
+ self.Conv3 = _conv_block(128, 256,kernel_size=17,padding=8)
+ self.Conv4 = _conv_block(256, 512,kernel_size=17,padding=8)
+
+
+ self.Up4 = up_conv(ch_in=512, ch_out=256,kernel_size=17,padding=8)
+ self.Att4 = Attention_block(F_g=256, F_l=256, F_int=128)
+ self.Up_conv4 = _conv_block(512, 256,kernel_size=17,padding=8)
+
+ self.Up3 = up_conv(ch_in=256, ch_out=128,kernel_size=17,padding=8)
+ self.Att3 = Attention_block(F_g=128, F_l=128, F_int=64)
+ self.Up_conv3 = _conv_block(256, 128,kernel_size=17,padding=8)
+
+ self.Up2 = up_conv(ch_in=128, ch_out=64,kernel_size=17,padding=8)
+ self.Att2 = Attention_block(F_g=64, F_l=64, F_int=32)
+ self.Up_conv2 = _conv_block(128, 64,kernel_size=17,padding=8)
+
+ self.Conv_1x1 = nn.Conv1d(64, 1, kernel_size=1, stride=1, padding=0)
+
+ def forward(self, x):
+ # encoding path
+ x = self.norm(x)
+ x1 = self.Conv1(x)
+
+ x2 = self.Maxpool(x1)
+ x2 = self.Conv2(x2)
+
+ x3 = self.Maxpool(x2)
+ x3 = self.Conv3(x3)
+
+ x4 = self.Maxpool(x3)
+ x4 = self.Conv4(x4)
+
+ # decoding + concat path
+
+ d4 = self.Up4(x4)
+ x3 = self.Att4(g=d4, x=x3)
+ d4 = torch.cat((x3, d4), dim=1)
+ d4 = self.Up_conv4(d4)
+
+ d3 = self.Up3(d4)
+ x2 = self.Att3(g=d3, x=x2)
+ d3 = torch.cat((x2, d3), dim=1)
+ d3 = self.Up_conv3(d3)
+
+ d2 = self.Up2(d3)
+ x1 = self.Att2(g=d2, x=x1)
+ d2 = torch.cat((x1, d2), dim=1)
+ d2 = self.Up_conv2(d2)
+
+ d1 = self.Conv_1x1(d2)
+
+ return d1
+
+
+class R2AttU_Net(nn.Module):
+ def __init__(self, t=2):
+ super(R2AttU_Net, self).__init__()
+ self.norm = nn.BatchNorm1d(1)
+
+ self.Maxpool = nn.MaxPool1d(kernel_size=2, stride=2)
+ self.Upsample = nn.Upsample(scale_factor=2)
+
+ self.RRCNN1 = RRCNN_block(1, 64, kernel_size=17,padding=8,t=t)
+ self.RRCNN2 = RRCNN_block(64, 128, kernel_size=17,padding=8, t=t)
+ self.RRCNN3 = RRCNN_block(128, 256,kernel_size=17,padding=8, t=t)
+ self.RRCNN4 = RRCNN_block(256, 512,kernel_size=17,padding=8, t=t)
+
+
+ self.Up4 = up_conv(ch_in=512, ch_out=256,kernel_size=17,padding=8)
+ self.Att4 = Attention_block(F_g=256, F_l=256, F_int=128)
+ self.Up_RRCNN4 = RRCNN_block(512, 256,kernel_size=17,padding=8, t=t)
+
+ self.Up3 = up_conv(ch_in=256, ch_out=128,kernel_size=17,padding=8)
+ self.Att3 = Attention_block(F_g=128, F_l=128, F_int=64)
+ self.Up_RRCNN3 = RRCNN_block(256, 128,kernel_size=17,padding=8, t=t)
+
+ self.Up2 = up_conv(ch_in=128, ch_out=64,kernel_size=17,padding=8,)
+ self.Att2 = Attention_block(F_g=64, F_l=64, F_int=32)
+ self.Up_RRCNN2 = RRCNN_block(128, 64,kernel_size=17,padding=8, t=t)
+
+ self.Conv_1x1 = nn.Conv1d(64, 1, kernel_size=1, stride=1, padding=0)
+
+ def forward(self, x):
+ # encoding path
+ x = self.norm(x)
+ x1 = self.RRCNN1(x)
+
+ x2 = self.Maxpool(x1)
+ x2 = self.RRCNN2(x2)
+
+ x3 = self.Maxpool(x2)
+ x3 = self.RRCNN3(x3)
+
+ x4 = self.Maxpool(x3)
+ x4 = self.RRCNN4(x4)
+
+
+ # decoding + concat path
+ d4 = self.Up4(x4)
+ x3 = self.Att4(g=d4, x=x3)
+ d4 = torch.cat((x3, d4), dim=1)
+ d4 = self.Up_RRCNN4(d4)
+
+ d3 = self.Up3(d4)
+ x2 = self.Att3(g=d3, x=x2)
+ d3 = torch.cat((x2, d3), dim=1)
+ d3 = self.Up_RRCNN3(d3)
+
+ d2 = self.Up2(d3)
+ x1 = self.Att2(g=d2, x=x1)
+ d2 = torch.cat((x1, d2), dim=1)
+ d2 = self.Up_RRCNN2(d2)
+
+ d1 = self.Conv_1x1(d2)
+
+ return d1
+
+#
+# from torchsummary import summary
+# # print(torch.cuda.is_available())
+#
+# X = torch.randn((16,1,1000)).cuda()
+# model = Fourlayer_Unetplusplus().cuda()
+# y = model(X)
+# print(y.shape)
+# summary(model, (1,1000)) ###查看每一层的输出shape,以及模型的大小等参数
+
+#
+# X = torch.randn((16,3,256,256)).cuda()
+# model = resnet34().cuda()
+# y = model(X)
+# print(y.shape)
+# summary(model, (3,1000,1000)) ###查看每一层的输出shape,以及模型的大小等参数
+
diff --git a/Deep_Model/__init__.py b/Deep_Model/__init__.py
new file mode 100644
index 0000000..fe6c7ec
--- /dev/null
+++ b/Deep_Model/__init__.py
@@ -0,0 +1 @@
+from .Unet import Unet,ResUNet,DUNet,LSTM_UNet,R2U_Net,AttU_Net,R2AttU_Net,Unet_lstm,deep_Unet,Fivelayer_Unet,Fourlayer_LUnet,Sixlayer_Unet,Threelayer_Unet,Sixlayer_Lstm_Unet,Fivelayer_Lstm_Unet,Fourlayer_Lstm_Unet
diff --git a/MainWindow.py b/MainWindow.py
deleted file mode 100644
index e47eb0b..0000000
--- a/MainWindow.py
+++ /dev/null
@@ -1,699 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'MainWindow.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.9
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1920, 1187)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
- self.gridLayout.setObjectName("gridLayout")
- self.gridLayout_left = QtWidgets.QGridLayout()
- self.gridLayout_left.setObjectName("gridLayout_left")
- self.groupBox_func_select = QtWidgets.QGroupBox(self.centralwidget)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_func_select.setFont(font)
- self.groupBox_func_select.setObjectName("groupBox_func_select")
- self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_func_select)
- self.gridLayout_2.setObjectName("gridLayout_2")
- spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.gridLayout_2.addItem(spacerItem, 6, 1, 1, 2)
- spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
- self.gridLayout_2.addItem(spacerItem1, 0, 3, 9, 1)
- self.pushButton_detect_Rpeaks = QtWidgets.QPushButton(self.groupBox_func_select)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Rpeaks.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(24)
- self.pushButton_detect_Rpeaks.setFont(font)
- self.pushButton_detect_Rpeaks.setObjectName("pushButton_detect_Rpeaks")
- self.gridLayout_2.addWidget(self.pushButton_detect_Rpeaks, 5, 1, 1, 2)
- spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.gridLayout_2.addItem(spacerItem2, 2, 1, 1, 2)
- spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.gridLayout_2.addItem(spacerItem3, 4, 1, 1, 2)
- spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.gridLayout_2.addItem(spacerItem4, 0, 1, 1, 2)
- self.pushButton_detect_Jpeaks = QtWidgets.QPushButton(self.groupBox_func_select)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Jpeaks.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Jpeaks.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(24)
- self.pushButton_detect_Jpeaks.setFont(font)
- self.pushButton_detect_Jpeaks.setObjectName("pushButton_detect_Jpeaks")
- self.gridLayout_2.addWidget(self.pushButton_detect_Jpeaks, 7, 1, 1, 2)
- self.pushButton_rootpath_open = QtWidgets.QPushButton(self.groupBox_func_select)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_rootpath_open.setFont(font)
- self.pushButton_rootpath_open.setObjectName("pushButton_rootpath_open")
- self.gridLayout_2.addWidget(self.pushButton_rootpath_open, 1, 2, 1, 1)
- self.pushButton_resample1000Hz = QtWidgets.QPushButton(self.groupBox_func_select)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz.sizePolicy().hasHeightForWidth())
- self.pushButton_resample1000Hz.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(24)
- self.pushButton_resample1000Hz.setFont(font)
- self.pushButton_resample1000Hz.setObjectName("pushButton_resample1000Hz")
- self.gridLayout_2.addWidget(self.pushButton_resample1000Hz, 3, 1, 1, 2)
- self.lineEdit_rootpath = QtWidgets.QLineEdit(self.groupBox_func_select)
- font = QtGui.QFont()
- font.setFamily("Times New Roman")
- font.setPointSize(14)
- self.lineEdit_rootpath.setFont(font)
- self.lineEdit_rootpath.setObjectName("lineEdit_rootpath")
- self.gridLayout_2.addWidget(self.lineEdit_rootpath, 1, 1, 1, 1)
- spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
- self.gridLayout_2.addItem(spacerItem5, 0, 0, 9, 1)
- spacerItem6 = QtWidgets.QSpacerItem(518, 57, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.gridLayout_2.addItem(spacerItem6, 8, 1, 1, 2)
- self.gridLayout_2.setColumnStretch(0, 2)
- self.gridLayout_2.setRowStretch(0, 2)
- self.gridLayout_2.setRowStretch(1, 2)
- self.gridLayout_2.setRowStretch(2, 2)
- self.gridLayout_2.setRowStretch(3, 3)
- self.gridLayout_2.setRowStretch(4, 2)
- self.gridLayout_2.setRowStretch(5, 3)
- self.gridLayout_2.setRowStretch(6, 2)
- self.gridLayout_2.setRowStretch(7, 3)
- self.gridLayout_2.setRowStretch(8, 2)
- self.gridLayout_left.addWidget(self.groupBox_func_select, 0, 1, 1, 1)
- self.gridLayout.addLayout(self.gridLayout_left, 0, 0, 1, 1)
- self.verticalLayout_right = QtWidgets.QVBoxLayout()
- self.verticalLayout_right.setObjectName("verticalLayout_right")
- self.groupBox_plot = QtWidgets.QGroupBox(self.centralwidget)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_plot.setFont(font)
- self.groupBox_plot.setObjectName("groupBox_plot")
- self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_plot)
- self.gridLayout_3.setObjectName("gridLayout_3")
- self.verticalLayout_canvas = QtWidgets.QVBoxLayout()
- self.verticalLayout_canvas.setObjectName("verticalLayout_canvas")
- self.gridLayout_3.addLayout(self.verticalLayout_canvas, 0, 0, 1, 1)
- self.verticalLayout_right.addWidget(self.groupBox_plot)
- self.gridLayout.addLayout(self.verticalLayout_right, 0, 3, 1, 1)
- self.verticalLayout_middle = QtWidgets.QVBoxLayout()
- self.verticalLayout_middle.setObjectName("verticalLayout_middle")
- self.groupBox_resample1000Hz = QtWidgets.QGroupBox(self.centralwidget)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz.sizePolicy().hasHeightForWidth())
- self.groupBox_resample1000Hz.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_resample1000Hz.setFont(font)
- self.groupBox_resample1000Hz.setObjectName("groupBox_resample1000Hz")
- self.gridLayout_64 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz)
- self.gridLayout_64.setObjectName("gridLayout_64")
- self.pushButton_resample1000Hz_view = QtWidgets.QPushButton(self.groupBox_resample1000Hz)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz_view.sizePolicy().hasHeightForWidth())
- self.pushButton_resample1000Hz_view.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_resample1000Hz_view.setFont(font)
- self.pushButton_resample1000Hz_view.setObjectName("pushButton_resample1000Hz_view")
- self.gridLayout_64.addWidget(self.pushButton_resample1000Hz_view, 3, 0, 1, 1)
- self.groupBox_resample1000Hz_inputFile_check = QtWidgets.QGroupBox(self.groupBox_resample1000Hz)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz_inputFile_check.sizePolicy().hasHeightForWidth())
- self.groupBox_resample1000Hz_inputFile_check.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_resample1000Hz_inputFile_check.setFont(font)
- self.groupBox_resample1000Hz_inputFile_check.setObjectName("groupBox_resample1000Hz_inputFile_check")
- self.gridLayout_70 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz_inputFile_check)
- self.gridLayout_70.setObjectName("gridLayout_70")
- self.lineEdit_resample1000Hz_DSbcg_sig_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.lineEdit_resample1000Hz_DSbcg_sig_path.setFont(font)
- self.lineEdit_resample1000Hz_DSbcg_sig_path.setObjectName("lineEdit_resample1000Hz_DSbcg_sig_path")
- self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_DSbcg_sig_path, 3, 0, 1, 1)
- self.label_4 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_4.setFont(font)
- self.label_4.setObjectName("label_4")
- self.gridLayout_70.addWidget(self.label_4, 0, 0, 1, 1)
- self.label_6 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_6.setFont(font)
- self.label_6.setObjectName("label_6")
- self.gridLayout_70.addWidget(self.label_6, 4, 0, 1, 1)
- self.lineEdit_resample1000Hz_raw_org_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.lineEdit_resample1000Hz_raw_org_path.setFont(font)
- self.lineEdit_resample1000Hz_raw_org_path.setObjectName("lineEdit_resample1000Hz_raw_org_path")
- self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_raw_org_path, 1, 0, 1, 1)
- self.label_5 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_5.setFont(font)
- self.label_5.setObjectName("label_5")
- self.gridLayout_70.addWidget(self.label_5, 2, 0, 1, 1)
- self.lineEdit_resample1000Hz_save_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.lineEdit_resample1000Hz_save_path.setFont(font)
- self.lineEdit_resample1000Hz_save_path.setObjectName("lineEdit_resample1000Hz_save_path")
- self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_save_path, 5, 0, 1, 1)
- self.gridLayout_64.addWidget(self.groupBox_resample1000Hz_inputFile_check, 0, 0, 1, 2)
- self.pushButton_resample1000Hz_save = QtWidgets.QPushButton(self.groupBox_resample1000Hz)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz_save.sizePolicy().hasHeightForWidth())
- self.pushButton_resample1000Hz_save.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_resample1000Hz_save.setFont(font)
- self.pushButton_resample1000Hz_save.setObjectName("pushButton_resample1000Hz_save")
- self.gridLayout_64.addWidget(self.pushButton_resample1000Hz_save, 3, 1, 1, 1)
- self.groupBox_resample1000Hz_input_args = QtWidgets.QGroupBox(self.groupBox_resample1000Hz)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz_input_args.sizePolicy().hasHeightForWidth())
- self.groupBox_resample1000Hz_input_args.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_resample1000Hz_input_args.setFont(font)
- self.groupBox_resample1000Hz_input_args.setObjectName("groupBox_resample1000Hz_input_args")
- self.gridLayout_71 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz_input_args)
- self.gridLayout_71.setObjectName("gridLayout_71")
- self.lineEdit_resample1000Hz_original_sampling_rate = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_resample1000Hz_original_sampling_rate.setFont(font)
- self.lineEdit_resample1000Hz_original_sampling_rate.setPlaceholderText("")
- self.lineEdit_resample1000Hz_original_sampling_rate.setObjectName("lineEdit_resample1000Hz_original_sampling_rate")
- self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_original_sampling_rate, 0, 1, 1, 1)
- self.label_3 = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_3.setFont(font)
- self.label_3.setObjectName("label_3")
- self.gridLayout_71.addWidget(self.label_3, 1, 0, 1, 1)
- self.lineEdit_resample1000Hz_target_sampling_rate = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_resample1000Hz_target_sampling_rate.setFont(font)
- self.lineEdit_resample1000Hz_target_sampling_rate.setPlaceholderText("")
- self.lineEdit_resample1000Hz_target_sampling_rate.setObjectName("lineEdit_resample1000Hz_target_sampling_rate")
- self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_target_sampling_rate, 1, 1, 1, 1)
- self.label_2 = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_2.setFont(font)
- self.label_2.setObjectName("label_2")
- self.gridLayout_71.addWidget(self.label_2, 0, 0, 1, 1)
- self.label = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label.setFont(font)
- self.label.setObjectName("label")
- self.gridLayout_71.addWidget(self.label, 2, 0, 1, 1)
- self.lineEdit_resample1000Hz_cut_second = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_resample1000Hz_cut_second.setFont(font)
- self.lineEdit_resample1000Hz_cut_second.setPlaceholderText("")
- self.lineEdit_resample1000Hz_cut_second.setObjectName("lineEdit_resample1000Hz_cut_second")
- self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_cut_second, 2, 1, 1, 1)
- self.gridLayout_64.addWidget(self.groupBox_resample1000Hz_input_args, 1, 0, 1, 2)
- self.gridLayout_64.setColumnStretch(0, 1)
- self.gridLayout_64.setColumnStretch(1, 1)
- self.gridLayout_64.setRowStretch(0, 5)
- self.gridLayout_64.setRowStretch(1, 4)
- self.gridLayout_64.setRowStretch(2, 5)
- self.gridLayout_64.setRowStretch(3, 2)
- self.pushButton_resample1000Hz_view.raise_()
- self.pushButton_resample1000Hz_save.raise_()
- self.groupBox_resample1000Hz_input_args.raise_()
- self.groupBox_resample1000Hz_inputFile_check.raise_()
- self.verticalLayout_middle.addWidget(self.groupBox_resample1000Hz)
- self.groupBox_detect_Rpeaks = QtWidgets.QGroupBox(self.centralwidget)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks.sizePolicy().hasHeightForWidth())
- self.groupBox_detect_Rpeaks.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_detect_Rpeaks.setFont(font)
- self.groupBox_detect_Rpeaks.setObjectName("groupBox_detect_Rpeaks")
- self.gridLayout_67 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks)
- self.gridLayout_67.setObjectName("gridLayout_67")
- self.groupBox_detect_Rpeaks_inputFile_check = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_inputFile_check.sizePolicy().hasHeightForWidth())
- self.groupBox_detect_Rpeaks_inputFile_check.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_detect_Rpeaks_inputFile_check.setFont(font)
- self.groupBox_detect_Rpeaks_inputFile_check.setObjectName("groupBox_detect_Rpeaks_inputFile_check")
- self.gridLayout_72 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_inputFile_check)
- self.gridLayout_72.setObjectName("gridLayout_72")
- self.lineEdit_detect_Rpeaks_filter_ecg_path = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.lineEdit_detect_Rpeaks_filter_ecg_path.setFont(font)
- self.lineEdit_detect_Rpeaks_filter_ecg_path.setObjectName("lineEdit_detect_Rpeaks_filter_ecg_path")
- self.gridLayout_72.addWidget(self.lineEdit_detect_Rpeaks_filter_ecg_path, 1, 0, 1, 1)
- self.label_7 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_7.setFont(font)
- self.label_7.setObjectName("label_7")
- self.gridLayout_72.addWidget(self.label_7, 0, 0, 1, 1)
- self.textBrowser = QtWidgets.QTextBrowser(self.groupBox_detect_Rpeaks_inputFile_check)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.textBrowser.sizePolicy().hasHeightForWidth())
- self.textBrowser.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(12)
- self.textBrowser.setFont(font)
- self.textBrowser.setStyleSheet("background-color: rgb(85, 255, 255);")
- self.textBrowser.setObjectName("textBrowser")
- self.gridLayout_72.addWidget(self.textBrowser, 4, 0, 1, 1)
- self.label_8 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_8.setFont(font)
- self.label_8.setObjectName("label_8")
- self.gridLayout_72.addWidget(self.label_8, 2, 0, 1, 1)
- self.lineEdit_detect_Rpeaks_save_path = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_inputFile_check)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.lineEdit_detect_Rpeaks_save_path.setFont(font)
- self.lineEdit_detect_Rpeaks_save_path.setObjectName("lineEdit_detect_Rpeaks_save_path")
- self.gridLayout_72.addWidget(self.lineEdit_detect_Rpeaks_save_path, 3, 0, 1, 1)
- self.gridLayout_72.setRowStretch(0, 1)
- self.gridLayout_72.setRowStretch(1, 1)
- self.gridLayout_72.setRowStretch(2, 1)
- self.gridLayout_72.setRowStretch(3, 1)
- self.gridLayout_72.setRowStretch(4, 2)
- self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_inputFile_check, 0, 0, 1, 2)
- self.pushButton_detect_Rpeaks_save = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_save.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Rpeaks_save.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_detect_Rpeaks_save.setFont(font)
- self.pushButton_detect_Rpeaks_save.setObjectName("pushButton_detect_Rpeaks_save")
- self.gridLayout_67.addWidget(self.pushButton_detect_Rpeaks_save, 3, 1, 1, 1)
- self.pushButton_detect_Rpeaks_view = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_view.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Rpeaks_view.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_detect_Rpeaks_view.setFont(font)
- self.pushButton_detect_Rpeaks_view.setObjectName("pushButton_detect_Rpeaks_view")
- self.gridLayout_67.addWidget(self.pushButton_detect_Rpeaks_view, 3, 0, 1, 1)
- self.groupBox_detect_Rpeaks_input_args = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_input_args.sizePolicy().hasHeightForWidth())
- self.groupBox_detect_Rpeaks_input_args.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_detect_Rpeaks_input_args.setFont(font)
- self.groupBox_detect_Rpeaks_input_args.setObjectName("groupBox_detect_Rpeaks_input_args")
- self.gridLayout_73 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_input_args)
- self.gridLayout_73.setObjectName("gridLayout_73")
- self.radioButton_detector_method_Wt = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.radioButton_detector_method_Wt.setFont(font)
- self.radioButton_detector_method_Wt.setObjectName("radioButton_detector_method_Wt")
- self.gridLayout_73.addWidget(self.radioButton_detector_method_Wt, 6, 0, 1, 1)
- self.label_9 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_9.setFont(font)
- self.label_9.setObjectName("label_9")
- self.gridLayout_73.addWidget(self.label_9, 0, 0, 1, 1)
- self.lineEdit_detect_Rpeaks_bandpass_low = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_detect_Rpeaks_bandpass_low.setFont(font)
- self.lineEdit_detect_Rpeaks_bandpass_low.setPlaceholderText("")
- self.lineEdit_detect_Rpeaks_bandpass_low.setObjectName("lineEdit_detect_Rpeaks_bandpass_low")
- self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_bandpass_low, 2, 1, 1, 1)
- self.radioButton_detector_method_ta = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.radioButton_detector_method_ta.setFont(font)
- self.radioButton_detector_method_ta.setObjectName("radioButton_detector_method_ta")
- self.gridLayout_73.addWidget(self.radioButton_detector_method_ta, 4, 1, 1, 3)
- self.label_11 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_11.setFont(font)
- self.label_11.setObjectName("label_11")
- self.gridLayout_73.addWidget(self.label_11, 1, 0, 1, 1)
- self.radioButton_detector_method_Hamilton = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.radioButton_detector_method_Hamilton.setFont(font)
- self.radioButton_detector_method_Hamilton.setObjectName("radioButton_detector_method_Hamilton")
- self.gridLayout_73.addWidget(self.radioButton_detector_method_Hamilton, 6, 1, 1, 3)
- self.lineEdit_detect_Rpeaks_sampling_rate = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_detect_Rpeaks_sampling_rate.setFont(font)
- self.lineEdit_detect_Rpeaks_sampling_rate.setPlaceholderText("")
- self.lineEdit_detect_Rpeaks_sampling_rate.setObjectName("lineEdit_detect_Rpeaks_sampling_rate")
- self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_sampling_rate, 0, 1, 1, 3)
- self.label_12 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_12.setFont(font)
- self.label_12.setObjectName("label_12")
- self.gridLayout_73.addWidget(self.label_12, 2, 0, 1, 1)
- self.radioButton_detector_method_pt = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.radioButton_detector_method_pt.setFont(font)
- self.radioButton_detector_method_pt.setObjectName("radioButton_detector_method_pt")
- self.gridLayout_73.addWidget(self.radioButton_detector_method_pt, 4, 0, 1, 1)
- self.radioButton_detector_method_Engzee = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.radioButton_detector_method_Engzee.setFont(font)
- self.radioButton_detector_method_Engzee.setObjectName("radioButton_detector_method_Engzee")
- self.gridLayout_73.addWidget(self.radioButton_detector_method_Engzee, 8, 0, 1, 1)
- self.lineEdit_detect_Rpeaks_bandpass_high = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_detect_Rpeaks_bandpass_high.setFont(font)
- self.lineEdit_detect_Rpeaks_bandpass_high.setPlaceholderText("")
- self.lineEdit_detect_Rpeaks_bandpass_high.setObjectName("lineEdit_detect_Rpeaks_bandpass_high")
- self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_bandpass_high, 2, 3, 1, 1)
- self.lineEdit_detect_Rpeaks_peaks_value = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.lineEdit_detect_Rpeaks_peaks_value.setFont(font)
- self.lineEdit_detect_Rpeaks_peaks_value.setPlaceholderText("")
- self.lineEdit_detect_Rpeaks_peaks_value.setObjectName("lineEdit_detect_Rpeaks_peaks_value")
- self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_peaks_value, 1, 1, 1, 3)
- self.label_13 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_13.setFont(font)
- self.label_13.setObjectName("label_13")
- self.gridLayout_73.addWidget(self.label_13, 2, 2, 1, 1)
- self.label_10 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_10.sizePolicy().hasHeightForWidth())
- self.label_10.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.label_10.setFont(font)
- self.label_10.setObjectName("label_10")
- self.gridLayout_73.addWidget(self.label_10, 3, 0, 1, 4)
- self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_input_args, 1, 0, 1, 2)
- self.groupBox_detect_Rpeaks_signal_parts_list = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_signal_parts_list.sizePolicy().hasHeightForWidth())
- self.groupBox_detect_Rpeaks_signal_parts_list.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_detect_Rpeaks_signal_parts_list.setFont(font)
- self.groupBox_detect_Rpeaks_signal_parts_list.setObjectName("groupBox_detect_Rpeaks_signal_parts_list")
- self.gridLayout_74 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_signal_parts_list)
- self.gridLayout_74.setObjectName("gridLayout_74")
- self.pushButton_detect_Rpeaks_left = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks_signal_parts_list)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_left.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Rpeaks_left.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_detect_Rpeaks_left.setFont(font)
- self.pushButton_detect_Rpeaks_left.setObjectName("pushButton_detect_Rpeaks_left")
- self.gridLayout_74.addWidget(self.pushButton_detect_Rpeaks_left, 0, 2, 1, 1)
- self.pushButton_detect_Rpeaks_right = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks_signal_parts_list)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_right.sizePolicy().hasHeightForWidth())
- self.pushButton_detect_Rpeaks_right.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_detect_Rpeaks_right.setFont(font)
- self.pushButton_detect_Rpeaks_right.setObjectName("pushButton_detect_Rpeaks_right")
- self.gridLayout_74.addWidget(self.pushButton_detect_Rpeaks_right, 1, 2, 1, 1)
- self.tableWidget_detect_Rpeaks_signal_parts_list = QtWidgets.QTableWidget(self.groupBox_detect_Rpeaks_signal_parts_list)
- self.tableWidget_detect_Rpeaks_signal_parts_list.setColumnCount(1)
- self.tableWidget_detect_Rpeaks_signal_parts_list.setObjectName("tableWidget_detect_Rpeaks_signal_parts_list")
- self.tableWidget_detect_Rpeaks_signal_parts_list.setRowCount(0)
- self.tableWidget_detect_Rpeaks_signal_parts_list.verticalHeader().setVisible(False)
- self.gridLayout_74.addWidget(self.tableWidget_detect_Rpeaks_signal_parts_list, 0, 0, 2, 2)
- self.gridLayout_74.setColumnStretch(0, 1)
- self.gridLayout_74.setColumnStretch(1, 1)
- self.gridLayout_74.setColumnStretch(2, 1)
- self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_signal_parts_list, 2, 0, 1, 2)
- self.gridLayout_67.setRowStretch(0, 4)
- self.gridLayout_67.setRowStretch(1, 4)
- self.gridLayout_67.setRowStretch(2, 4)
- self.gridLayout_67.setRowStretch(3, 1)
- self.verticalLayout_middle.addWidget(self.groupBox_detect_Rpeaks)
- self.groupBox_detect_Jpeaks = QtWidgets.QGroupBox(self.centralwidget)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_detect_Jpeaks.sizePolicy().hasHeightForWidth())
- self.groupBox_detect_Jpeaks.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_detect_Jpeaks.setFont(font)
- self.groupBox_detect_Jpeaks.setObjectName("groupBox_detect_Jpeaks")
- self.gridLayout_69 = QtWidgets.QGridLayout(self.groupBox_detect_Jpeaks)
- self.gridLayout_69.setObjectName("gridLayout_69")
- self.pushButton_5 = QtWidgets.QPushButton(self.groupBox_detect_Jpeaks)
- self.pushButton_5.setObjectName("pushButton_5")
- self.gridLayout_69.addWidget(self.pushButton_5, 0, 0, 1, 1)
- self.gridLayout_69.setColumnStretch(0, 1)
- self.verticalLayout_middle.addWidget(self.groupBox_detect_Jpeaks)
- self.groupBox_info = QtWidgets.QGroupBox(self.centralwidget)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_info.sizePolicy().hasHeightForWidth())
- self.groupBox_info.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.groupBox_info.setFont(font)
- self.groupBox_info.setObjectName("groupBox_info")
- self.gridLayout_66 = QtWidgets.QGridLayout(self.groupBox_info)
- self.gridLayout_66.setObjectName("gridLayout_66")
- self.textBrowser_infoOutput = QtWidgets.QTextBrowser(self.groupBox_info)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(10)
- self.textBrowser_infoOutput.setFont(font)
- self.textBrowser_infoOutput.setObjectName("textBrowser_infoOutput")
- self.gridLayout_66.addWidget(self.textBrowser_infoOutput, 0, 0, 1, 2)
- self.pushButton_backToMenu = QtWidgets.QPushButton(self.groupBox_info)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton_backToMenu.sizePolicy().hasHeightForWidth())
- self.pushButton_backToMenu.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.pushButton_backToMenu.setFont(font)
- self.pushButton_backToMenu.setObjectName("pushButton_backToMenu")
- self.gridLayout_66.addWidget(self.pushButton_backToMenu, 1, 0, 1, 1)
- self.gridLayout_66.setColumnStretch(0, 1)
- self.gridLayout_66.setRowStretch(0, 4)
- self.gridLayout_66.setRowStretch(1, 1)
- self.verticalLayout_middle.addWidget(self.groupBox_info)
- self.verticalLayout_middle.setStretch(0, 8)
- self.verticalLayout_middle.setStretch(1, 5)
- self.verticalLayout_middle.setStretch(2, 8)
- self.verticalLayout_middle.setStretch(3, 3)
- self.gridLayout.addLayout(self.verticalLayout_middle, 0, 2, 1, 1)
- self.gridLayout.setColumnStretch(0, 5)
- self.gridLayout.setColumnStretch(2, 3)
- self.gridLayout.setColumnStretch(3, 15)
- MainWindow.setCentralWidget(self.centralwidget)
- self.action_selectPath = QtWidgets.QAction(MainWindow)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.action_selectPath.setFont(font)
- self.action_selectPath.setObjectName("action_selectPath")
- self.action = QtWidgets.QAction(MainWindow)
- font = QtGui.QFont()
- font.setFamily("黑体")
- font.setPointSize(14)
- self.action.setFont(font)
- self.action.setObjectName("action")
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "Heartbeat_Annotation"))
- self.groupBox_func_select.setTitle(_translate("MainWindow", "功能选择"))
- self.pushButton_detect_Rpeaks.setText(_translate("MainWindow", "ECG的R峰提取"))
- self.pushButton_detect_Jpeaks.setText(_translate("MainWindow", "BCG的J峰提取"))
- self.pushButton_rootpath_open.setText(_translate("MainWindow", "浏览"))
- self.pushButton_resample1000Hz.setText(_translate("MainWindow", "重采样至1000Hz"))
- self.lineEdit_rootpath.setPlaceholderText(_translate("MainWindow", "数据根目录"))
- self.groupBox_plot.setTitle(_translate("MainWindow", "绘图区"))
- self.groupBox_resample1000Hz.setTitle(_translate("MainWindow", "重采样至1000Hz"))
- self.pushButton_resample1000Hz_view.setText(_translate("MainWindow", "查看结果"))
- self.groupBox_resample1000Hz_inputFile_check.setTitle(_translate("MainWindow", "程序识别到的文件路径"))
- self.lineEdit_resample1000Hz_DSbcg_sig_path.setPlaceholderText(_translate("MainWindow", "DSbcg_sig.txt文件路径"))
- self.label_4.setText(_translate("MainWindow", "raw_org.txt"))
- self.label_6.setText(_translate("MainWindow", "保存路径"))
- self.lineEdit_resample1000Hz_raw_org_path.setPlaceholderText(_translate("MainWindow", "raw_org.txt文件路径"))
- self.label_5.setText(_translate("MainWindow", "DSbcg_sig.txt"))
- self.lineEdit_resample1000Hz_save_path.setPlaceholderText(_translate("MainWindow", "文件保存路径"))
- self.pushButton_resample1000Hz_save.setText(_translate("MainWindow", "保存结果"))
- self.groupBox_resample1000Hz_input_args.setTitle(_translate("MainWindow", "<重采样>参数输入"))
- self.lineEdit_resample1000Hz_original_sampling_rate.setText(_translate("MainWindow", "100"))
- self.label_3.setText(_translate("MainWindow", "目标采样率(Hz)"))
- self.lineEdit_resample1000Hz_target_sampling_rate.setText(_translate("MainWindow", "1000"))
- self.label_2.setText(_translate("MainWindow", "原始采样率(Hz)"))
- self.label.setText(_translate("MainWindow", "裁剪的时间(秒)"))
- self.groupBox_detect_Rpeaks.setTitle(_translate("MainWindow", "ECG的R峰提取"))
- self.groupBox_detect_Rpeaks_inputFile_check.setTitle(_translate("MainWindow", "程序识别到的文件路径"))
- self.lineEdit_detect_Rpeaks_filter_ecg_path.setPlaceholderText(_translate("MainWindow", "filter_ecg.txt文件路径"))
- self.label_7.setText(_translate("MainWindow", "filter_ecg.txt"))
- self.textBrowser.setHtml(_translate("MainWindow", "\n"
-"
\n"
-"将在此目录的文件夹下生成一一对应的hecg.txt和hRpeak.txt若干个
"))
- self.label_8.setText(_translate("MainWindow", "保存路径"))
- self.lineEdit_detect_Rpeaks_save_path.setPlaceholderText(_translate("MainWindow", "文件保存路径"))
- self.pushButton_detect_Rpeaks_save.setText(_translate("MainWindow", "保存结果"))
- self.pushButton_detect_Rpeaks_view.setText(_translate("MainWindow", "查看结果"))
- self.groupBox_detect_Rpeaks_input_args.setTitle(_translate("MainWindow", "参数输入"))
- self.radioButton_detector_method_Wt.setText(_translate("MainWindow", "Wt"))
- self.label_9.setText(_translate("MainWindow", "信号采样率(Hz)"))
- self.lineEdit_detect_Rpeaks_bandpass_low.setText(_translate("MainWindow", "2"))
- self.radioButton_detector_method_ta.setText(_translate("MainWindow", "ta"))
- self.label_11.setText(_translate("MainWindow", "寻峰阈值(个)"))
- self.radioButton_detector_method_Hamilton.setText(_translate("MainWindow", "Hamilton"))
- self.lineEdit_detect_Rpeaks_sampling_rate.setText(_translate("MainWindow", "1000"))
- self.label_12.setText(_translate("MainWindow", "带通滤波截止频率(Hz)"))
- self.radioButton_detector_method_pt.setText(_translate("MainWindow", "pt"))
- self.radioButton_detector_method_Engzee.setText(_translate("MainWindow", "Engzee"))
- self.lineEdit_detect_Rpeaks_bandpass_high.setText(_translate("MainWindow", "15"))
- self.lineEdit_detect_Rpeaks_peaks_value.setText(_translate("MainWindow", "200"))
- self.label_13.setText(_translate("MainWindow", "~"))
- self.label_10.setText(_translate("MainWindow", "R峰检测方法选择(一般选pt)"))
- self.groupBox_detect_Rpeaks_signal_parts_list.setTitle(_translate("MainWindow", "信号片段列表"))
- self.pushButton_detect_Rpeaks_left.setText(_translate("MainWindow", "上一个"))
- self.pushButton_detect_Rpeaks_right.setText(_translate("MainWindow", "下一个"))
- self.groupBox_detect_Jpeaks.setTitle(_translate("MainWindow", "BCG的J峰提取"))
- self.pushButton_5.setText(_translate("MainWindow", "PushButton"))
- self.groupBox_info.setTitle(_translate("MainWindow", "信息"))
- self.pushButton_backToMenu.setText(_translate("MainWindow", "返回主菜单"))
- self.action_selectPath.setText(_translate("MainWindow", "数据路径选择"))
- self.action.setText(_translate("MainWindow", "加载存档"))
diff --git a/MainWindow.ui b/MainWindow.ui
deleted file mode 100644
index f4ec68b..0000000
--- a/MainWindow.ui
+++ /dev/null
@@ -1,1058 +0,0 @@
-
-
- MainWindow
-
-
-
- 0
- 0
- 1920
- 1187
-
-
-
- Heartbeat_Annotation
-
-
-
- -
-
-
-
-
-
-
- 黑体
- 10
-
-
-
- 功能选择
-
-
-
-
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 24
-
-
-
- ECG的R峰提取
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 24
-
-
-
- BCG的J峰提取
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 浏览
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 24
-
-
-
- 重采样至1000Hz
-
-
-
- -
-
-
-
- Times New Roman
- 14
-
-
-
- 数据根目录
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 518
- 57
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- 黑体
- 10
-
-
-
- 绘图区
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- 重采样至1000Hz
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 查看结果
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- 程序识别到的文件路径
-
-
-
-
-
-
-
- 黑体
- 10
-
-
-
- DSbcg_sig.txt文件路径
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- raw_org.txt
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 保存路径
-
-
-
- -
-
-
-
- 黑体
- 10
-
-
-
- raw_org.txt文件路径
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- DSbcg_sig.txt
-
-
-
- -
-
-
-
- 黑体
- 10
-
-
-
- 文件保存路径
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 保存结果
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- <重采样>参数输入
-
-
-
-
-
-
-
- 黑体
- 14
-
-
-
- 100
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 目标采样率(Hz)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 1000
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 原始采样率(Hz)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 裁剪的时间(秒)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
-
-
-
-
-
-
-
-
- pushButton_resample1000Hz_view
- pushButton_resample1000Hz_save
- groupBox_resample1000Hz_input_args
- groupBox_resample1000Hz_inputFile_check
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- ECG的R峰提取
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- 程序识别到的文件路径
-
-
-
-
-
-
-
- 黑体
- 10
-
-
-
- filter_ecg.txt文件路径
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- filter_ecg.txt
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 12
-
-
-
- background-color: rgb(85, 255, 255);
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'黑体','黑体','黑体'; font-size:12pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'黑体','黑体';">将在此目录的文件夹下生成一一对应的hecg.txt和hRpeak.txt若干个</span></p></body></html>
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 保存路径
-
-
-
- -
-
-
-
- 黑体
- 10
-
-
-
- 文件保存路径
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 保存结果
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 查看结果
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- <R峰提取>参数输入
-
-
-
-
-
-
-
- 黑体
- 14
-
-
-
- Wt
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 信号采样率(Hz)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 2
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- ta
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 寻峰阈值(个)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- Hamilton
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 1000
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 带通滤波截止频率(Hz)
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- pt
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- Engzee
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 15
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- 200
-
-
-
-
-
-
- -
-
-
-
- 黑体
- 14
-
-
-
- ~
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- R峰检测方法选择(一般选pt)
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- 信号片段列表
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 上一个
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 下一个
-
-
-
- -
-
-
- 1
-
-
- false
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- BCG的J峰提取
-
-
-
-
-
-
- PushButton
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 10
-
-
-
- 信息
-
-
-
-
-
-
-
- 黑体
- 10
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 黑体
- 14
-
-
-
- 返回主菜单
-
-
-
-
-
-
-
-
-
-
-
-
- 数据路径选择
-
-
-
- 黑体
- 14
-
-
-
-
-
- 加载存档
-
-
-
- 黑体
- 14
-
-
-
-
-
-
-
diff --git a/detect_Jpeak.py b/detect_Jpeak.py
new file mode 100644
index 0000000..928f7f8
--- /dev/null
+++ b/detect_Jpeak.py
@@ -0,0 +1,286 @@
+"""
+测试随便一份文件结果
+"""
+
+import numpy as np
+import torch
+import torch.nn.functional as F
+
+from BCGDataset import BCG_Operation
+from Deep_Model import Unet,Fivelayer_Lstm_Unet,Fivelayer_Unet,Sixlayer_Unet
+
+modle_dic = {'Fivelayer_Unet':Fivelayer_Unet(),
+ 'Fivelayer_Lstm_Unet':Fivelayer_Lstm_Unet(),
+ 'Sixlayer_Unet':Sixlayer_Unet(),
+ 'U_net':Unet()
+}
+def evaluate(test_data, model,fs,useCPU):
+ orgBCG = test_data
+ operation = BCG_Operation()
+ # 降采样
+ orgBCG = operation.down_sample(orgBCG, down_radio=int(fs//100)).copy() #一开始没加.copy()会报错,后来加了就没事了,结果没影响
+ # plt.figure()
+ # plt.plot(orgBCG)
+ # plt.show()
+ orgBCG = orgBCG.reshape(-1, 1000)
+ # test dataset
+ orgData = torch.FloatTensor(orgBCG).unsqueeze(1)
+ # predict
+ if useCPU == True:
+ gpu = False
+ else:
+ gpu = torch.cuda.is_available()
+ if gpu:
+ orgData = orgData.cuda()
+ model.cuda()
+ with torch.no_grad():
+ y_hat = model(orgData)
+ y_prob = F.sigmoid(y_hat)
+ beat = (y_prob>0.5).float().view(-1).cpu().data.numpy()
+ beat_diff = np.diff(beat)
+ up_index = np.argwhere(beat_diff==1)
+ down_index = np.argwhere(beat_diff==-1)
+
+ return beat,up_index,down_index,y_prob
+
+def find_TPeak(data,peaks,th=50):
+ """
+ 找出真实的J峰或R峰
+ :param data: BCG或ECG数据
+ :param peaks: 初步峰值(从label中导出的location_R)
+ :param th: 范围阈值
+ :return: 真实峰值
+ """
+ return_peak = []
+ for peak in peaks:
+ if peak>len(data):continue
+ min_win,max_win = max(0,int(peak-th)),min(len(data),int(peak+th))
+ return_peak.append(np.argmax(data[min_win:max_win])+min_win)
+ return return_peak
+
+def new_calculate_beat(y,predict,th=0.5,up=10,th1=100,th2=45): #通过预测计算回原来J峰的坐标 输入:y_prob,predict=ture,up*10,降采样多少就乘多少
+ """
+ 加上不应期算法,消除误判的峰
+ :param y: 预测输出值或者标签值(label)
+ :param predict: ture or false
+ :param up: 降采样为多少就多少
+ :return: 预测的J峰位置
+ """
+ if predict:
+ beat = np.where(y>th,1,0)
+ else:
+ beat = y
+ beat_diff = np.diff(beat) #一阶差分
+ up_index = np.argwhere(beat_diff == 1).reshape(-1)
+ down_index = np.argwhere(beat_diff == -1).reshape(-1)
+ # print(up_index,down_index)
+ # print(y)
+
+ # print(y[up_index[4]+1:down_index[4]+1])
+
+ if len(up_index)==0:
+ return [0]
+ if up_index[0] > down_index[0]:
+ down_index = np.delete(down_index, 0)
+ if up_index[-1] > down_index[-1]:
+ up_index = np.delete(up_index, -1)
+
+ """
+ 加上若大于130点都没有一个心跳时,降低阈值重新判决一次,一般降到0.3就可以了;; 但是对于体动片段降低阈值可能又会造成误判,而且出现体动的话会被丢弃,间隔时间也长
+ """
+ # print("初始:",up_index.shape,down_index.shape)
+ i = 0
+ lenth1 = len(up_index)
+ while i < len(up_index)-1:
+ if abs(up_index[i+1]-up_index[i]) > th1:
+ re_prob = y[down_index[i]+15:up_index[i+1]-15] #原本按正常应该是两个都+1的,但是由于Unet输出低于0.6时,把阈值调小后会在附近一两个点也变为1,会影响判断
+ # print(re_prob.shape)
+ beat1 = np.where(re_prob > 0.1, 1, 0)
+ # print(beat1)
+ if sum(beat1) != 0 and beat1[0] != 1 and beat1[-1] != 1:
+ insert_up_index,insert_down_index = add_beat(re_prob,th=0.1)
+ # print(insert_up_index,insert_down_index,i)
+ if len(insert_up_index) > 1:
+ l = i+1
+
+ for u,d in zip(insert_up_index,insert_down_index):
+ up_index = np.insert(up_index,l,u+down_index[i]+1+15) #np.insert(arr, obj, values, axis) arr原始数组,可一可多,obj插入元素位置,values是插入内容,axis是按行按列插入。
+ down_index = np.insert(down_index,l,d+down_index[i]+1+15)
+ l = l+1
+ # print('l=', l)
+ elif len(insert_up_index) == 1:
+ # print(i)
+ up_index = np.insert(up_index,i+1,down_index[i]+insert_up_index+1+15)
+ down_index = np.insert(down_index,i+1,down_index[i]+insert_down_index+1+15)
+ i = i + len(insert_up_index) + 1
+ else:
+ i = i+1
+ continue
+ else:
+ i = i+1
+ # print("最终:",up_index.shape,down_index.shape)
+
+ """
+ 添加不应期
+ """
+ new_up_index = up_index
+ new_down_index = down_index
+ flag = 0
+ i = 0
+ lenth = len(up_index)
+ while i < lenth:
+ if abs(up_index[i+1]-up_index[i]) < th2:
+ prob_forward = y[up_index[i]+1:down_index[i]+1]
+ prob_backward = y[up_index[i+1]+1:down_index[i+1]+1]
+
+ forward_score = 0
+ back_score = 0
+
+ forward_count = down_index[i] - up_index[i]
+ back_count = down_index[i+1] - up_index[i+1]
+
+ forward_max = np.max(prob_forward)
+ back_max = np.max(prob_backward)
+
+ forward_min = np.min(prob_forward)
+ back_min = np.min(prob_backward)
+
+ forward_average = np.mean(prob_forward)
+ back_average = np.mean(prob_backward)
+
+ if forward_count > back_count:
+ forward_score = forward_score + 1
+ else:back_score = back_score + 1
+
+ if forward_max > back_max:
+ forward_score = forward_score + 1
+ else:back_score = back_score + 1
+
+ if forward_min < back_min:
+ forward_score = forward_score + 1
+ else:back_score = back_score + 1
+
+ if forward_average > back_average:
+ forward_score = forward_score + 1
+ else:back_score = back_score + 1
+
+ if forward_score >=3:
+ up_index = np.delete(up_index, i+1)
+ down_index = np.delete(down_index, i+1)
+ flag = 1
+ elif back_score >=3:
+ up_index = np.delete(up_index, i)
+ down_index = np.delete(down_index, i)
+ flag = 1
+ elif forward_score == back_score:
+ if forward_average > back_average:
+ up_index = np.delete(up_index, i + 1)
+ down_index = np.delete(down_index, i + 1)
+ flag = 1
+ else:
+ up_index = np.delete(up_index, i)
+ down_index = np.delete(down_index, i)
+ flag = 1
+ if flag == 1:
+ i = i
+ flag = 0
+ else: i = i+1
+
+ else:i = i + 1
+
+ if i > len(up_index)-2:
+ break
+ # elif abs(up_index[i+1]-up_index[i]) > 120:
+ # print("全部处理之后",up_index.shape,down_index.shape)
+ predict_J = (up_index.reshape(-1) + down_index.reshape(-1)) // 2*up
+ # predict_J = predict_J.astype(int)
+
+ return predict_J
+
+def add_beat(y,th=0.2): #通过预测计算回原来J峰的坐标 输入:y_prob,predict=ture,up*10,降采样多少就乘多少
+ """
+ :param y: 预测输出值或者标签值(label)
+ :param predict: ture or false
+ :param up: 降采样为多少就多少
+ :return: 预测的J峰位置
+ """
+ beat1 = np.where(y>th,1,0)
+ beat_diff1 = np.diff(beat1) #一阶差分
+ add_up_index = np.argwhere(beat_diff1 == 1).reshape(-1)
+ add_down_index = np.argwhere(beat_diff1 == -1).reshape(-1)
+ # print(beat1)
+ # print(add_up_index,add_down_index)
+ if len(add_up_index) > 0:
+ if add_up_index[0] > add_down_index[0]:
+ add_down_index = np.delete(add_down_index, 0)
+ if add_up_index[-1] > add_down_index[-1]:
+ add_up_index = np.delete(add_up_index, -1)
+ return add_up_index, add_down_index
+ else:
+ return 0
+
+def calculate_beat(y,predict,th=0.5,up=10): #通过预测计算回原来J峰的坐标 输入:y_prob,predict=ture,up*10,降采样多少就乘多少
+ """
+ :param y: 预测输出值或者标签值(label)
+ :param predict: ture or false
+ :param up: 降采样为多少就多少
+ :return: 预测的J峰位置
+ """
+ if predict:
+ beat = np.where(y>th,1,0)
+ else:
+ beat = y
+ beat_diff = np.diff(beat) #一阶差分
+ up_index = np.argwhere(beat_diff == 1).reshape(-1)
+ down_index = np.argwhere(beat_diff == -1).reshape(-1)
+ if len(up_index)==0:
+ return [0]
+ if up_index[0] > down_index[0]:
+ down_index = np.delete(down_index, 0)
+ if up_index[-1] > down_index[-1]:
+ up_index = np.delete(up_index, -1)
+ predict_J = (up_index.reshape(-1) + down_index.reshape(-1)) // 2*up
+ # predict_J = predict_J.astype(int)
+
+ return predict_J
+
+def Jpeak_Detection(bcg_data, detector_method, fs, low_cut, high_cut, th1, th2, th3, th4, useCPU):
+ if detector_method == "Fivelayer_Unet_1":
+ molde_name = "Fivelayer_Unet"
+ filename = 1
+ elif detector_method == "Fivelayer_Unet_2":
+ molde_name = "Fivelayer_Unet"
+ filename = 2
+ elif detector_method == "Fivelayer_Lstm_Unet_1":
+ molde_name = "Fivelayer_Lstm_Unet"
+ filename = 1
+ elif detector_method == "Fivelayer_Lstm_Unet_2":
+ molde_name = "Fivelayer_Lstm_Unet"
+ filename = 2
+
+ model_dir = "./result/" + molde_name + '/' + str(filename) + ".pkl" # 模型路径
+ # preprocessing = BCG_Operation(sample_rate=1000)
+ # BCG = preprocessing.down_sample(BCG, down_radio=int(1000 / fs))
+
+ bcg_data = bcg_data[:len(bcg_data) // (fs * 10) * fs * 10]
+
+ model = modle_dic[molde_name]
+ model.load_state_dict(torch.load(model_dir, map_location=torch.device('cpu')))
+ model.eval()
+ preprocessing = BCG_Operation(sample_rate=fs)
+ bcg = preprocessing.Butterworth(bcg_data, "bandpass", low_cut=low_cut, high_cut=high_cut, order=3) * th4
+
+ # J峰预测
+ beat, up_index, down_index, y_prob = evaluate(bcg, model=model, fs=fs, useCPU=useCPU)
+ y_prob = y_prob.cpu().reshape(-1).data.numpy()
+
+ predict_J = new_calculate_beat(y_prob, 1, th=0.6, up=fs // 100, th1=th1, th2=th2)
+
+ predict_J = find_TPeak(bcg, predict_J, th=int(th3 * fs / 1000))
+ predict_J = np.array(predict_J)
+
+ Interval = np.full(len(bcg), np.nan)
+ for i in range(len(predict_J) - 1):
+ Interval[predict_J[i]: predict_J[i + 1]] = predict_J[i + 1] - predict_J[i]
+
+ return bcg, predict_J, Interval
\ No newline at end of file
diff --git a/detect_Rpeak2.py b/detect_Rpeak.py
similarity index 96%
rename from detect_Rpeak2.py
rename to detect_Rpeak.py
index e1e0462..d0511ca 100644
--- a/detect_Rpeak2.py
+++ b/detect_Rpeak.py
@@ -9,8 +9,6 @@ import os
from BCGDataset import BCGDataset,BCG_Operation,read_all_data
import math
-def Normalize(data):
- return (data - np.min(data))/(np.max(data) - np.min(data))
def refinement( data, peak):
if len(data) == 0 or len(peak) <=2 : return None
firstPeak = peak[0]
diff --git a/heartbeat_annotation.py b/heartbeat_annotation.py
index c82728c..7a2a8e0 100644
--- a/heartbeat_annotation.py
+++ b/heartbeat_annotation.py
@@ -12,7 +12,7 @@ from time import time, strftime, localtime
import numpy as np
from PyQt5.QtGui import QFont, QDoubleValidator, QIntValidator
from matplotlib.pyplot import title
-from pandas import DataFrame, read_csv, read_excel, Series, concat
+from pandas import DataFrame, read_csv
from matplotlib.ticker import FuncFormatter
from numpy import load, nan, zeros, append, linspace, place
from matplotlib import use
@@ -20,15 +20,16 @@ from matplotlib import pyplot as plt, gridspec
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
from datetime import datetime
from pathlib import Path
-from PyQt5.QtCore import QCoreApplication, QTimer
-from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox, QButtonGroup, QApplication, QTableWidgetItem, \
- QLineEdit, QAction, QTableWidget
-from scipy import signal
-from scipy.signal import butter, filtfilt, find_peaks
+from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox, QButtonGroup, QApplication, QTableWidgetItem, QTableWidget, QWidget
-import detect_Rpeak2
import resample_1000hz
-from MainWindow import Ui_MainWindow
+import detect_Rpeak
+import detect_Jpeak
+from ui.MainWindow import Ui_MainWindow
+from ui.widget_func import Ui_widget_func
+from ui.widget_resample1000Hz import Ui_widget_resample1000Hz
+from ui.widget_detect_Rpeaks import Ui_widget_detect_Rpeaks
+from ui.widget_detect_Jpeaks import Ui_widget_detect_Jpeaks
use("Qt5Agg") # 声明使用 QT5
@@ -57,6 +58,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
data1 = None
data2 = None
data3 = None
+ data4 = None
ecg_seq = None
R_peak_seq = None
Interval_seq = None
@@ -75,37 +77,64 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.verticalLayout_canvas.addWidget(self.canvas)
self.verticalLayout_canvas.addWidget(self.figToolbar)
+ # Widget初始化
+ self.widget_func = QWidget()
+ self.ui_func = Ui_widget_func()
+ self.ui_func.setupUi(self.widget_func)
+ self.widget_resample1000Hz = QWidget()
+ self.ui_resample1000Hz = Ui_widget_resample1000Hz()
+ self.ui_resample1000Hz.setupUi(self.widget_resample1000Hz)
+ self.widget_detect_Rpeaks = QWidget()
+ self.ui_detect_Rpeaks = Ui_widget_detect_Rpeaks()
+ self.ui_detect_Rpeaks.setupUi(self.widget_detect_Rpeaks)
+ self.widget_detect_Jpeaks = QWidget()
+ self.ui_detect_Jpeaks = Ui_widget_detect_Jpeaks()
+ self.ui_detect_Jpeaks.setupUi(self.widget_detect_Jpeaks)
+
# 界面状态初始化
- self.groupBox_func_select.setVisible(True)
- self.groupBox_resample1000Hz.setVisible(False)
- self.groupBox_detect_Rpeaks.setVisible(False)
- self.groupBox_detect_Jpeaks.setVisible(False)
- self.groupBox_info.setVisible(False)
- self.groupBox_plot.setVisible(False)
- self.lineEdit_resample1000Hz_raw_org_path.setEnabled(False)
- self.lineEdit_resample1000Hz_DSbcg_sig_path.setEnabled(False)
- self.lineEdit_detect_Rpeaks_filter_ecg_path.setEnabled(False)
- self.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(False)
+ self.verticalLayout_menu.addWidget(self.widget_func)
+ self.ui_detect_Rpeaks.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(False)
+
+ # 定义验证器,用于规范lineEdit的输入内容
+ validator_double = QDoubleValidator(-1e100, 1e100, 10)
+ validator_integer = QIntValidator(-2**31, 2**31 - 1)
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_original_sampling_rate.setValidator(validator_integer)
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_target_sampling_rate.setValidator(validator_integer)
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_cut_second.setValidator(validator_integer)
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_sampling_rate.setValidator(validator_integer)
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_peaks_value.setValidator(validator_integer)
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_low.setValidator(validator_integer)
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_high.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_peaks_value.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_amp_value.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_low.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_high.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_low.setValidator(validator_integer)
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_high.setValidator(validator_integer)
# 设置表格属性
- self.tableWidget_detect_Rpeaks_signal_parts_list.setHorizontalHeaderLabels(['信号片段'])
- self.tableWidget_detect_Rpeaks_signal_parts_list.setEditTriggers(QTableWidget.NoEditTriggers)
- self.tableWidget_detect_Rpeaks_signal_parts_list.horizontalHeader().setStretchLastSection(True)
- self.tableWidget_detect_Rpeaks_signal_parts_list.horizontalHeader().setSectionResizeMode(1)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.setHorizontalHeaderLabels(['信号片段'])
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.setEditTriggers(QTableWidget.NoEditTriggers)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.horizontalHeader().setStretchLastSection(True)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.horizontalHeader().setSectionResizeMode(1)
# 槽函数连接初始化
- self.pushButton_rootpath_open.clicked.connect(self.slot_btn_rootpath_open)
- self.pushButton_resample1000Hz.clicked.connect(self.slot_btn_resample1000Hz)
- self.pushButton_detect_Rpeaks.clicked.connect(self.slot_btn_detect_Rpeaks)
- self.pushButton_detect_Jpeaks.clicked.connect(self.slot_btn_detect_Jpeaks)
+ self.ui_func.pushButton_rootpath_open.clicked.connect(self.slot_btn_rootpath_open)
+ self.ui_func.pushButton_resample1000Hz.clicked.connect(self.slot_btn_resample1000Hz)
+ self.ui_func.pushButton_detect_Rpeaks.clicked.connect(self.slot_btn_detect_Rpeaks)
+ self.ui_func.pushButton_detect_Jpeaks.clicked.connect(self.slot_btn_detect_Jpeaks)
self.pushButton_backToMenu.clicked.connect(self.slot_btn_backToMenu)
- self.pushButton_resample1000Hz_view.clicked.connect(self.slot_btn_resample1000Hz_view)
- self.pushButton_resample1000Hz_save.clicked.connect(self.slot_btn_resample1000Hz_save)
- self.pushButton_detect_Rpeaks_view.clicked.connect(self.slot_btn_detect_Rpeaks_view)
- self.pushButton_detect_Rpeaks_save.clicked.connect(self.slot_btn_detect_Rpeaks_save)
- self.pushButton_detect_Rpeaks_left.clicked.connect(self.slot_btn_detect_Rpeaks_left)
- self.pushButton_detect_Rpeaks_right.clicked.connect(self.slot_btn_detect_Rpeaks_right)
- self.tableWidget_detect_Rpeaks_signal_parts_list.cellDoubleClicked.connect(self.slot_tableWidget_detect_Rpeaks_signal_parts_list_on_cell_double_clicked)
+ self.ui_resample1000Hz.pushButton_resample1000Hz_view.clicked.connect(self.slot_btn_resample1000Hz_view)
+ self.ui_resample1000Hz.pushButton_resample1000Hz_save.clicked.connect(self.slot_btn_resample1000Hz_save)
+ self.ui_detect_Rpeaks.pushButton_detect_Rpeaks_view.clicked.connect(self.slot_btn_detect_Rpeaks_view)
+ self.ui_detect_Rpeaks.pushButton_detect_Rpeaks_save.clicked.connect(self.slot_btn_detect_Rpeaks_save)
+ self.ui_detect_Rpeaks.pushButton_detect_Rpeaks_left.clicked.connect(self.slot_btn_detect_Rpeaks_left)
+ self.ui_detect_Rpeaks.pushButton_detect_Rpeaks_right.clicked.connect(self.slot_btn_detect_Rpeaks_right)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.cellDoubleClicked.connect(self.slot_tableWidget_detect_Rpeaks_signal_parts_list_on_cell_double_clicked)
+ self.ui_detect_Jpeaks.pushButton_detect_Jpeaks_view.clicked.connect(self.slot_btn_detect_Jpeaks_view)
+ self.ui_detect_Jpeaks.pushButton_detect_Jpeaks_save.clicked.connect(self.slot_btn_detect_Jpeaks_save)
# 消息弹窗初始化
self.msgBox = QMessageBox()
@@ -113,7 +142,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def slot_btn_rootpath_open(self):
fileDialog = QFileDialog()
- if self.sender() == self.pushButton_rootpath_open:
+ if self.sender() == self.ui_func.pushButton_rootpath_open:
fileDialog.setFileMode(QFileDialog.Directory)
fileDialog.setOption(QFileDialog.ShowDirsOnly, True)
if fileDialog.exec_() == QFileDialog.Accepted:
@@ -125,7 +154,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.msgBox.setIcon(QMessageBox.Critical)
self.msgBox.exec()
return
- self.lineEdit_rootpath.setText(self.root_path)
+ self.ui_func.lineEdit_rootpath.setText(self.root_path)
self.root_path = Path(self.root_path)
info("Loading Root Path...")
else:
@@ -147,6 +176,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
return
info("Found raw_org.txt and DSbcg_sig.txt.")
+ self.widget_func.setParent(None)
+ self.verticalLayout_menu.removeWidget(self.widget_func)
+ self.verticalLayout_menu.addWidget(self.widget_resample1000Hz)
+
# 画框子图初始化
self.gs = gridspec.GridSpec(1, 1, height_ratios=[1])
self.figure.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
@@ -159,27 +192,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ax0.grid(True)
self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
- self.lineEdit_resample1000Hz_raw_org_path.setText(str(raw_org_path))
- self.lineEdit_resample1000Hz_DSbcg_sig_path.setText(str(DSbcg_sig_path))
- self.lineEdit_resample1000Hz_save_path.setText(str(self.root_path / "DSbcg_sig_1000hz3.txt"))
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_raw_org_path.setText(str(raw_org_path))
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_DSbcg_sig_path.setText(str(DSbcg_sig_path))
+ self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.setText(str(self.root_path / "DSbcg_sig_1000hz3.txt"))
self.textBrowser_update("提示:找到raw_org.txt和DSbcg_sig.txt")
self.data1 = read_csv(raw_org_path, encoding="utf-8").to_numpy()
self.data2 = read_csv(DSbcg_sig_path, encoding="utf-8", sep="\t")
- self.groupBox_func_select.setVisible(False)
- self.groupBox_resample1000Hz.setVisible(True)
- self.groupBox_info.setVisible(True)
- self.groupBox_plot.setVisible(True)
def slot_btn_resample1000Hz_view(self):
- if self.lineEdit_resample1000Hz_original_sampling_rate.text() != "" and self.lineEdit_resample1000Hz_target_sampling_rate.text() != "" and self.lineEdit_resample1000Hz_cut_second.text() != "":
+ if self.ui_resample1000Hz.lineEdit_resample1000Hz_original_sampling_rate.text() != "" and self.ui_resample1000Hz.lineEdit_resample1000Hz_target_sampling_rate.text() != "" and self.ui_resample1000Hz.lineEdit_resample1000Hz_cut_second.text() != "":
self.ax0.remove()
self.ax0 = self.figure.add_subplot(self.gs[0])
self.ax0 = plt.gca()
self.ax0.grid(True)
self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
data_before = self.data1
- data_test = resample_1000hz.upsample(self.data2.iloc[:, 2], float(self.lineEdit_resample1000Hz_original_sampling_rate.text()), float(self.lineEdit_resample1000Hz_target_sampling_rate.text()))
- data_new = resample_1000hz.upsample(self.data2.iloc[int(float(self.lineEdit_resample1000Hz_original_sampling_rate.text()) * float(self.lineEdit_resample1000Hz_cut_second.text())):, 2], float(self.lineEdit_resample1000Hz_original_sampling_rate.text()), float(self.lineEdit_resample1000Hz_target_sampling_rate.text()))
+ data_test = resample_1000hz.upsample(self.data2.iloc[:, 2], float(self.ui_resample1000Hz.lineEdit_resample1000Hz_original_sampling_rate.text()), float(self.ui_resample1000Hz.lineEdit_resample1000Hz_target_sampling_rate.text()))
+ data_new = resample_1000hz.upsample(self.data2.iloc[int(float(self.ui_resample1000Hz.lineEdit_resample1000Hz_original_sampling_rate.text()) * float(self.ui_resample1000Hz.lineEdit_resample1000Hz_cut_second.text())):, 2], float(self.ui_resample1000Hz.lineEdit_resample1000Hz_original_sampling_rate.text()), float(self.ui_resample1000Hz.lineEdit_resample1000Hz_target_sampling_rate.text()))
self.ax0.plot(data_before, 'r', label="Original Data")
self.ax0.plot(data_test + 200, 'g', label="Filtered Data")
self.ax0.plot(data_new, 'b', label="Data After Cut")
@@ -197,15 +226,17 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def slot_btn_resample1000Hz_save(self):
if self.data3 is not None:
- if self.lineEdit_resample1000Hz_save_path.text() != "" and self.lineEdit_resample1000Hz_save_path.text().endswith(".txt"):
- reply = QMessageBox.question(self, "警告:确认操作", f"你确定要将裁剪结果保存到{self.lineEdit_resample1000Hz_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ if self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text() != "" and self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text().endswith(".txt"):
+ reply = QMessageBox.question(self, "警告:确认操作", f"你确定要将裁剪结果保存到{self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
- np.savetxt(self.lineEdit_resample1000Hz_save_path.text(), self.data3, fmt='%.4f')
- info(f"Saved Data After Cut to {self.lineEdit_resample1000Hz_save_path.text()}.")
- self.textBrowser_update(f"提示:保存成功至{self.lineEdit_resample1000Hz_save_path.text()}")
- self.msgBox.setText(f"保存成功至{self.lineEdit_resample1000Hz_save_path.text()}")
+ np.savetxt(self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text(), self.data3, fmt='%.4f')
+ info(f"Saved Data After Cut to {self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text()}.")
+ self.textBrowser_update(f"提示:保存成功至{self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text()}")
+ self.msgBox.setText(f"保存成功至{self.ui_resample1000Hz.lineEdit_resample1000Hz_save_path.text()}")
self.msgBox.setIcon(QMessageBox.Information)
self.msgBox.exec()
+ else:
+ self.textBrowser_update(f"提示:保存操作取消")
else:
self.textBrowser_update("错误:保存路径输入有误,请检查后重新执行保存")
self.msgBox.setText("保存路径输入有误,请检查后重新执行保存")
@@ -229,6 +260,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
return
info("Found filter_ecg.txt.")
+ self.widget_func.setParent(None)
+ self.verticalLayout_menu.removeWidget(self.widget_func)
+ self.verticalLayout_menu.addWidget(self.widget_detect_Rpeaks)
+
# 画框子图初始化
self.gs = gridspec.GridSpec(2, 1, height_ratios=[1, 1])
self.figure.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
@@ -246,71 +281,65 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ax1.grid(True)
self.ax1.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
- self.lineEdit_detect_Rpeaks_filter_ecg_path.setText(str(filter_ecg_path))
- self.lineEdit_detect_Rpeaks_save_path.setText(str(self.root_path / "label"))
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_filter_ecg_path.setText(str(filter_ecg_path))
+ self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.setText(str(self.root_path / "label"))
self.textBrowser_update("提示:找到filter_ecg.txt")
self.data1 = read_csv(filter_ecg_path, encoding="utf-8").to_numpy().reshape(-1)
- self.groupBox_func_select.setVisible(False)
- self.groupBox_detect_Rpeaks.setVisible(True)
- self.groupBox_info.setVisible(True)
- self.groupBox_plot.setVisible(True)
- self.radioButton_detector_method_pt.setChecked(True)
def slot_btn_detect_Rpeaks_view(self):
- if self.lineEdit_detect_Rpeaks_sampling_rate.text() != "" and self.lineEdit_detect_Rpeaks_peaks_value.text() != "" and self.lineEdit_detect_Rpeaks_bandpass_low.text() != "" and self.lineEdit_detect_Rpeaks_bandpass_high.text() != "":
- if self.lineEdit_detect_Rpeaks_save_path.text() != "":
- self.ax0.remove()
- self.ax0 = self.figure.add_subplot(self.gs[0])
- self.ax0 = plt.gca()
- self.ax0.grid(True)
- self.ax0.tick_params(axis='x', colors='white')
- self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
- self.ax1.remove()
- self.ax1 = self.figure.add_subplot(self.gs[1], sharex=self.ax0)
- self.ax1 = plt.gca()
- self.ax1.grid(True)
- self.ax1.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
- ecg_data = self.data1
- if self.radioButton_detector_method_pt.isChecked():
- detector_method = 'pt'
- elif self.radioButton_detector_method_ta.isChecked():
- detector_method = 'ta'
- elif self.radioButton_detector_method_Wt.isChecked():
- detector_method = 'Wt'
- elif self.radioButton_detector_method_Hamilton.isChecked():
- detector_method = 'Hamilton'
- elif self.radioButton_detector_method_Engzee.isChecked():
- detector_method = 'Engzee'
- self.ecg_seq, self.R_peak_seq, self.Interval_seq, self.RRIV_seq = detect_Rpeak2.Rpeak_Detection(ecg_data, int(self.lineEdit_detect_Rpeaks_sampling_rate.text()), int(self.lineEdit_detect_Rpeaks_bandpass_low.text()), int(self.lineEdit_detect_Rpeaks_bandpass_high.text()), int(self.lineEdit_detect_Rpeaks_peaks_value.text()), detector_method)
- if len(self.ecg_seq) != len(self.R_peak_seq) != len(self.Interval_seq) != len(self.RRIV_seq):
- error("len(self.ecg_seq) and len(self.R_peak_seq) and len(self.Interval_seq) and len(self.RRIV_seq) are not equal.")
- self.textBrowser_update("错误:ecg_seq和R_peak_seq和Interval_seq和RRIV_seq的长度不相等")
- return
+ if self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_sampling_rate.text() != "" and self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_peaks_value.text() != "" and self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_low.text() != "" and self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_high.text() != "":
+ self.ax0.remove()
+ self.ax0 = self.figure.add_subplot(self.gs[0])
+ self.ax0 = plt.gca()
+ self.ax0.grid(True)
+ self.ax0.tick_params(axis='x', colors='white')
+ self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
+ self.ax1.remove()
+ self.ax1 = self.figure.add_subplot(self.gs[1], sharex=self.ax0)
+ self.ax1 = plt.gca()
+ self.ax1.grid(True)
+ self.ax1.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
+ ecg_data = self.data1
+ if self.ui_detect_Rpeaks.radioButton_detector_method_pt.isChecked():
+ detector_method = 'pt'
+ elif self.ui_detect_Rpeaks.radioButton_detector_method_ta.isChecked():
+ detector_method = 'ta'
+ elif self.ui_detect_Rpeaks.radioButton_detector_method_Wt.isChecked():
+ detector_method = 'Wt'
+ elif self.ui_detect_Rpeaks.radioButton_detector_method_Hamilton.isChecked():
+ detector_method = 'Hamilton'
+ elif self.ui_detect_Rpeaks.radioButton_detector_method_Engzee.isChecked():
+ detector_method = 'Engzee'
+ self.ecg_seq, self.R_peak_seq, self.Interval_seq, self.RRIV_seq = detect_Rpeak.Rpeak_Detection(ecg_data, int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_sampling_rate.text()), int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_low.text()), int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_bandpass_high.text()), int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_peaks_value.text()), detector_method)
+ if len(self.ecg_seq) != len(self.R_peak_seq) != len(self.Interval_seq) != len(self.RRIV_seq):
+ error("len(self.ecg_seq) and len(self.R_peak_seq) and len(self.Interval_seq) and len(self.RRIV_seq) are not equal.")
+ self.textBrowser_update("错误:ecg_seq和R_peak_seq和Interval_seq和RRIV_seq的长度不相等")
+ return
- info(f"Data Length:{len(ecg_data)}")
- self.textBrowser_update(f"数据长度:{len(ecg_data)}")
- info(f"Data Duration:{len(ecg_data) / int(self.lineEdit_detect_Rpeaks_sampling_rate.text()) / 60}分钟")
- self.textBrowser_update(f"数据时长:{len(ecg_data) / int(self.lineEdit_detect_Rpeaks_sampling_rate.text()) / 60}分钟")
- info(f"Data Parts:{len(self.ecg_seq)}小时")
- self.textBrowser_update(f"数据总时长:{len(self.ecg_seq)}小时")
+ info(f"Data Length: {len(ecg_data)}")
+ self.textBrowser_update(f"数据长度:{len(ecg_data)}")
+ info(f"Data Duration: {len(ecg_data) / int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_sampling_rate.text()) / 60} min")
+ self.textBrowser_update(f"数据时长:{len(ecg_data) / int(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_sampling_rate.text()) / 60}分钟")
+ info(f"Data Parts: {len(self.ecg_seq)} hours")
+ self.textBrowser_update(f"数据总时长:{len(self.ecg_seq)}小时")
- self.tableWidget_detect_Rpeaks_signal_parts_list.setRowCount(len(self.ecg_seq))
- for row in range(len(self.ecg_seq)):
- item = QTableWidgetItem(str(row + 1))
- self.tableWidget_detect_Rpeaks_signal_parts_list.setItem(row, 0, item)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.setRowCount(len(self.ecg_seq))
+ for row in range(len(self.ecg_seq)):
+ item = QTableWidgetItem(str(row + 1))
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.setItem(row, 0, item)
- self.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(True)
+ self.ui_detect_Rpeaks.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(True)
- self.ax0.plot(self.R_peak_seq[0][2: ], self.RRIV_seq[0], 'r.', label="RRIV")
- self.ax0.legend(loc='upper right')
- self.ax1.plot(self.ecg_seq[0], 'r', label="ECG")
- self.ax1.plot(self.R_peak_seq[0], self.ecg_seq[0][self.R_peak_seq[0]], 'b*', label="R_peaks")
- self.ax1.plot(self.Interval_seq[0], 'g', label="Interval")
- self.ax1.legend(loc='upper right')
- self.canvas.draw()
- self.temp = 0
- info("Finished R peaks Detect and Data Part 1 Plot.")
- self.textBrowser_update("提示:完成R峰提取并绘制信号第1段")
+ self.ax0.plot(self.R_peak_seq[0][2: ], self.RRIV_seq[0], 'r.', label="RRIV")
+ self.ax0.legend(loc='upper right')
+ self.ax1.plot(self.ecg_seq[0], 'r', label="ECG")
+ self.ax1.plot(self.R_peak_seq[0], self.ecg_seq[0][self.R_peak_seq[0]], 'b*', label="R_peaks")
+ self.ax1.plot(self.Interval_seq[0], 'g', label="Interval")
+ self.ax1.legend(loc='upper right')
+ self.canvas.draw()
+ self.temp = 0
+ info("Finished R peaks Detect and Data Part 1 Plot.")
+ self.textBrowser_update("提示:完成R峰提取并绘制信号第1段")
else:
error(f"Miss Args for detect_Rpeaks.")
self.textBrowser_update("错误:参数输入存在空值")
@@ -320,21 +349,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def slot_btn_detect_Rpeaks_save(self):
if self.ecg_seq is not None and self.R_peak_seq is not None:
- if self.lineEdit_detect_Rpeaks_save_path.text() != "":
- if Path(self.lineEdit_detect_Rpeaks_save_path.text()).is_dir() == False:
- Path(self.lineEdit_detect_Rpeaks_save_path.text()).mkdir(parents=True, exist_ok=True)
+ if self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text() != "":
+ if Path(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()).is_dir() == False:
+ Path(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()).mkdir(parents=True, exist_ok=True)
info("Save Path is not Exist, Made it as a New Directory.")
self.textBrowser_update("提示:检测到保存路径所指向的文件夹不存在,已创建相应文件夹")
- reply = QMessageBox.question(self, "警告:确认操作", f"你确定要将裁剪结果保存到{self.lineEdit_resample1000Hz_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ reply = QMessageBox.question(self, "警告:确认操作", f"你确定要将裁剪结果保存到{self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
for idx in range(len(self.ecg_seq)):
- DataFrame(self.ecg_seq[idx].reshape(-1)).to_csv(str(Path(self.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}ecg.txt"), index=False, header=None)
- DataFrame(self.R_peak_seq[idx].reshape(-1)).to_csv(str(Path(self.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}Rpeak.txt"), index=False, header=None)
- info(f"Saved Data {idx + 1} to Directory {self.lineEdit_detect_Rpeaks_save_path.text()}.")
- self.textBrowser_update(f"提示:保存片段{idx + 1}成功至文件夹{self.lineEdit_detect_Rpeaks_save_path.text()}")
- self.msgBox.setText(f"保存成功至{self.lineEdit_detect_Rpeaks_save_path.text()}")
+ DataFrame(self.ecg_seq[idx].reshape(-1)).to_csv(str(Path(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}ecg.txt"), index=False, header=None)
+ DataFrame(self.R_peak_seq[idx].reshape(-1)).to_csv(str(Path(self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}Rpeak.txt"), index=False, header=None)
+ info(f"Saved Data {idx + 1} to Directory {self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()}.")
+ self.textBrowser_update(f"提示:保存片段{idx + 1}成功至文件夹{self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()}")
+ self.msgBox.setText(f"保存成功至{self.ui_detect_Rpeaks.lineEdit_detect_Rpeaks_save_path.text()}")
self.msgBox.setIcon(QMessageBox.Information)
self.msgBox.exec()
+ else:
+ self.textBrowser_update(f"提示:保存操作取消")
else:
self.textBrowser_update("错误:保存路径输入有误,请检查后重新执行保存")
self.msgBox.setText("保存路径输入有误,请检查后重新执行保存")
@@ -348,7 +379,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.msgBox.exec()
def slot_tableWidget_detect_Rpeaks_signal_parts_list_on_cell_double_clicked(self, row, column):
- self.temp = int(self.tableWidget_detect_Rpeaks_signal_parts_list.item(row, column).text()) - 1
+ self.temp = int(self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.item(row, column).text()) - 1
self.detect_Rpeaks_update_plot(self.temp)
info(f"Finished Data Part {self.temp + 1} Plot.")
self.textBrowser_update(f"提示:完成绘制信号第{self.temp + 1}段")
@@ -365,7 +396,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.textBrowser_update(f"提示:完成绘制信号第{self.temp + 1}段")
def slot_btn_detect_Rpeaks_right(self):
- if self.temp >= int(self.tableWidget_detect_Rpeaks_signal_parts_list.item(self.tableWidget_detect_Rpeaks_signal_parts_list.rowCount() - 1, 0).text()) - 1:
+ if self.temp >= int(self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.item(self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.rowCount() - 1, 0).text()) - 1:
self.msgBox.setText("你正在查看最后1段信号")
self.msgBox.setIcon(QMessageBox.Warning)
self.msgBox.exec()
@@ -396,29 +427,136 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.canvas.draw()
def slot_btn_detect_Jpeaks(self):
- pass
+ DSbcg_sig_1000hz3_path = self.root_path / "DSbcg_sig_1000hz3.txt"
+ if not DSbcg_sig_1000hz3_path.exists():
+ error("Can't Find DSbcg_sig_1000hz3.txt.")
+ self.textBrowser_update("错误:无法找到DSbcg_sig_1000hz3.txt,无法执行,请检查文件是否存在")
+ self.msgBox.setText("无法找到DSbcg_sig_1000hz3.txt,无法执行,请检查文件是否存在")
+ self.msgBox.setIcon(QMessageBox.Critical)
+ self.msgBox.exec()
+ return
+ info("Found DSbcg_sig_1000hz3.txt.")
+
+ self.widget_func.setParent(None)
+ self.verticalLayout_menu.removeWidget(self.widget_func)
+ self.verticalLayout_menu.addWidget(self.widget_detect_Jpeaks)
+
+ # 画框子图初始化
+ self.gs = gridspec.GridSpec(1, 1, height_ratios=[1])
+ self.figure.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
+ plt.margins(0, 0)
+ plt.tight_layout()
+ plt.xticks([])
+ plt.yticks([])
+ self.ax0 = self.figure.add_subplot(self.gs[0])
+ self.ax0 = plt.gca()
+ self.ax0.grid(True)
+ self.ax0.tick_params(axis='x', colors='white')
+ self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
+
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path.setText(str(DSbcg_sig_1000hz3_path))
+ self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.setText(str(Path(self.root_path) / "Jpeak.txt"))
+ self.textBrowser_update("提示:找到DSbcg_sig_1000hz3.txt")
+ self.data1 = np.array(read_csv(DSbcg_sig_1000hz3_path, header=None)).reshape(-1)
+
+ def slot_btn_detect_Jpeaks_view(self):
+ if self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_peaks_value.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_low.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_high.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_amp_value.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_low.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_high.text() != "":
+ self.ax0.remove()
+ self.ax0 = self.figure.add_subplot(self.gs[0])
+ self.ax0 = plt.gca()
+ self.ax0.grid(True)
+ self.ax0.tick_params(axis='x', colors='white')
+ self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}"))
+ bcg_data = self.data1
+ if self.ui_detect_Jpeaks.radioButton_Fivelayer_Unet_1.isChecked():
+ detector_method = 'Fivelayer_Unet_1'
+ elif self.ui_detect_Jpeaks.radioButton_Fivelayer_Unet_2.isChecked():
+ detector_method = 'Fivelayer_Unet_2'
+ elif self.ui_detect_Jpeaks.radioButton_Fivelayer_Lstm_Unet_1.isChecked():
+ detector_method = 'Fivelayer_Lstm_Unet_1'
+ elif self.ui_detect_Jpeaks.radioButton_Fivelayer_Lstm_Unet_2.isChecked():
+ detector_method = 'Fivelayer_Lstm_Unet_2'
+ else:
+ detector_method = 'Fivelayer_Unet_1'
+
+ if self.ui_detect_Jpeaks.checkBox_useCPU.isChecked() == True:
+ useCPU = True
+ else:
+ useCPU = False
+
+ self.data2, self.data3, self.data4 = detect_Jpeak.Jpeak_Detection(bcg_data, detector_method, int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_low.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_bandpass_high.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_high.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_interval_low.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_peaks_value.text()), int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_amp_value.text()), useCPU)
+
+ info(f"Data Length: {len(bcg_data)}")
+ self.textBrowser_update(f"数据长度:{len(bcg_data)}")
+ info(f"Data Duration: {len(bcg_data) / int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.text()) / 60} min")
+ self.textBrowser_update(f"数据时长:{len(bcg_data) / int(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_sampling_rate.text()) / 60} 分钟")
+ info(f"Quantity of J_peaks: {len(self.data3)}")
+ self.textBrowser_update(f"J峰个数:{len(self.data3)}")
+
+ self.ax0.plot(self.data2, 'b', label="BCG_filtered")
+ self.ax0.plot(self.data3, self.data2[self.data3], 'r.', label="Predict_J_peaks")
+ self.ax0.plot(self.data4, 'orange', label="Interval")
+ self.ax0.legend(loc='upper right')
+ self.canvas.draw()
+ info("Finished J peaks Detect and Data Plot.")
+ self.textBrowser_update("提示:完成J峰提取并绘制信号")
+ else:
+ error(f"Miss Args for detect_Jpeaks.")
+ self.textBrowser_update("错误:参数输入存在空值")
+ self.msgBox.setText("参数输入存在空值")
+ self.msgBox.setIcon(QMessageBox.Critical)
+ self.msgBox.exec()
+
+ def slot_btn_detect_Jpeaks_save(self):
+ if self.data2 is not None and self.data3 is not None and self.data4 is not None:
+ if self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text() != "" and self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text().endswith(".txt"):
+ reply = QMessageBox.question(self, "警告:确认操作", f"你确定要将预测结果保存到{self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ if reply == QMessageBox.Yes:
+ DataFrame(self.data3.reshape(-1)).to_csv(self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text(), index=False, header=None)
+ info(f"Saved Data to Directory {self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text()}.")
+ self.textBrowser_update(f"提示:保存数据成功至文件夹{self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text()}")
+ self.msgBox.setText(f"保存成功至{self.ui_detect_Jpeaks.lineEdit_detect_Jpeaks_save_path.text()}")
+ self.msgBox.setIcon(QMessageBox.Information)
+ self.msgBox.exec()
+ else:
+ self.textBrowser_update(f"提示:保存操作取消")
+ else:
+ self.textBrowser_update("错误:保存路径输入有误,请检查后重新执行保存")
+ self.msgBox.setText("保存路径输入有误,请检查后重新执行保存")
+ self.msgBox.setIcon(QMessageBox.Information)
+ self.msgBox.exec()
+ else:
+ error(f"data is None.")
+ self.textBrowser_update("错误:需要保存的数据不存在")
+ self.msgBox.setText("需要保存的数据不存在")
+ self.msgBox.setIcon(QMessageBox.Critical)
+ self.msgBox.exec()
def slot_btn_backToMenu(self):
self.data1 = None
self.data2 = None
self.data3 = None
+ self.data4 = None
self.ecg_seq = None
self.R_peak_seq = None
self.Interval_seq = None
self.RRIV_seq = None
self.temp = None
- self.tableWidget_detect_Rpeaks_signal_parts_list.clearContents()
- self.groupBox_func_select.setVisible(True)
- self.groupBox_resample1000Hz.setVisible(False)
- self.groupBox_detect_Rpeaks.setVisible(False)
- self.groupBox_detect_Jpeaks.setVisible(False)
- self.groupBox_info.setVisible(False)
- self.groupBox_plot.setVisible(False)
- self.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(False)
+ self.ui_detect_Rpeaks.tableWidget_detect_Rpeaks_signal_parts_list.clearContents()
+ self.ui_detect_Rpeaks.groupBox_detect_Rpeaks_signal_parts_list.setEnabled(False)
+ for i in range(self.verticalLayout_menu.count()):
+ item = self.verticalLayout_menu.itemAt(i)
+ if item.widget():
+ widget = item.widget()
+ if widget.objectName() == "widget_resample1000Hz" or widget.objectName() == "widget_detect_Rpeaks" or widget.objectName() == "widget_detect_Jpeaks":
+ widget.setParent(None)
+ self.verticalLayout_menu.removeWidget(widget)
+ self.verticalLayout_menu.addWidget(self.widget_func)
self.figure.clf()
def textBrowser_update(self, message):
self.textBrowser_infoOutput.append(str(datetime.now().strftime("%H:%M:%S")) + ": " + message)
+ self.textBrowser_infoOutput.verticalScrollBar().setValue(self.textBrowser_infoOutput.verticalScrollBar().maximum())
# 主函数
if __name__ == '__main__':
diff --git a/ui/MainWindow.py b/ui/MainWindow.py
new file mode 100644
index 0000000..1d980e8
--- /dev/null
+++ b/ui/MainWindow.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'MainWindow.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.setEnabled(True)
+ MainWindow.resize(1920, 1080)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
+ MainWindow.setSizePolicy(sizePolicy)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
+ self.gridLayout.setObjectName("gridLayout")
+ self.verticalLayout_right = QtWidgets.QVBoxLayout()
+ self.verticalLayout_right.setObjectName("verticalLayout_right")
+ self.groupBox_plot = QtWidgets.QGroupBox(self.centralwidget)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_plot.setFont(font)
+ self.groupBox_plot.setObjectName("groupBox_plot")
+ self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_plot)
+ self.gridLayout_3.setObjectName("gridLayout_3")
+ self.verticalLayout_canvas = QtWidgets.QVBoxLayout()
+ self.verticalLayout_canvas.setObjectName("verticalLayout_canvas")
+ self.gridLayout_3.addLayout(self.verticalLayout_canvas, 0, 0, 1, 1)
+ self.verticalLayout_right.addWidget(self.groupBox_plot)
+ self.gridLayout.addLayout(self.verticalLayout_right, 0, 2, 1, 1)
+ self.verticalLayout_left = QtWidgets.QVBoxLayout()
+ self.verticalLayout_left.setObjectName("verticalLayout_left")
+ self.verticalLayout_menu = QtWidgets.QVBoxLayout()
+ self.verticalLayout_menu.setObjectName("verticalLayout_menu")
+ self.verticalLayout_left.addLayout(self.verticalLayout_menu)
+ self.groupBox_info = QtWidgets.QGroupBox(self.centralwidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_info.sizePolicy().hasHeightForWidth())
+ self.groupBox_info.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_info.setFont(font)
+ self.groupBox_info.setObjectName("groupBox_info")
+ self.gridLayout_66 = QtWidgets.QGridLayout(self.groupBox_info)
+ self.gridLayout_66.setObjectName("gridLayout_66")
+ self.textBrowser_infoOutput = QtWidgets.QTextBrowser(self.groupBox_info)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.textBrowser_infoOutput.setFont(font)
+ self.textBrowser_infoOutput.setObjectName("textBrowser_infoOutput")
+ self.gridLayout_66.addWidget(self.textBrowser_infoOutput, 0, 0, 2, 2)
+ self.gridLayout_66.setColumnStretch(0, 1)
+ self.gridLayout_66.setRowStretch(0, 4)
+ self.gridLayout_66.setRowStretch(1, 1)
+ self.verticalLayout_left.addWidget(self.groupBox_info)
+ self.pushButton_backToMenu = QtWidgets.QPushButton(self.centralwidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_backToMenu.sizePolicy().hasHeightForWidth())
+ self.pushButton_backToMenu.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_backToMenu.setFont(font)
+ self.pushButton_backToMenu.setObjectName("pushButton_backToMenu")
+ self.verticalLayout_left.addWidget(self.pushButton_backToMenu)
+ self.verticalLayout_left.setStretch(0, 16)
+ self.verticalLayout_left.setStretch(1, 4)
+ self.verticalLayout_left.setStretch(2, 1)
+ self.gridLayout.addLayout(self.verticalLayout_left, 0, 1, 1, 1)
+ self.gridLayout.setColumnStretch(1, 4)
+ self.gridLayout.setColumnStretch(2, 20)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.statusBar = QtWidgets.QStatusBar(MainWindow)
+ self.statusBar.setObjectName("statusBar")
+ MainWindow.setStatusBar(self.statusBar)
+ self.action_selectPath = QtWidgets.QAction(MainWindow)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.action_selectPath.setFont(font)
+ self.action_selectPath.setObjectName("action_selectPath")
+ self.action = QtWidgets.QAction(MainWindow)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.action.setFont(font)
+ self.action.setObjectName("action")
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "Heartbeat_Annotation"))
+ self.groupBox_plot.setTitle(_translate("MainWindow", "绘图区"))
+ self.groupBox_info.setTitle(_translate("MainWindow", "信息"))
+ self.pushButton_backToMenu.setText(_translate("MainWindow", "返回主菜单"))
+ self.action_selectPath.setText(_translate("MainWindow", "数据路径选择"))
+ self.action.setText(_translate("MainWindow", "加载存档"))
diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui
new file mode 100644
index 0000000..b018e6d
--- /dev/null
+++ b/ui/MainWindow.ui
@@ -0,0 +1,134 @@
+
+
+ MainWindow
+
+
+ true
+
+
+
+ 0
+ 0
+ 1920
+ 1080
+
+
+
+
+ 0
+ 0
+
+
+
+ Heartbeat_Annotation
+
+
+
+ -
+
+
-
+
+
+
+ 黑体
+ 10
+
+
+
+ 绘图区
+
+
+
-
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 信息
+
+
+
-
+
+
+
+ 黑体
+ 10
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 返回主菜单
+
+
+
+
+
+
+
+
+
+
+ 数据路径选择
+
+
+
+ 黑体
+ 14
+
+
+
+
+
+ 加载存档
+
+
+
+ 黑体
+ 14
+
+
+
+
+
+
+
diff --git a/ui/widget_detect_Jpeaks.py b/ui/widget_detect_Jpeaks.py
new file mode 100644
index 0000000..c5d08cb
--- /dev/null
+++ b/ui/widget_detect_Jpeaks.py
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'widget_detect_Jpeaks.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_widget_detect_Jpeaks(object):
+ def setupUi(self, widget_detect_Jpeaks):
+ widget_detect_Jpeaks.setObjectName("widget_detect_Jpeaks")
+ widget_detect_Jpeaks.resize(398, 893)
+ self.gridLayout = QtWidgets.QGridLayout(widget_detect_Jpeaks)
+ self.gridLayout.setObjectName("gridLayout")
+ self.groupBox_detect_Jpeaks = QtWidgets.QGroupBox(widget_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Jpeaks.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Jpeaks.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Jpeaks.setFont(font)
+ self.groupBox_detect_Jpeaks.setObjectName("groupBox_detect_Jpeaks")
+ self.gridLayout_69 = QtWidgets.QGridLayout(self.groupBox_detect_Jpeaks)
+ self.gridLayout_69.setObjectName("gridLayout_69")
+ self.pushButton_detect_Jpeaks_save = QtWidgets.QPushButton(self.groupBox_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Jpeaks_save.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Jpeaks_save.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Jpeaks_save.setFont(font)
+ self.pushButton_detect_Jpeaks_save.setObjectName("pushButton_detect_Jpeaks_save")
+ self.gridLayout_69.addWidget(self.pushButton_detect_Jpeaks_save, 4, 1, 1, 1)
+ self.groupBox_detect_Jpeaks_inputFile_check = QtWidgets.QGroupBox(self.groupBox_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Jpeaks_inputFile_check.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Jpeaks_inputFile_check.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Jpeaks_inputFile_check.setFont(font)
+ self.groupBox_detect_Jpeaks_inputFile_check.setObjectName("groupBox_detect_Jpeaks_inputFile_check")
+ self.gridLayout_75 = QtWidgets.QGridLayout(self.groupBox_detect_Jpeaks_inputFile_check)
+ self.gridLayout_75.setObjectName("gridLayout_75")
+ self.label_15 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_15.setFont(font)
+ self.label_15.setObjectName("label_15")
+ self.gridLayout_75.addWidget(self.label_15, 2, 0, 1, 1)
+ self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_inputFile_check)
+ self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path.setEnabled(False)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path.setFont(font)
+ self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path.setObjectName("lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path")
+ self.gridLayout_75.addWidget(self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path, 1, 0, 1, 1)
+ self.lineEdit_detect_Jpeaks_save_path = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_detect_Jpeaks_save_path.setFont(font)
+ self.lineEdit_detect_Jpeaks_save_path.setObjectName("lineEdit_detect_Jpeaks_save_path")
+ self.gridLayout_75.addWidget(self.lineEdit_detect_Jpeaks_save_path, 3, 0, 1, 1)
+ self.label_14 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_14.setFont(font)
+ self.label_14.setObjectName("label_14")
+ self.gridLayout_75.addWidget(self.label_14, 0, 0, 1, 1)
+ self.gridLayout_69.addWidget(self.groupBox_detect_Jpeaks_inputFile_check, 0, 0, 1, 2)
+ self.pushButton_detect_Jpeaks_view = QtWidgets.QPushButton(self.groupBox_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Jpeaks_view.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Jpeaks_view.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Jpeaks_view.setFont(font)
+ self.pushButton_detect_Jpeaks_view.setObjectName("pushButton_detect_Jpeaks_view")
+ self.gridLayout_69.addWidget(self.pushButton_detect_Jpeaks_view, 4, 0, 1, 1)
+ self.groupBox_detect_Jpeaks_input_args = QtWidgets.QGroupBox(self.groupBox_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Jpeaks_input_args.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Jpeaks_input_args.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Jpeaks_input_args.setFont(font)
+ self.groupBox_detect_Jpeaks_input_args.setObjectName("groupBox_detect_Jpeaks_input_args")
+ self.gridLayout_76 = QtWidgets.QGridLayout(self.groupBox_detect_Jpeaks_input_args)
+ self.gridLayout_76.setObjectName("gridLayout_76")
+ self.lineEdit_detect_Jpeaks_peaks_value = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.lineEdit_detect_Jpeaks_peaks_value.sizePolicy().hasHeightForWidth())
+ self.lineEdit_detect_Jpeaks_peaks_value.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_peaks_value.setFont(font)
+ self.lineEdit_detect_Jpeaks_peaks_value.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_peaks_value.setObjectName("lineEdit_detect_Jpeaks_peaks_value")
+ self.gridLayout_76.addWidget(self.lineEdit_detect_Jpeaks_peaks_value, 1, 2, 1, 3)
+ self.radioButton_Fivelayer_Unet_2 = QtWidgets.QRadioButton(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.radioButton_Fivelayer_Unet_2.sizePolicy().hasHeightForWidth())
+ self.radioButton_Fivelayer_Unet_2.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_Fivelayer_Unet_2.setFont(font)
+ self.radioButton_Fivelayer_Unet_2.setObjectName("radioButton_Fivelayer_Unet_2")
+ self.gridLayout_76.addWidget(self.radioButton_Fivelayer_Unet_2, 7, 4, 2, 1)
+ self.label_23 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_23.sizePolicy().hasHeightForWidth())
+ self.label_23.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_23.setFont(font)
+ self.label_23.setObjectName("label_23")
+ self.gridLayout_76.addWidget(self.label_23, 7, 0, 2, 1)
+ self.label_20 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth())
+ self.label_20.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_20.setFont(font)
+ self.label_20.setObjectName("label_20")
+ self.gridLayout_76.addWidget(self.label_20, 6, 0, 1, 5)
+ self.label_21 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_21.setFont(font)
+ self.label_21.setObjectName("label_21")
+ self.gridLayout_76.addWidget(self.label_21, 4, 0, 1, 2)
+ self.label_16 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_16.setFont(font)
+ self.label_16.setObjectName("label_16")
+ self.gridLayout_76.addWidget(self.label_16, 0, 0, 1, 2)
+ self.lineEdit_detect_Jpeaks_interval_low = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.lineEdit_detect_Jpeaks_interval_low.sizePolicy().hasHeightForWidth())
+ self.lineEdit_detect_Jpeaks_interval_low.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_interval_low.setFont(font)
+ self.lineEdit_detect_Jpeaks_interval_low.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_interval_low.setObjectName("lineEdit_detect_Jpeaks_interval_low")
+ self.gridLayout_76.addWidget(self.lineEdit_detect_Jpeaks_interval_low, 4, 2, 1, 1)
+ self.lineEdit_detect_Jpeaks_interval_high = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.lineEdit_detect_Jpeaks_interval_high.sizePolicy().hasHeightForWidth())
+ self.lineEdit_detect_Jpeaks_interval_high.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_interval_high.setFont(font)
+ self.lineEdit_detect_Jpeaks_interval_high.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_interval_high.setObjectName("lineEdit_detect_Jpeaks_interval_high")
+ self.gridLayout_76.addWidget(self.lineEdit_detect_Jpeaks_interval_high, 4, 4, 1, 1)
+ self.label_22 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_22.setFont(font)
+ self.label_22.setObjectName("label_22")
+ self.gridLayout_76.addWidget(self.label_22, 4, 3, 1, 1)
+ self.label_25 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_25.setFont(font)
+ self.label_25.setWhatsThis("")
+ self.label_25.setObjectName("label_25")
+ self.gridLayout_76.addWidget(self.label_25, 2, 0, 1, 1)
+ self.radioButton_Fivelayer_Unet_1 = QtWidgets.QRadioButton(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.radioButton_Fivelayer_Unet_1.sizePolicy().hasHeightForWidth())
+ self.radioButton_Fivelayer_Unet_1.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_Fivelayer_Unet_1.setFont(font)
+ self.radioButton_Fivelayer_Unet_1.setChecked(True)
+ self.radioButton_Fivelayer_Unet_1.setObjectName("radioButton_Fivelayer_Unet_1")
+ self.gridLayout_76.addWidget(self.radioButton_Fivelayer_Unet_1, 7, 2, 2, 1)
+ self.radioButton_Fivelayer_Lstm_Unet_2 = QtWidgets.QRadioButton(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.radioButton_Fivelayer_Lstm_Unet_2.sizePolicy().hasHeightForWidth())
+ self.radioButton_Fivelayer_Lstm_Unet_2.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_Fivelayer_Lstm_Unet_2.setFont(font)
+ self.radioButton_Fivelayer_Lstm_Unet_2.setObjectName("radioButton_Fivelayer_Lstm_Unet_2")
+ self.gridLayout_76.addWidget(self.radioButton_Fivelayer_Lstm_Unet_2, 9, 4, 1, 1)
+ self.lineEdit_detect_Jpeaks_sampling_rate = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.lineEdit_detect_Jpeaks_sampling_rate.sizePolicy().hasHeightForWidth())
+ self.lineEdit_detect_Jpeaks_sampling_rate.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_sampling_rate.setFont(font)
+ self.lineEdit_detect_Jpeaks_sampling_rate.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_sampling_rate.setObjectName("lineEdit_detect_Jpeaks_sampling_rate")
+ self.gridLayout_76.addWidget(self.lineEdit_detect_Jpeaks_sampling_rate, 0, 2, 1, 3)
+ self.label_17 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_17.setFont(font)
+ self.label_17.setWhatsThis("")
+ self.label_17.setObjectName("label_17")
+ self.gridLayout_76.addWidget(self.label_17, 1, 0, 1, 2)
+ self.label_24 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_24.sizePolicy().hasHeightForWidth())
+ self.label_24.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_24.setFont(font)
+ self.label_24.setObjectName("label_24")
+ self.gridLayout_76.addWidget(self.label_24, 9, 0, 1, 1)
+ self.radioButton_Fivelayer_Lstm_Unet_1 = QtWidgets.QRadioButton(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.radioButton_Fivelayer_Lstm_Unet_1.sizePolicy().hasHeightForWidth())
+ self.radioButton_Fivelayer_Lstm_Unet_1.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_Fivelayer_Lstm_Unet_1.setFont(font)
+ self.radioButton_Fivelayer_Lstm_Unet_1.setObjectName("radioButton_Fivelayer_Lstm_Unet_1")
+ self.gridLayout_76.addWidget(self.radioButton_Fivelayer_Lstm_Unet_1, 9, 2, 1, 1)
+ self.lineEdit_detect_Jpeaks_amp_value = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.lineEdit_detect_Jpeaks_amp_value.sizePolicy().hasHeightForWidth())
+ self.lineEdit_detect_Jpeaks_amp_value.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_amp_value.setFont(font)
+ self.lineEdit_detect_Jpeaks_amp_value.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_amp_value.setObjectName("lineEdit_detect_Jpeaks_amp_value")
+ self.gridLayout_76.addWidget(self.lineEdit_detect_Jpeaks_amp_value, 2, 2, 1, 3)
+ self.checkBox_useCPU = QtWidgets.QCheckBox(self.groupBox_detect_Jpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.checkBox_useCPU.setFont(font)
+ self.checkBox_useCPU.setObjectName("checkBox_useCPU")
+ self.gridLayout_76.addWidget(self.checkBox_useCPU, 5, 0, 1, 5)
+ self.gridLayout_69.addWidget(self.groupBox_detect_Jpeaks_input_args, 2, 0, 1, 2)
+ self.groupBox_detect_Jpeaks_filter_args = QtWidgets.QGroupBox(self.groupBox_detect_Jpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Jpeaks_filter_args.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Jpeaks_filter_args.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Jpeaks_filter_args.setFont(font)
+ self.groupBox_detect_Jpeaks_filter_args.setObjectName("groupBox_detect_Jpeaks_filter_args")
+ self.gridLayout_77 = QtWidgets.QGridLayout(self.groupBox_detect_Jpeaks_filter_args)
+ self.gridLayout_77.setObjectName("gridLayout_77")
+ self.label_19 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_filter_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_19.setFont(font)
+ self.label_19.setObjectName("label_19")
+ self.gridLayout_77.addWidget(self.label_19, 0, 2, 1, 1)
+ self.label_18 = QtWidgets.QLabel(self.groupBox_detect_Jpeaks_filter_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_18.setFont(font)
+ self.label_18.setObjectName("label_18")
+ self.gridLayout_77.addWidget(self.label_18, 0, 0, 1, 1)
+ self.lineEdit_detect_Jpeaks_bandpass_low = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_filter_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_bandpass_low.setFont(font)
+ self.lineEdit_detect_Jpeaks_bandpass_low.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_bandpass_low.setObjectName("lineEdit_detect_Jpeaks_bandpass_low")
+ self.gridLayout_77.addWidget(self.lineEdit_detect_Jpeaks_bandpass_low, 0, 1, 1, 1)
+ self.lineEdit_detect_Jpeaks_bandpass_high = QtWidgets.QLineEdit(self.groupBox_detect_Jpeaks_filter_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Jpeaks_bandpass_high.setFont(font)
+ self.lineEdit_detect_Jpeaks_bandpass_high.setPlaceholderText("")
+ self.lineEdit_detect_Jpeaks_bandpass_high.setObjectName("lineEdit_detect_Jpeaks_bandpass_high")
+ self.gridLayout_77.addWidget(self.lineEdit_detect_Jpeaks_bandpass_high, 0, 3, 1, 1)
+ self.gridLayout_69.addWidget(self.groupBox_detect_Jpeaks_filter_args, 1, 0, 1, 2)
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_69.addItem(spacerItem, 3, 0, 1, 2)
+ self.gridLayout_69.setColumnStretch(0, 1)
+ self.gridLayout_69.setColumnStretch(1, 1)
+ self.gridLayout_69.setRowStretch(0, 2)
+ self.gridLayout_69.setRowStretch(1, 1)
+ self.gridLayout_69.setRowStretch(2, 5)
+ self.gridLayout_69.setRowStretch(3, 3)
+ self.gridLayout_69.setRowStretch(4, 1)
+ self.gridLayout.addWidget(self.groupBox_detect_Jpeaks, 0, 0, 1, 1)
+
+ self.retranslateUi(widget_detect_Jpeaks)
+ QtCore.QMetaObject.connectSlotsByName(widget_detect_Jpeaks)
+
+ def retranslateUi(self, widget_detect_Jpeaks):
+ _translate = QtCore.QCoreApplication.translate
+ widget_detect_Jpeaks.setWindowTitle(_translate("widget_detect_Jpeaks", "Form"))
+ self.groupBox_detect_Jpeaks.setTitle(_translate("widget_detect_Jpeaks", "BCG的J峰提取"))
+ self.pushButton_detect_Jpeaks_save.setText(_translate("widget_detect_Jpeaks", "保存结果"))
+ self.groupBox_detect_Jpeaks_inputFile_check.setTitle(_translate("widget_detect_Jpeaks", "程序识别到的文件路径"))
+ self.label_15.setText(_translate("widget_detect_Jpeaks", "保存路径"))
+ self.lineEdit_detect_Jpeaks_DSbcg_sig_1000hz3_path.setPlaceholderText(_translate("widget_detect_Jpeaks", "DSbcg_sig_1000hz3.txt文件路径"))
+ self.lineEdit_detect_Jpeaks_save_path.setPlaceholderText(_translate("widget_detect_Jpeaks", "文件保存路径"))
+ self.label_14.setText(_translate("widget_detect_Jpeaks", "DSbcg_sig_1000hz3.txt"))
+ self.pushButton_detect_Jpeaks_view.setText(_translate("widget_detect_Jpeaks", "查看结果"))
+ self.groupBox_detect_Jpeaks_input_args.setTitle(_translate("widget_detect_Jpeaks", "参数输入"))
+ self.lineEdit_detect_Jpeaks_peaks_value.setText(_translate("widget_detect_Jpeaks", "100"))
+ self.radioButton_Fivelayer_Unet_2.setText(_translate("widget_detect_Jpeaks", "2"))
+ self.label_23.setText(_translate("widget_detect_Jpeaks", "Fivelayer_Unet"))
+ self.label_20.setText(_translate("widget_detect_Jpeaks", "J峰检测方法选择(建议优先选择1)"))
+ self.label_21.setText(_translate("widget_detect_Jpeaks", "间期下限和上限阈值"))
+ self.label_16.setText(_translate("widget_detect_Jpeaks", "信号采样率(Hz)"))
+ self.lineEdit_detect_Jpeaks_interval_low.setText(_translate("widget_detect_Jpeaks", "50"))
+ self.lineEdit_detect_Jpeaks_interval_high.setText(_translate("widget_detect_Jpeaks", "140"))
+ self.label_22.setText(_translate("widget_detect_Jpeaks", "~"))
+ self.label_25.setStatusTip(_translate("widget_detect_Jpeaks", "信号幅值调整参数:信号最高幅值尽量在100~250之间,该值为原始信号幅度的倍数"))
+ self.label_25.setText(_translate("widget_detect_Jpeaks", "信号幅值调整参数"))
+ self.radioButton_Fivelayer_Unet_1.setText(_translate("widget_detect_Jpeaks", "1"))
+ self.radioButton_Fivelayer_Lstm_Unet_2.setText(_translate("widget_detect_Jpeaks", "2"))
+ self.lineEdit_detect_Jpeaks_sampling_rate.setText(_translate("widget_detect_Jpeaks", "1000"))
+ self.label_17.setStatusTip(_translate("widget_detect_Jpeaks", "寻峰阈值(个):找左右若干个点的最高峰"))
+ self.label_17.setText(_translate("widget_detect_Jpeaks", "寻峰阈值(个)"))
+ self.label_24.setText(_translate("widget_detect_Jpeaks", "Fivelayer_Lstm_Unet"))
+ self.radioButton_Fivelayer_Lstm_Unet_1.setText(_translate("widget_detect_Jpeaks", "1"))
+ self.lineEdit_detect_Jpeaks_amp_value.setText(_translate("widget_detect_Jpeaks", "5"))
+ self.checkBox_useCPU.setText(_translate("widget_detect_Jpeaks", "强制使用CPU"))
+ self.groupBox_detect_Jpeaks_filter_args.setTitle(_translate("widget_detect_Jpeaks", "BCG信号滤波参数输入"))
+ self.label_19.setText(_translate("widget_detect_Jpeaks", "~"))
+ self.label_18.setText(_translate("widget_detect_Jpeaks", "带通滤波截止频率(Hz)"))
+ self.lineEdit_detect_Jpeaks_bandpass_low.setText(_translate("widget_detect_Jpeaks", "2"))
+ self.lineEdit_detect_Jpeaks_bandpass_high.setText(_translate("widget_detect_Jpeaks", "10"))
diff --git a/ui/widget_detect_Jpeaks.ui b/ui/widget_detect_Jpeaks.ui
new file mode 100644
index 0000000..7691dee
--- /dev/null
+++ b/ui/widget_detect_Jpeaks.ui
@@ -0,0 +1,605 @@
+
+
+ widget_detect_Jpeaks
+
+
+
+ 0
+ 0
+ 398
+ 893
+
+
+
+ Form
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ BCG的J峰提取
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 程序识别到的文件路径
+
+
+
-
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存路径
+
+
+
+ -
+
+
+ false
+
+
+
+ 黑体
+ 10
+
+
+
+ DSbcg_sig_1000hz3.txt文件路径
+
+
+
+ -
+
+
+
+ 黑体
+ 10
+
+
+
+ 文件保存路径
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ DSbcg_sig_1000hz3.txt
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 查看结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ <J峰提取>参数输入
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 100
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 2
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ Fivelayer_Unet
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ J峰检测方法选择(建议优先选择1)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 间期下限和上限阈值
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 信号采样率(Hz)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 50
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 140
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ ~
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 信号幅值调整参数:信号最高幅值尽量在100~250之间,该值为原始信号幅度的倍数
+
+
+
+
+
+ 信号幅值调整参数
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 1
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 2
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 1000
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 寻峰阈值(个):找左右若干个点的最高峰
+
+
+
+
+
+ 寻峰阈值(个)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ Fivelayer_Lstm_Unet
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 5
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 强制使用CPU
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ BCG信号滤波参数输入
+
+
+
-
+
+
+
+ 黑体
+ 14
+
+
+
+ ~
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 带通滤波截止频率(Hz)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 2
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/widget_detect_Rpeaks.py b/ui/widget_detect_Rpeaks.py
new file mode 100644
index 0000000..5262ae5
--- /dev/null
+++ b/ui/widget_detect_Rpeaks.py
@@ -0,0 +1,332 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'widget_detect_Rpeaks.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_widget_detect_Rpeaks(object):
+ def setupUi(self, widget_detect_Rpeaks):
+ widget_detect_Rpeaks.setObjectName("widget_detect_Rpeaks")
+ widget_detect_Rpeaks.resize(386, 957)
+ self.gridLayout = QtWidgets.QGridLayout(widget_detect_Rpeaks)
+ self.gridLayout.setObjectName("gridLayout")
+ self.groupBox_detect_Rpeaks = QtWidgets.QGroupBox(widget_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Rpeaks.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Rpeaks.setFont(font)
+ self.groupBox_detect_Rpeaks.setObjectName("groupBox_detect_Rpeaks")
+ self.gridLayout_67 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks)
+ self.gridLayout_67.setObjectName("gridLayout_67")
+ self.groupBox_detect_Rpeaks_signal_parts_list = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_signal_parts_list.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Rpeaks_signal_parts_list.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Rpeaks_signal_parts_list.setFont(font)
+ self.groupBox_detect_Rpeaks_signal_parts_list.setObjectName("groupBox_detect_Rpeaks_signal_parts_list")
+ self.gridLayout_74 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_signal_parts_list)
+ self.gridLayout_74.setObjectName("gridLayout_74")
+ self.pushButton_detect_Rpeaks_left = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks_signal_parts_list)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_left.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Rpeaks_left.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Rpeaks_left.setFont(font)
+ self.pushButton_detect_Rpeaks_left.setObjectName("pushButton_detect_Rpeaks_left")
+ self.gridLayout_74.addWidget(self.pushButton_detect_Rpeaks_left, 0, 2, 1, 1)
+ self.pushButton_detect_Rpeaks_right = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks_signal_parts_list)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_right.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Rpeaks_right.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Rpeaks_right.setFont(font)
+ self.pushButton_detect_Rpeaks_right.setObjectName("pushButton_detect_Rpeaks_right")
+ self.gridLayout_74.addWidget(self.pushButton_detect_Rpeaks_right, 1, 2, 1, 1)
+ self.tableWidget_detect_Rpeaks_signal_parts_list = QtWidgets.QTableWidget(self.groupBox_detect_Rpeaks_signal_parts_list)
+ self.tableWidget_detect_Rpeaks_signal_parts_list.setColumnCount(1)
+ self.tableWidget_detect_Rpeaks_signal_parts_list.setObjectName("tableWidget_detect_Rpeaks_signal_parts_list")
+ self.tableWidget_detect_Rpeaks_signal_parts_list.setRowCount(0)
+ self.tableWidget_detect_Rpeaks_signal_parts_list.verticalHeader().setVisible(False)
+ self.gridLayout_74.addWidget(self.tableWidget_detect_Rpeaks_signal_parts_list, 0, 0, 2, 2)
+ self.gridLayout_74.setColumnStretch(0, 1)
+ self.gridLayout_74.setColumnStretch(1, 1)
+ self.gridLayout_74.setColumnStretch(2, 1)
+ self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_signal_parts_list, 2, 0, 1, 2)
+ self.groupBox_detect_Rpeaks_input_args = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_input_args.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Rpeaks_input_args.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Rpeaks_input_args.setFont(font)
+ self.groupBox_detect_Rpeaks_input_args.setObjectName("groupBox_detect_Rpeaks_input_args")
+ self.gridLayout_73 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_input_args)
+ self.gridLayout_73.setObjectName("gridLayout_73")
+ self.radioButton_detector_method_Wt = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_detector_method_Wt.setFont(font)
+ self.radioButton_detector_method_Wt.setObjectName("radioButton_detector_method_Wt")
+ self.gridLayout_73.addWidget(self.radioButton_detector_method_Wt, 6, 0, 1, 1)
+ self.label_9 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_9.setFont(font)
+ self.label_9.setObjectName("label_9")
+ self.gridLayout_73.addWidget(self.label_9, 0, 0, 1, 1)
+ self.lineEdit_detect_Rpeaks_bandpass_low = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Rpeaks_bandpass_low.setFont(font)
+ self.lineEdit_detect_Rpeaks_bandpass_low.setPlaceholderText("")
+ self.lineEdit_detect_Rpeaks_bandpass_low.setObjectName("lineEdit_detect_Rpeaks_bandpass_low")
+ self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_bandpass_low, 2, 1, 1, 1)
+ self.radioButton_detector_method_ta = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_detector_method_ta.setFont(font)
+ self.radioButton_detector_method_ta.setObjectName("radioButton_detector_method_ta")
+ self.gridLayout_73.addWidget(self.radioButton_detector_method_ta, 4, 1, 1, 3)
+ self.label_11 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_11.setFont(font)
+ self.label_11.setObjectName("label_11")
+ self.gridLayout_73.addWidget(self.label_11, 1, 0, 1, 1)
+ self.radioButton_detector_method_Hamilton = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_detector_method_Hamilton.setFont(font)
+ self.radioButton_detector_method_Hamilton.setObjectName("radioButton_detector_method_Hamilton")
+ self.gridLayout_73.addWidget(self.radioButton_detector_method_Hamilton, 6, 1, 1, 3)
+ self.lineEdit_detect_Rpeaks_sampling_rate = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Rpeaks_sampling_rate.setFont(font)
+ self.lineEdit_detect_Rpeaks_sampling_rate.setPlaceholderText("")
+ self.lineEdit_detect_Rpeaks_sampling_rate.setObjectName("lineEdit_detect_Rpeaks_sampling_rate")
+ self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_sampling_rate, 0, 1, 1, 3)
+ self.label_12 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_12.setFont(font)
+ self.label_12.setObjectName("label_12")
+ self.gridLayout_73.addWidget(self.label_12, 2, 0, 1, 1)
+ self.radioButton_detector_method_pt = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_detector_method_pt.setFont(font)
+ self.radioButton_detector_method_pt.setChecked(True)
+ self.radioButton_detector_method_pt.setObjectName("radioButton_detector_method_pt")
+ self.gridLayout_73.addWidget(self.radioButton_detector_method_pt, 4, 0, 1, 1)
+ self.radioButton_detector_method_Engzee = QtWidgets.QRadioButton(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.radioButton_detector_method_Engzee.setFont(font)
+ self.radioButton_detector_method_Engzee.setObjectName("radioButton_detector_method_Engzee")
+ self.gridLayout_73.addWidget(self.radioButton_detector_method_Engzee, 8, 0, 1, 1)
+ self.lineEdit_detect_Rpeaks_bandpass_high = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Rpeaks_bandpass_high.setFont(font)
+ self.lineEdit_detect_Rpeaks_bandpass_high.setPlaceholderText("")
+ self.lineEdit_detect_Rpeaks_bandpass_high.setObjectName("lineEdit_detect_Rpeaks_bandpass_high")
+ self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_bandpass_high, 2, 3, 1, 1)
+ self.lineEdit_detect_Rpeaks_peaks_value = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_detect_Rpeaks_peaks_value.setFont(font)
+ self.lineEdit_detect_Rpeaks_peaks_value.setPlaceholderText("")
+ self.lineEdit_detect_Rpeaks_peaks_value.setObjectName("lineEdit_detect_Rpeaks_peaks_value")
+ self.gridLayout_73.addWidget(self.lineEdit_detect_Rpeaks_peaks_value, 1, 1, 1, 3)
+ self.label_13 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_13.setFont(font)
+ self.label_13.setObjectName("label_13")
+ self.gridLayout_73.addWidget(self.label_13, 2, 2, 1, 1)
+ self.label_10 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_input_args)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_10.sizePolicy().hasHeightForWidth())
+ self.label_10.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_10.setFont(font)
+ self.label_10.setObjectName("label_10")
+ self.gridLayout_73.addWidget(self.label_10, 3, 0, 1, 4)
+ self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_input_args, 1, 0, 1, 2)
+ self.pushButton_detect_Rpeaks_view = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_view.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Rpeaks_view.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Rpeaks_view.setFont(font)
+ self.pushButton_detect_Rpeaks_view.setObjectName("pushButton_detect_Rpeaks_view")
+ self.gridLayout_67.addWidget(self.pushButton_detect_Rpeaks_view, 4, 0, 1, 1)
+ self.pushButton_detect_Rpeaks_save = QtWidgets.QPushButton(self.groupBox_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks_save.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Rpeaks_save.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_detect_Rpeaks_save.setFont(font)
+ self.pushButton_detect_Rpeaks_save.setObjectName("pushButton_detect_Rpeaks_save")
+ self.gridLayout_67.addWidget(self.pushButton_detect_Rpeaks_save, 4, 1, 1, 1)
+ self.groupBox_detect_Rpeaks_inputFile_check = QtWidgets.QGroupBox(self.groupBox_detect_Rpeaks)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_detect_Rpeaks_inputFile_check.sizePolicy().hasHeightForWidth())
+ self.groupBox_detect_Rpeaks_inputFile_check.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_detect_Rpeaks_inputFile_check.setFont(font)
+ self.groupBox_detect_Rpeaks_inputFile_check.setObjectName("groupBox_detect_Rpeaks_inputFile_check")
+ self.gridLayout_72 = QtWidgets.QGridLayout(self.groupBox_detect_Rpeaks_inputFile_check)
+ self.gridLayout_72.setObjectName("gridLayout_72")
+ self.lineEdit_detect_Rpeaks_filter_ecg_path = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_inputFile_check)
+ self.lineEdit_detect_Rpeaks_filter_ecg_path.setEnabled(False)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_detect_Rpeaks_filter_ecg_path.setFont(font)
+ self.lineEdit_detect_Rpeaks_filter_ecg_path.setObjectName("lineEdit_detect_Rpeaks_filter_ecg_path")
+ self.gridLayout_72.addWidget(self.lineEdit_detect_Rpeaks_filter_ecg_path, 1, 0, 1, 1)
+ self.label_7 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_7.setFont(font)
+ self.label_7.setObjectName("label_7")
+ self.gridLayout_72.addWidget(self.label_7, 0, 0, 1, 1)
+ self.textBrowser = QtWidgets.QTextBrowser(self.groupBox_detect_Rpeaks_inputFile_check)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.textBrowser.sizePolicy().hasHeightForWidth())
+ self.textBrowser.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(12)
+ self.textBrowser.setFont(font)
+ self.textBrowser.setStyleSheet("background-color: rgb(85, 255, 255);")
+ self.textBrowser.setObjectName("textBrowser")
+ self.gridLayout_72.addWidget(self.textBrowser, 4, 0, 1, 1)
+ self.label_8 = QtWidgets.QLabel(self.groupBox_detect_Rpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_8.setFont(font)
+ self.label_8.setObjectName("label_8")
+ self.gridLayout_72.addWidget(self.label_8, 2, 0, 1, 1)
+ self.lineEdit_detect_Rpeaks_save_path = QtWidgets.QLineEdit(self.groupBox_detect_Rpeaks_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_detect_Rpeaks_save_path.setFont(font)
+ self.lineEdit_detect_Rpeaks_save_path.setObjectName("lineEdit_detect_Rpeaks_save_path")
+ self.gridLayout_72.addWidget(self.lineEdit_detect_Rpeaks_save_path, 3, 0, 1, 1)
+ self.gridLayout_72.setRowStretch(0, 1)
+ self.gridLayout_72.setRowStretch(1, 1)
+ self.gridLayout_72.setRowStretch(2, 1)
+ self.gridLayout_72.setRowStretch(3, 1)
+ self.gridLayout_72.setRowStretch(4, 2)
+ self.gridLayout_67.addWidget(self.groupBox_detect_Rpeaks_inputFile_check, 0, 0, 1, 2)
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_67.addItem(spacerItem, 3, 0, 1, 2)
+ self.gridLayout_67.setRowStretch(0, 4)
+ self.gridLayout_67.setRowStretch(1, 4)
+ self.gridLayout_67.setRowStretch(2, 4)
+ self.gridLayout_67.setRowStretch(3, 1)
+ self.gridLayout_67.setRowStretch(4, 1)
+ self.gridLayout.addWidget(self.groupBox_detect_Rpeaks, 0, 0, 1, 1)
+
+ self.retranslateUi(widget_detect_Rpeaks)
+ QtCore.QMetaObject.connectSlotsByName(widget_detect_Rpeaks)
+
+ def retranslateUi(self, widget_detect_Rpeaks):
+ _translate = QtCore.QCoreApplication.translate
+ widget_detect_Rpeaks.setWindowTitle(_translate("widget_detect_Rpeaks", "Form"))
+ self.groupBox_detect_Rpeaks.setTitle(_translate("widget_detect_Rpeaks", "ECG的R峰提取"))
+ self.groupBox_detect_Rpeaks_signal_parts_list.setTitle(_translate("widget_detect_Rpeaks", "信号片段列表"))
+ self.pushButton_detect_Rpeaks_left.setText(_translate("widget_detect_Rpeaks", "上一个"))
+ self.pushButton_detect_Rpeaks_right.setText(_translate("widget_detect_Rpeaks", "下一个"))
+ self.groupBox_detect_Rpeaks_input_args.setTitle(_translate("widget_detect_Rpeaks", "参数输入"))
+ self.radioButton_detector_method_Wt.setText(_translate("widget_detect_Rpeaks", "Wt"))
+ self.label_9.setText(_translate("widget_detect_Rpeaks", "信号采样率(Hz)"))
+ self.lineEdit_detect_Rpeaks_bandpass_low.setText(_translate("widget_detect_Rpeaks", "2"))
+ self.radioButton_detector_method_ta.setText(_translate("widget_detect_Rpeaks", "ta"))
+ self.label_11.setText(_translate("widget_detect_Rpeaks", "寻峰阈值(个)"))
+ self.radioButton_detector_method_Hamilton.setText(_translate("widget_detect_Rpeaks", "Hamilton"))
+ self.lineEdit_detect_Rpeaks_sampling_rate.setText(_translate("widget_detect_Rpeaks", "1000"))
+ self.label_12.setText(_translate("widget_detect_Rpeaks", "带通滤波截止频率(Hz)"))
+ self.radioButton_detector_method_pt.setText(_translate("widget_detect_Rpeaks", "pt"))
+ self.radioButton_detector_method_Engzee.setText(_translate("widget_detect_Rpeaks", "Engzee"))
+ self.lineEdit_detect_Rpeaks_bandpass_high.setText(_translate("widget_detect_Rpeaks", "15"))
+ self.lineEdit_detect_Rpeaks_peaks_value.setText(_translate("widget_detect_Rpeaks", "200"))
+ self.label_13.setText(_translate("widget_detect_Rpeaks", "~"))
+ self.label_10.setText(_translate("widget_detect_Rpeaks", "R峰检测方法选择(一般选pt)"))
+ self.pushButton_detect_Rpeaks_view.setText(_translate("widget_detect_Rpeaks", "查看结果"))
+ self.pushButton_detect_Rpeaks_save.setText(_translate("widget_detect_Rpeaks", "保存结果"))
+ self.groupBox_detect_Rpeaks_inputFile_check.setTitle(_translate("widget_detect_Rpeaks", "程序识别到的文件路径"))
+ self.lineEdit_detect_Rpeaks_filter_ecg_path.setPlaceholderText(_translate("widget_detect_Rpeaks", "filter_ecg.txt文件路径"))
+ self.label_7.setText(_translate("widget_detect_Rpeaks", "filter_ecg.txt"))
+ self.textBrowser.setHtml(_translate("widget_detect_Rpeaks", "\n"
+"\n"
+"将在此目录的文件夹下生成一一对应的hecg.txt和hRpeak.txt若干个
"))
+ self.label_8.setText(_translate("widget_detect_Rpeaks", "保存路径"))
+ self.lineEdit_detect_Rpeaks_save_path.setPlaceholderText(_translate("widget_detect_Rpeaks", "文件保存路径"))
diff --git a/ui/widget_detect_Rpeaks.ui b/ui/widget_detect_Rpeaks.ui
new file mode 100644
index 0000000..757e486
--- /dev/null
+++ b/ui/widget_detect_Rpeaks.ui
@@ -0,0 +1,489 @@
+
+
+ widget_detect_Rpeaks
+
+
+
+ 0
+ 0
+ 386
+ 957
+
+
+
+ Form
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ ECG的R峰提取
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 信号片段列表
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 上一个
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 下一个
+
+
+
+ -
+
+
+ 1
+
+
+ false
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ <R峰提取>参数输入
+
+
+
-
+
+
+
+ 黑体
+ 14
+
+
+
+ Wt
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 信号采样率(Hz)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 2
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ ta
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 寻峰阈值(个)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ Hamilton
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 1000
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 带通滤波截止频率(Hz)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ pt
+
+
+ true
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ Engzee
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 15
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 200
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ ~
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ R峰检测方法选择(一般选pt)
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 查看结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 程序识别到的文件路径
+
+
+
-
+
+
+ false
+
+
+
+ 黑体
+ 10
+
+
+
+ filter_ecg.txt文件路径
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ filter_ecg.txt
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 12
+
+
+
+ background-color: rgb(85, 255, 255);
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'黑体','黑体','黑体'; font-size:12pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'黑体','黑体';">将在此目录的文件夹下生成一一对应的hecg.txt和hRpeak.txt若干个</span></p></body></html>
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存路径
+
+
+
+ -
+
+
+
+ 黑体
+ 10
+
+
+
+ 文件保存路径
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/widget_func.py b/ui/widget_func.py
new file mode 100644
index 0000000..379687e
--- /dev/null
+++ b/ui/widget_func.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'widget_func.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_widget_func(object):
+ def setupUi(self, widget_func):
+ widget_func.setObjectName("widget_func")
+ widget_func.resize(568, 943)
+ self.gridLayout = QtWidgets.QGridLayout(widget_func)
+ self.gridLayout.setObjectName("gridLayout")
+ self.groupBox_func_select = QtWidgets.QGroupBox(widget_func)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_func_select.setFont(font)
+ self.groupBox_func_select.setObjectName("groupBox_func_select")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_func_select)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_2.addItem(spacerItem, 6, 1, 1, 2)
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.gridLayout_2.addItem(spacerItem1, 0, 3, 9, 1)
+ self.pushButton_detect_Rpeaks = QtWidgets.QPushButton(self.groupBox_func_select)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Rpeaks.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Rpeaks.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(24)
+ self.pushButton_detect_Rpeaks.setFont(font)
+ self.pushButton_detect_Rpeaks.setObjectName("pushButton_detect_Rpeaks")
+ self.gridLayout_2.addWidget(self.pushButton_detect_Rpeaks, 5, 1, 1, 2)
+ spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_2.addItem(spacerItem2, 2, 1, 1, 2)
+ spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_2.addItem(spacerItem3, 4, 1, 1, 2)
+ spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_2.addItem(spacerItem4, 0, 1, 1, 2)
+ self.pushButton_detect_Jpeaks = QtWidgets.QPushButton(self.groupBox_func_select)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_detect_Jpeaks.sizePolicy().hasHeightForWidth())
+ self.pushButton_detect_Jpeaks.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(24)
+ self.pushButton_detect_Jpeaks.setFont(font)
+ self.pushButton_detect_Jpeaks.setObjectName("pushButton_detect_Jpeaks")
+ self.gridLayout_2.addWidget(self.pushButton_detect_Jpeaks, 7, 1, 1, 2)
+ self.pushButton_rootpath_open = QtWidgets.QPushButton(self.groupBox_func_select)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_rootpath_open.setFont(font)
+ self.pushButton_rootpath_open.setObjectName("pushButton_rootpath_open")
+ self.gridLayout_2.addWidget(self.pushButton_rootpath_open, 1, 2, 1, 1)
+ self.pushButton_resample1000Hz = QtWidgets.QPushButton(self.groupBox_func_select)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz.sizePolicy().hasHeightForWidth())
+ self.pushButton_resample1000Hz.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(24)
+ self.pushButton_resample1000Hz.setFont(font)
+ self.pushButton_resample1000Hz.setObjectName("pushButton_resample1000Hz")
+ self.gridLayout_2.addWidget(self.pushButton_resample1000Hz, 3, 1, 1, 2)
+ self.lineEdit_rootpath = QtWidgets.QLineEdit(self.groupBox_func_select)
+ font = QtGui.QFont()
+ font.setFamily("Times New Roman")
+ font.setPointSize(14)
+ self.lineEdit_rootpath.setFont(font)
+ self.lineEdit_rootpath.setObjectName("lineEdit_rootpath")
+ self.gridLayout_2.addWidget(self.lineEdit_rootpath, 1, 1, 1, 1)
+ spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.gridLayout_2.addItem(spacerItem5, 0, 0, 9, 1)
+ spacerItem6 = QtWidgets.QSpacerItem(518, 57, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_2.addItem(spacerItem6, 8, 1, 1, 2)
+ self.gridLayout_2.setColumnStretch(0, 2)
+ self.gridLayout_2.setRowStretch(0, 2)
+ self.gridLayout_2.setRowStretch(1, 2)
+ self.gridLayout_2.setRowStretch(2, 2)
+ self.gridLayout_2.setRowStretch(3, 3)
+ self.gridLayout_2.setRowStretch(4, 2)
+ self.gridLayout_2.setRowStretch(5, 3)
+ self.gridLayout_2.setRowStretch(6, 2)
+ self.gridLayout_2.setRowStretch(7, 3)
+ self.gridLayout_2.setRowStretch(8, 2)
+ self.gridLayout.addWidget(self.groupBox_func_select, 0, 0, 1, 1)
+
+ self.retranslateUi(widget_func)
+ QtCore.QMetaObject.connectSlotsByName(widget_func)
+
+ def retranslateUi(self, widget_func):
+ _translate = QtCore.QCoreApplication.translate
+ widget_func.setWindowTitle(_translate("widget_func", "Form"))
+ self.groupBox_func_select.setTitle(_translate("widget_func", "功能选择"))
+ self.pushButton_detect_Rpeaks.setText(_translate("widget_func", "ECG的R峰提取"))
+ self.pushButton_detect_Jpeaks.setText(_translate("widget_func", "BCG的J峰提取"))
+ self.pushButton_rootpath_open.setText(_translate("widget_func", "浏览"))
+ self.pushButton_resample1000Hz.setText(_translate("widget_func", "重采样至1000Hz"))
+ self.lineEdit_rootpath.setPlaceholderText(_translate("widget_func", "数据根目录"))
diff --git a/ui/widget_func.ui b/ui/widget_func.ui
new file mode 100644
index 0000000..bae7ff7
--- /dev/null
+++ b/ui/widget_func.ui
@@ -0,0 +1,210 @@
+
+
+ widget_func
+
+
+
+ 0
+ 0
+ 568
+ 943
+
+
+
+ Form
+
+
+ -
+
+
+
+ 黑体
+ 10
+
+
+
+ 功能选择
+
+
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 24
+
+
+
+ ECG的R峰提取
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 24
+
+
+
+ BCG的J峰提取
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 浏览
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 24
+
+
+
+ 重采样至1000Hz
+
+
+
+ -
+
+
+
+ Times New Roman
+ 14
+
+
+
+ 数据根目录
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 518
+ 57
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/widget_resample1000Hz.py b/ui/widget_resample1000Hz.py
new file mode 100644
index 0000000..9a10c83
--- /dev/null
+++ b/ui/widget_resample1000Hz.py
@@ -0,0 +1,209 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'widget_resample1000Hz.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_widget_resample1000Hz(object):
+ def setupUi(self, widget_resample1000Hz):
+ widget_resample1000Hz.setObjectName("widget_resample1000Hz")
+ widget_resample1000Hz.resize(370, 977)
+ self.gridLayout = QtWidgets.QGridLayout(widget_resample1000Hz)
+ self.gridLayout.setObjectName("gridLayout")
+ self.groupBox_resample1000Hz = QtWidgets.QGroupBox(widget_resample1000Hz)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz.sizePolicy().hasHeightForWidth())
+ self.groupBox_resample1000Hz.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_resample1000Hz.setFont(font)
+ self.groupBox_resample1000Hz.setObjectName("groupBox_resample1000Hz")
+ self.gridLayout_64 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz)
+ self.gridLayout_64.setObjectName("gridLayout_64")
+ self.pushButton_resample1000Hz_view = QtWidgets.QPushButton(self.groupBox_resample1000Hz)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz_view.sizePolicy().hasHeightForWidth())
+ self.pushButton_resample1000Hz_view.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_resample1000Hz_view.setFont(font)
+ self.pushButton_resample1000Hz_view.setObjectName("pushButton_resample1000Hz_view")
+ self.gridLayout_64.addWidget(self.pushButton_resample1000Hz_view, 3, 0, 1, 1)
+ self.groupBox_resample1000Hz_inputFile_check = QtWidgets.QGroupBox(self.groupBox_resample1000Hz)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz_inputFile_check.sizePolicy().hasHeightForWidth())
+ self.groupBox_resample1000Hz_inputFile_check.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_resample1000Hz_inputFile_check.setFont(font)
+ self.groupBox_resample1000Hz_inputFile_check.setObjectName("groupBox_resample1000Hz_inputFile_check")
+ self.gridLayout_70 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz_inputFile_check)
+ self.gridLayout_70.setObjectName("gridLayout_70")
+ self.lineEdit_resample1000Hz_DSbcg_sig_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
+ self.lineEdit_resample1000Hz_DSbcg_sig_path.setEnabled(False)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_resample1000Hz_DSbcg_sig_path.setFont(font)
+ self.lineEdit_resample1000Hz_DSbcg_sig_path.setObjectName("lineEdit_resample1000Hz_DSbcg_sig_path")
+ self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_DSbcg_sig_path, 3, 0, 1, 1)
+ self.label_4 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_4.setFont(font)
+ self.label_4.setObjectName("label_4")
+ self.gridLayout_70.addWidget(self.label_4, 0, 0, 1, 1)
+ self.label_6 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_6.setFont(font)
+ self.label_6.setObjectName("label_6")
+ self.gridLayout_70.addWidget(self.label_6, 4, 0, 1, 1)
+ self.lineEdit_resample1000Hz_raw_org_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
+ self.lineEdit_resample1000Hz_raw_org_path.setEnabled(False)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_resample1000Hz_raw_org_path.setFont(font)
+ self.lineEdit_resample1000Hz_raw_org_path.setObjectName("lineEdit_resample1000Hz_raw_org_path")
+ self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_raw_org_path, 1, 0, 1, 1)
+ self.label_5 = QtWidgets.QLabel(self.groupBox_resample1000Hz_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_5.setFont(font)
+ self.label_5.setObjectName("label_5")
+ self.gridLayout_70.addWidget(self.label_5, 2, 0, 1, 1)
+ self.lineEdit_resample1000Hz_save_path = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_inputFile_check)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.lineEdit_resample1000Hz_save_path.setFont(font)
+ self.lineEdit_resample1000Hz_save_path.setObjectName("lineEdit_resample1000Hz_save_path")
+ self.gridLayout_70.addWidget(self.lineEdit_resample1000Hz_save_path, 5, 0, 1, 1)
+ self.gridLayout_64.addWidget(self.groupBox_resample1000Hz_inputFile_check, 0, 0, 1, 2)
+ self.pushButton_resample1000Hz_save = QtWidgets.QPushButton(self.groupBox_resample1000Hz)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.pushButton_resample1000Hz_save.sizePolicy().hasHeightForWidth())
+ self.pushButton_resample1000Hz_save.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.pushButton_resample1000Hz_save.setFont(font)
+ self.pushButton_resample1000Hz_save.setObjectName("pushButton_resample1000Hz_save")
+ self.gridLayout_64.addWidget(self.pushButton_resample1000Hz_save, 3, 1, 1, 1)
+ self.groupBox_resample1000Hz_input_args = QtWidgets.QGroupBox(self.groupBox_resample1000Hz)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_resample1000Hz_input_args.sizePolicy().hasHeightForWidth())
+ self.groupBox_resample1000Hz_input_args.setSizePolicy(sizePolicy)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(10)
+ self.groupBox_resample1000Hz_input_args.setFont(font)
+ self.groupBox_resample1000Hz_input_args.setObjectName("groupBox_resample1000Hz_input_args")
+ self.gridLayout_71 = QtWidgets.QGridLayout(self.groupBox_resample1000Hz_input_args)
+ self.gridLayout_71.setObjectName("gridLayout_71")
+ self.lineEdit_resample1000Hz_original_sampling_rate = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_resample1000Hz_original_sampling_rate.setFont(font)
+ self.lineEdit_resample1000Hz_original_sampling_rate.setPlaceholderText("")
+ self.lineEdit_resample1000Hz_original_sampling_rate.setObjectName("lineEdit_resample1000Hz_original_sampling_rate")
+ self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_original_sampling_rate, 0, 1, 1, 1)
+ self.label_3 = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_3.setFont(font)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout_71.addWidget(self.label_3, 1, 0, 1, 1)
+ self.lineEdit_resample1000Hz_target_sampling_rate = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_resample1000Hz_target_sampling_rate.setFont(font)
+ self.lineEdit_resample1000Hz_target_sampling_rate.setPlaceholderText("")
+ self.lineEdit_resample1000Hz_target_sampling_rate.setObjectName("lineEdit_resample1000Hz_target_sampling_rate")
+ self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_target_sampling_rate, 1, 1, 1, 1)
+ self.label_2 = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label_2.setFont(font)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout_71.addWidget(self.label_2, 0, 0, 1, 1)
+ self.label = QtWidgets.QLabel(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridLayout_71.addWidget(self.label, 2, 0, 1, 1)
+ self.lineEdit_resample1000Hz_cut_second = QtWidgets.QLineEdit(self.groupBox_resample1000Hz_input_args)
+ font = QtGui.QFont()
+ font.setFamily("黑体")
+ font.setPointSize(14)
+ self.lineEdit_resample1000Hz_cut_second.setFont(font)
+ self.lineEdit_resample1000Hz_cut_second.setPlaceholderText("")
+ self.lineEdit_resample1000Hz_cut_second.setObjectName("lineEdit_resample1000Hz_cut_second")
+ self.gridLayout_71.addWidget(self.lineEdit_resample1000Hz_cut_second, 2, 1, 1, 1)
+ self.gridLayout_64.addWidget(self.groupBox_resample1000Hz_input_args, 1, 0, 1, 2)
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.gridLayout_64.addItem(spacerItem, 2, 0, 1, 2)
+ self.gridLayout_64.setColumnStretch(0, 1)
+ self.gridLayout_64.setColumnStretch(1, 1)
+ self.gridLayout_64.setRowStretch(0, 5)
+ self.gridLayout_64.setRowStretch(1, 4)
+ self.gridLayout_64.setRowStretch(2, 5)
+ self.gridLayout_64.setRowStretch(3, 2)
+ self.pushButton_resample1000Hz_view.raise_()
+ self.pushButton_resample1000Hz_save.raise_()
+ self.groupBox_resample1000Hz_input_args.raise_()
+ self.groupBox_resample1000Hz_inputFile_check.raise_()
+ self.gridLayout.addWidget(self.groupBox_resample1000Hz, 0, 0, 1, 1)
+
+ self.retranslateUi(widget_resample1000Hz)
+ QtCore.QMetaObject.connectSlotsByName(widget_resample1000Hz)
+
+ def retranslateUi(self, widget_resample1000Hz):
+ _translate = QtCore.QCoreApplication.translate
+ widget_resample1000Hz.setWindowTitle(_translate("widget_resample1000Hz", "Form"))
+ self.groupBox_resample1000Hz.setTitle(_translate("widget_resample1000Hz", "重采样至1000Hz"))
+ self.pushButton_resample1000Hz_view.setText(_translate("widget_resample1000Hz", "查看结果"))
+ self.groupBox_resample1000Hz_inputFile_check.setTitle(_translate("widget_resample1000Hz", "程序识别到的文件路径"))
+ self.lineEdit_resample1000Hz_DSbcg_sig_path.setPlaceholderText(_translate("widget_resample1000Hz", "DSbcg_sig.txt文件路径"))
+ self.label_4.setText(_translate("widget_resample1000Hz", "raw_org.txt"))
+ self.label_6.setText(_translate("widget_resample1000Hz", "保存路径"))
+ self.lineEdit_resample1000Hz_raw_org_path.setPlaceholderText(_translate("widget_resample1000Hz", "raw_org.txt文件路径"))
+ self.label_5.setText(_translate("widget_resample1000Hz", "DSbcg_sig.txt"))
+ self.lineEdit_resample1000Hz_save_path.setPlaceholderText(_translate("widget_resample1000Hz", "文件保存路径"))
+ self.pushButton_resample1000Hz_save.setText(_translate("widget_resample1000Hz", "保存结果"))
+ self.groupBox_resample1000Hz_input_args.setTitle(_translate("widget_resample1000Hz", "<重采样>参数输入"))
+ self.lineEdit_resample1000Hz_original_sampling_rate.setText(_translate("widget_resample1000Hz", "100"))
+ self.label_3.setText(_translate("widget_resample1000Hz", "目标采样率(Hz)"))
+ self.lineEdit_resample1000Hz_target_sampling_rate.setText(_translate("widget_resample1000Hz", "1000"))
+ self.label_2.setText(_translate("widget_resample1000Hz", "原始采样率(Hz)"))
+ self.label.setText(_translate("widget_resample1000Hz", "裁剪的时间(秒)"))
diff --git a/ui/widget_resample1000Hz.ui b/ui/widget_resample1000Hz.ui
new file mode 100644
index 0000000..7a0351c
--- /dev/null
+++ b/ui/widget_resample1000Hz.ui
@@ -0,0 +1,308 @@
+
+
+ widget_resample1000Hz
+
+
+
+ 0
+ 0
+ 370
+ 977
+
+
+
+ Form
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 重采样至1000Hz
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 查看结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ 程序识别到的文件路径
+
+
+
-
+
+
+ false
+
+
+
+ 黑体
+ 10
+
+
+
+ DSbcg_sig.txt文件路径
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ raw_org.txt
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存路径
+
+
+
+ -
+
+
+ false
+
+
+
+ 黑体
+ 10
+
+
+
+ raw_org.txt文件路径
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ DSbcg_sig.txt
+
+
+
+ -
+
+
+
+ 黑体
+ 10
+
+
+
+ 文件保存路径
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 14
+
+
+
+ 保存结果
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 黑体
+ 10
+
+
+
+ <重采样>参数输入
+
+
+
-
+
+
+
+ 黑体
+ 14
+
+
+
+ 100
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 目标采样率(Hz)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 1000
+
+
+
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 原始采样率(Hz)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+ 裁剪的时间(秒)
+
+
+
+ -
+
+
+
+ 黑体
+ 14
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+ pushButton_resample1000Hz_view
+ pushButton_resample1000Hz_save
+ groupBox_resample1000Hz_input_args
+ groupBox_resample1000Hz_inputFile_check
+ verticalSpacer
+
+
+
+
+
+
+