def load_IEC(denoise=True, pre=False): """ loading IEC CSE dataset and preprocess the signal. Arg: pre: (bool) load from saved preprocessed data or not denoise: (bool) preprocess using wavelet thresholding or not Returns: ekg_sig: (Tensor) with sized [#signals, 1 lead, signal_length] """ # (num of ekg signal, length, 1) if pre: ekg_sig = torch.load(config["RetinaNet"]["output_path"] + "IEC_preprocessed_data.pt").to('cuda') else: ekg_sig = [] for i in range(1, 126): ekg_filename = config["General"]["IEC_path"] + 'CSE' + str( i).rjust(3, '0') + '.raw' try: sig = read_IEC(ekg_filename) sig = np.reshape(sig[0], (len(sig[0]), 1)) ekg_sig.append(sig.astype(float)) except IOError: print("file {} does not exist".format("CSE" + str(i).rjust(3, '0'))) ekg_sig = IEC_dataset_preprocessing(ekg_sig, smooth=False, dns=denoise) ekg_sig = ekg_sig.to('cuda') ekg_sig = normalize(ekg_sig, instance=True) torch.save( ekg_sig, config["RetinaNet"]["output_path"] + "IEC_preprocessed_data.pt") return ekg_sig
def load_raw_dataset_and_bbox_labels_CAL(): """ Get raw dataset with signals, bboxes and labels Args: raw_dataset: (string) dataset path Returns: X: (Array) input signals with sized [#subjects, #leads, signal_length=5000] BBoxes: (list) target bboxes with sized [#subjects, #leads, #objs, 2] Labels: (list) target labels with sized [#subjects, #leads, #objs] """ name = [ "ANE20000", "ANE20001", "ANE20002", "CAL05000", "CAL10000", "CAL15000", "CAL20000", "CAL20002", "CAL20100", "CAL20110", "CAL20160", "CAL20200", "CAL20210", "CAL20260", "CAL20500", "CAL30000", "CAL50000" ] path = config["General"]["IEC_path"] X = [] BBoxes = [] Labels = [] Peaks = [] for i in range(len(name)): x = [] bbox = [] label = [] peak = [] for j in range(5): signal = list(read_IEC(path + name[i] + "_" + str(j + 1) + ".raw")) with open(path + "CAL_label/" + name[i] + "_" + str(j + 1) + ".json") as f: label_ = json.load(f) p_delin = label_['p'] qrs_delin = label_['qrs'] t_delin = label_['t'] # background label 0 will add when encoding p_boxes, p_labels, p_peaks = get_bbox_labels(p_delin, 0) qrs_boxes, qrs_labels, qrs_peaks = get_bbox_labels(qrs_delin, 1) t_boxes, t_labels, t_peaks = get_bbox_labels(t_delin, 2) b = [*p_boxes, *qrs_boxes, *t_boxes] l = [*p_labels, *qrs_labels, *t_labels] p = [*p_peaks, *qrs_peaks, *t_peaks] x.append(signal[0][start_point:end_point]) bbox.append(b) label.append(l) peak.append(p) X.append(x) BBoxes.append(bbox) Labels.append(label) Peaks.append(peak) return X, BBoxes, Labels, Peaks
def test(net, signal_file_path): """ test the signal using retinanet and return all of the predict result Args: net: (nn.Module) RetinaNet module signal_file_path: (string) this file must be .raw format Returns: intervals: (list) p duration, pq interval, qrs duration, qt interval mean and var value qrs_intervals: (list) q duration, r duration, and s duration mean value """ """load signal file from .raw""" raw_ekg_sig = [] try: sig = read_IEC(signal_file_path) sig = np.reshape(sig[0], (len(sig[0]), 1)) raw_ekg_sig.append(sig.astype(float)) except IOError: print(f"file {signal_file_path} does not exist.") ekg_sig = IEC_dataset_preprocessing(raw_ekg_sig, smooth=False, dns=False).to('cuda') denoise_sig = IEC_dataset_preprocessing(raw_ekg_sig, smooth=False, dns=True).to('cuda') """predict the pqrst segmentation result""" final_intervals = [] final_preds = [] denoise_sig = normalize(denoise_sig) for i in range(denoise_sig.size(0) // 128 + 1): plots, intervals, pred_signals = test_retinanet( net, denoise_sig[i * 128:(i + 1) * 128, :, :], 4992, visual=False) print(intervals) final_intervals.extend(intervals) final_preds.append(pred_signals) final_preds = torch.cat(final_preds, dim=0) pred = qrs_seperation(ekg_sig, final_preds) for i in range(len(pred)): pred[i]["q_duration"] = np.mean(pred[i]["q_duration"]) pred[i]["r_duration"] = np.mean(pred[i]["r_duration"]) pred[i]["s_duration"] = np.mean(pred[i]["s_duration"]) print(pred) return final_intervals, pred
def load_ANE_CAL(denoise=True, pre=False, save=True, nor=True): """ loading IEC ANE and CAL dataset and preprocess the signal Arg: denoise: (bool) denoise using wavelet threshold or not pre: (bool) load from saved preprocessed data or not save: (bool) save preprocessed data to file or not normalize: (bool) normalize the signal or not Return: ekg_sig: (Tensor) with shape [#signals, 1 lead, signal_length] """ name = json.loads(config["General"]["CAL_name"]) # (num of ekg signal, length, 1) if pre and os.path.isfile(config["RetinaNet"]["output_path"] + "CAL_preprocessed_data.pt"): ekg_sig = torch.load(config["RetinaNet"]["output_path"] + "CAL_preprocessed_data.pt").to('cuda') if nor: ekg_sig = normalize(ekg_sig, instance=True) else: ekg_sig = [] for i in range(len(name)): for j in range(1, 6): ekg_filename = f'{config["General"]["IEC_path"]}{name[i]}_{str(j)}.raw' try: sig = read_IEC(ekg_filename) sig = np.reshape(sig[0], (len(sig[0]), 1)) ekg_sig.append(sig.astype(float)) except IOError: print(f"file {name[i]}_{str(j)} does not exist") ekg_sig = IEC_dataset_preprocessing(ekg_sig, smooth=False, dns=denoise) ekg_sig = ekg_sig.to('cuda') if nor: ekg_sig = normalize(ekg_sig, instance=True) if save: torch.save( ekg_sig, config["RetinaNet"]["output_path"] + "CAL_preprocessed_data.pt") return ekg_sig