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
Example #3
0
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