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 + + + + + + +