Диагностика заболеваний по ЭКГ с помощью сверточных нейронных сетей

Характеристика аритмии как типичного типа сердечно-сосудистых заболеваний, который относится к любым изменениям нормальных ритмов сердца. Анализ особенностей применения сверточных нейронных сетей к задаче классификации данных электрокардиографии.

Рубрика Медицина
Вид дипломная работа
Язык русский
Дата добавления 18.07.2020
Размер файла 1,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

26.         data_loader = DataLoader(self, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers)

27.         return data_loader

28.  

29.     def __len__(self):

30.         return len(self.data)

31.  

32.  

33. def callback_get_label(dataset, idx):

34.     return dataset[idx]["class"]

35.  

36.  

37. class EcgPipelineDataset1D(Dataset):

38.     def __init__(self, path, mode=128):

39.         super().__init__()

40.         record = wfdb.rdrecord(path)

41.         self.signal = None

42.         self.mode = mode

43.         for sig_name, signal in zip(record.sig_name, record.p_signal.T):

44.             if sig_name in ['MLII', 'II'] and np.all(np.isfinite(signal)):

45.                 self.signal = scale(signal).astype('float32')

46.         if self.signal is None:

47.             raise Exception("No MLII LEAD")

48.  

49.         self.peaks = find_peaks(self.signal, distance=180)[0]

50.         mask_left = (self.peaks - self.mode // 2) > 0

51.         mask_right = (self.peaks + self.mode // 2) < len(self.signal)

52.         mask = mask_left & mask_right

53.         self.peaks = self.peaks[mask]

54.  

55.     def __getitem__(self, index):

56.         peak = self.peaks[index]

57.         left, right = peak - self.mode // 2, peak + self.mode // 2

58.  

59.         img = self.signal[left:right]

60.         img = img.reshape(1, img.shape[0])

61.  

62.         return {

63.             "image": img,

64.             "peak": peak

65.         }

66.  

67.     def get_dataloader(self, num_workers=4, batch_size=16, shuffle=True):

68.         data_loader = DataLoader(self, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers)

69.         return data_loader

70.  

71.     def __len__(self):

72.         return len(self.peaks)

1. import json

2.  

3. import cv2

4. from albumentations import Normalize, Compose

5. from albumentations.pytorch.transforms import ToTensorV2

6. from torch.utils.data import Dataset, DataLoader

7.  

8. augment = Compose([

9.     Normalize(),

10.     ToTensorV2()

11. ])

12.  

13.  

14. class EcgDataset2D(Dataset):

15.     def __init__(self, ann_path, mapping_path):

16.         super().__init__()

17.         self.data = json.load(open(ann_path))

18.         self.mapper = json.load(open(mapping_path))

19.  

20.     def __getitem__(self, index):

21.         img = cv2.imread(self.data[index]['path'])

22.         img = augment(**{"image": img})['image']

23.  

24.         return {

25.             "image": img,

26.             "class": self.mapper[self.data[index]['label']]

27.         }

28.  

29.  

30.     def get_dataloader(self, num_workers=4, batch_size=16, shuffle=True):

31.         data_loader = DataLoader(self, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers)

32.         return data_loader

33.  

34.     def __len__(self):

35.

36.         return len(self.data)

Приложение 7

1. import os

2. import os.path as osp

3. from datetime import datetime

4.  

5. import numpy as np

6. import torch

7. from torch import optim, nn

8. from torch.utils.tensorboard import SummaryWriter

9. from tqdm import tqdm

10.  

11. from utils.network_utils import load_checkpoint, save_checkpoint

12.  

13.  

14. class BaseTrainer:

15.     def __init__(self, config):

16.         self.config = config

17.         self.exp_name = self.config.get('exp_name', None)

18.         if self.exp_name is None:

19.             self.exp_name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

20.  

21.         self.log_dir = osp.join(self.config['exp_dir'], self.exp_name, 'logs')

22.         self.pth_dir = osp.join(self.config['exp_dir'], self.exp_name, 'checkpoints')

23.         os.makedirs(self.log_dir, exist_ok=True)

24.         os.makedirs(self.pth_dir, exist_ok=True)

25.  

26.         self.writer = SummaryWriter(log_dir=self.log_dir)

27.  

28.         self.model = self._init_net()

29.         self.optimizer = self._init_optimizer()

30.         self.criterion = nn.CrossEntropyLoss().to(self.config['device'])

31.  

32.         self.train_loader, self.val_loader = self._init_dataloaders()

33.  

34.         pretrained_path = self.config.get('model_path', False)

35.         if pretrained_path:

36.             self.training_epoch, self.total_iter = load_checkpoint(pretrained_path, self.model,

37.                                                                    optimizer=self.optimizer)

38.  

39.         else:

40.             self.training_epoch = 0

41.             self.total_iter = 0

42.  

43.         self.epochs = self.config.get('epochs', int(1e5))

44.  

45.     def _init_net(self):

46.         raise NotImplemented

47.  

48.     def _init_dataloaders(self):

49.         raise NotImplemented

50.  

51.     def _init_optimizer(self):

52.         optimizer = getattr(optim, self.config['optim'])(self.model.parameters(), **self.config['optim_params'])

53.         return optimizer

54.  

55.     def train_epoch(self):

56.         self.model.train()

57.         total_loss = 0

58.  

59.         gt_class = np.empty(0)

60.         pd_class = np.empty(0)

61.  

62.         for i, batch in enumerate(self.train_loader):

63.             inputs = batch['image'].to(self.config['device'])

64.             targets = batch['class'].to(self.config['device'])

65.  

66.             predictions = self.model(inputs)

67.             loss = self.criterion(predictions, targets)

68.  

69.             classes = predictions.topk(k=1)[1].view(-1).cpu().numpy()

70.  

71.             gt_class = np.concatenate((gt_class, batch['class'].numpy()))

72.             pd_class = np.concatenate((pd_class, classes))

73.  

74.             total_loss += loss.item()

75.  

76.             self.optimizer.zero_grad()

77.             loss.backward()

78.             self.optimizer.step()

79.  

80.             if (i + 1) % 10 == 0:

81.                 print("\tIter [%d/%d] Loss: %.4f" % (i + 1, len(self.train_loader), loss.item()))

82.  

83.             self.writer.add_scalar("Train loss (iterations)", loss.item(), self.total_iter)

84.             self.total_iter += 1

85.  

86.         total_loss /= len(self.train_loader)

87.         class_accuracy = sum(pd_class == gt_class) / pd_class.shape[0]

88.  

89.         print('Train loss - {:4f}'.format(total_loss))

90.         print('Train CLASS accuracy - {:4f}'.format(class_accuracy))

91.  

92.         self.writer.add_scalar('Train loss (epochs)', total_loss, self.training_epoch)

93.         self.writer.add_scalar('Train CLASS accuracy', class_accuracy, self.training_epoch)

94.  

95.     def val(self):

96.         self.model.eval()

97.         total_loss = 0

98.  

99.         gt_class = np.empty(0)

100.         pd_class = np.empty(0)

101.  

102.         with torch.no_grad():

103.             for i, batch in tqdm(enumerate(self.val_loader)):

104.                 inputs = batch['image'].to(self.config['device'])

105.                 targets = batch['class'].to(self.config['device'])

106.  

107.                 predictions = self.model(inputs)

108.                 loss = self.criterion(predictions, targets)

109.  

110.                 classes = predictions.topk(k=1)[1].view(-1).cpu().numpy()

111.  

112.                 gt_class = np.concatenate((gt_class, batch['class'].numpy()))

113.                 pd_class = np.concatenate((pd_class, classes))

114.  

115.                 total_loss += loss.item()

116.  

117.         total_loss /= len(self.val_loader)

118.         class_accuracy = sum(pd_class == gt_class) / pd_class.shape[0]

119.  

120.         print('Validation loss - {:4f}'.format(total_loss))

121.         print('Validation CLASS accuracy - {:4f}'.format(class_accuracy))

122.  

123.         self.writer.add_scalar('Validation loss', total_loss, self.training_epoch)

124.         self.writer.add_scalar('Validation CLASS accuracy', class_accuracy, self.training_epoch)

125.  

126.     def loop(self):

127.         for epoch in range(self.training_epoch, self.epochs):

128.             print("Epoch - {}".format(self.training_epoch + 1))

129.             self.train_epoch()

130.             save_checkpoint({

131.                 'state_dict': self.model.state_dict(),

132.                 'optimizer': self.optimizer.state_dict(),

133.                 'epoch': epoch,

134.                 'total_iter': self.total_iter

135.             }, osp.join(self.pth_dir, '{:0>8}.pth'.format(epoch)))

136.             self.val()

137.  

138.             self.training_epoch += 1

Приложение 8

1. future

2. torchvision==0.3.0

3. plotly==4.7.0

4. efficientnet_pytorch==0.6.3

5. numpy==1.17.3

6. wfdb==2.2.1

7. torch==1.1.0

8. tqdm==4.42.1

9. matplotlib==3.0.3

10. opencv_python==4.2.0.32

11. scipy==1.4.1

12. pandas==0.25.3

13. albumentations==0.4.3

14. scikit_learn==0.22.2.post1

15. tensorboard==1.14

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.