Exemplo n.º 1
0
    def testing(self, raw_signal, rfmdl=None):
        '''Testing ECG record with trained model.'''
        N_original = len(raw_signal)
        # default parameters
        if rfmdl is None:
            rfmdl = self.mdl

        PrdRes = []
        if valid_signal_value(raw_signal) == False:
            raise Exception(
                'Input signal value is not valid!(may contain inf)')
        feature_extractor = extfeature.ECGfeatures(
            raw_signal, random_relation_path=self.SaveTrainingSampleFolder)
        N_signal = len(raw_signal)

        # Testing...
        predict_result = self.testing_with_extractor(rfmdl, N_signal,
                                                     feature_extractor)
        # Crop the length (SWT may pad zeros behind)
        if N_original < len(raw_signal):
            del raw_signal[N_original:]
        predict_result = predict_result[0:min(len(predict_result
                                                  ), len(raw_signal))]

        PrdRes = predict_result
        return PrdRes
def show_drawing(folderpath = os.path.join(\
        os.path.dirname(curfilepath),'..','QTdata','QTdata_repo')):
    with open(os.path.join(folderpath, 'sel103.txt'), 'r') as fin:
        sig = pickle.load(fin)
    # sig with 'sig','time'and 'marks'
    ECGfv = extfeature.ECGfeatures(sig['sig'])
    fv = ECGfv.frompos(3e3)
 def test_signal(self, signal, rfmdl=None, MultiProcess='off'):
     # test rawsignal
     if rfmdl is None:
         rfmdl = self.mdl
     # Extracting Feature
     if MultiProcess == 'off':
         FeatureExtractor = extfeature.ECGfeatures(
             signal, random_relation_path=self.random_relation_path)
     else:
         raise StandardError('MultiProcess on is not defined yet!')
     # testing
     if MultiProcess == 'on':
         raise StandardError('MultiProcess on is not defined yet!')
     elif MultiProcess == 'off':
         record_predict_result = self.test_with_positionlist(
             rfmdl, range(0, len(signal)), FeatureExtractor)
     return record_predict_result
Exemplo n.º 4
0
    def testing(self, reclist, rfmdl=None, saveresultfolder=None):
        '''Testing ECG record with trained model.'''

        # Default parameters
        if rfmdl is None:
            rfmdl = self.mdl

        # Parallel
        if conf['ParallelTesting'] == 'True':
            MultiProcess = 'on'
        else:
            MultiProcess = 'off'

        # Test all files in reclist
        PrdRes = []
        for recname in reclist:
            # --------------------
            # start test time
            # --------------------
            # load signal data from QTdb.
            sig = self.QTloader.load(recname)
            # Signal value can not contain inf.
            if valid_signal_value(sig['sig']) == False:
                continue

            # ------------------------
            # test lead I
            # ------------------------
            # original raw_signal
            raw_signal = sig['sig']
            feature_extractor = extfeature.ECGfeatures(raw_signal)
            N_signal = len(raw_signal)

            # Testing...
            time_rec0 = time.time()
            record_predict_result = self.testing_with_extractor(
                rfmdl, N_signal, feature_extractor)
            # Logging testing time.
            time_rec1 = time.time()
            log.info('Testing time for %s lead1 is %d seconds', recname,
                     time_rec1 - time_rec0)

            PrdRes.append((recname, record_predict_result))

            # ------------------------
            # test lead II
            # ------------------------
            # original raw_signal
            raw_signal = sig['sig2']
            feature_extractor = extfeature.ECGfeatures(raw_signal)
            N_signal = len(raw_signal)

            # Testing...
            time_rec0 = time.time()
            record_predict_result = self.testing_with_extractor(
                rfmdl, N_signal, feature_extractor)
            # Logging testing time.
            time_rec1 = time.time()
            log.info('Testing time for %s lead1 is %d seconds', recname,
                     time_rec1 - time_rec0)

            PrdRes.append(('{}_sig2'.format(recname), record_predict_result))

        # Save prediction result.
        if saveresultfolder is not None:
            saveresult_filename = os.path.join(saveresultfolder,
                                               'result_{}'.format(recname))
            with open(saveresult_filename, 'w') as fout:
                # No detection
                if PrdRes is None or len(PrdRes) == 0:
                    PrdRes = ()
                json.dump(PrdRes, fout, indent=4, sort_keys=True)
                print 'Saved prediction result to {}'.format(
                    saveresult_filename)
        return PrdRes
    def testing(self, reclist, rfmdl=None, saveresultfolder=None):
        '''Testing ECG record with trained model.'''

        # default parameters
        if rfmdl is None:
            rfmdl = self.mdl

        # Parallel
        if conf['ParallelTesting'] == 'True':
            MultiProcess = 'on'
        else:
            MultiProcess = 'off'

        # test all files in reclist
        PrdRes = []
        for recname in reclist:
            # --------------------
            # start test time
            # --------------------
            time_rec0 = time.time()
            # QT sig data
            sig = self.QTloader.load(recname)
            # valid signal value:
            if valid_signal_value(sig['sig']) == False:
                continue
            # sigle process
            if MultiProcess == 'off':
                log.info(
                    'Multi-process is off, using record-global feature extractor.'
                )
                FeatureExtractor = extfeature.ECGfeatures(
                    sig['sig'], random_relation_path=self.random_relation_path)

            # ------------------------
            # test lead I
            # ------------------------
            # original rawsig
            rawsig = sig['sig']
            N_signal = len(rawsig)

            # denoise signal
            #
            if MultiProcess == 'on':
                feature_type = conf['feature_type']
                if feature_type == 'wavelet':
                    denoisesig = rawsig
                else:
                    denoisesig = wtdenoise.denoise(rawsig)
                    denoisesig = denoisesig.tolist()
                    N_signal = len(denoisesig)

            # init
            prRes = []
            testSamples = []

            #
            # get prRange:
            # test in the same range as expert labels
            #
            expres = self.QTloader.getexpertlabeltuple(recname)
            # Leave Testing Blank Regions in Head&Tail
            WindowLen = conf['winlen_ratio_to_fs'] * conf['fs']
            Blank_Len = WindowLen / 2 + 1
            prRange = range(Blank_Len, N_signal - 1 - Blank_Len)

            if conf['QTtest'] == 'FastTest':
                TestRegionFolder = os.path.join(projhomepath, 'QTdata',
                                                'QT_TestRegions')
                with open(
                        os.path.join(TestRegionFolder,
                                     '{}_TestRegions.pkl'.format(recname)),
                        'rb') as fin:
                    TestRegions = pickle.load(fin)
                prRange = []
                for region in TestRegions:
                    prRange.extend(range(region[0], region[1] + 1))

            log.info('Testing sample point number is %d for this record',
                     len(prRange))

            if MultiProcess == 'on':
                record_predict_result = self.\
                        test_with_positionlist_multiprocess(\
                            rfmdl,\
                            prRange,\
                            denoisesig,\
                            origrawsig = rawsig
                        )
            elif MultiProcess == 'off':
                record_predict_result = self.\
                        test_with_positionlist(\
                            rfmdl,\
                            prRange,\
                            FeatureExtractor\
                        )

            #
            # prediction result for each record
            #
            PrdRes.append((recname, record_predict_result))

            # end testing time
            time_rec1 = time.time()
            print 'Testing time for {} is {:.2f} s'.\
                    format(recname,time_rec1-time_rec0)
            log.info('Testing time for %s lead1 is %d seconds', recname,
                     time_rec1 - time_rec0)
            # ------------------------
            # test lead II
            # ------------------------
            # original rawsig
            rawsig = sig['sig2']
            N_signal = len(rawsig)

            # denoise signal
            #
            if MultiProcess == 'on':
                feature_type = conf['feature_type']
                if feature_type == 'wavelet':
                    denoisesig = rawsig
                else:
                    denoisesig = wtdenoise.denoise(rawsig)
                    denoisesig = denoisesig.tolist()
                    N_signal = len(denoisesig)

            # init
            prRes = []
            testSamples = []

            #
            # get prRange:
            # test in the same range as expert labels
            #
            expres = self.QTloader.getexpertlabeltuple(recname)
            # Leave Testing Blank Regions in Head&Tail
            WindowLen = conf['winlen_ratio_to_fs'] * conf['fs']
            Blank_Len = WindowLen / 2 + 1
            prRange = range(Blank_Len, N_signal - 1 - Blank_Len)

            if conf['QTtest'] == 'FastTest':
                TestRegionFolder = os.path.join(projhomepath, 'QTdata',
                                                'QT_TestRegions')
                with open(
                        os.path.join(TestRegionFolder,
                                     '{}_TestRegions.pkl'.format(recname)),
                        'rb') as fin:
                    TestRegions = pickle.load(fin)
                prRange = []
                for region in TestRegions:
                    prRange.extend(range(region[0], region[1] + 1))

            log.info('Testing sample point number is %d for this record',
                     len(prRange))
            if MultiProcess == 'on':
                record_predict_result = self.\
                        test_with_positionlist_multiprocess(\
                            rfmdl,\
                            prRange,\
                            denoisesig,\
                            origrawsig = rawsig
                        )
            elif MultiProcess == 'off':
                record_predict_result = self.\
                        test_with_positionlist(\
                            rfmdl,\
                            prRange,\
                            FeatureExtractor\
                        )

            #
            # prediction result for each record
            #
            PrdRes.append(('{}_sig2'.format(recname), record_predict_result))

            # end testing time
            time_rec1 = time.time()
            log.info('Testing time for %s lead2 is %d seconds', recname,
                     time_rec1 - time_rec0)

        # save Prediction Result
        if saveresultfolder is not None:
            # save results
            saveresult_filename = os.path.join(saveresultfolder,
                                               'result_{}'.format(recname))
            with open(saveresult_filename, 'w') as fout:
                # No detection
                if PrdRes is None or len(PrdRes) == 0:
                    PrdRes = ()

                json.dump(PrdRes, fout, indent=4, sort_keys=True)
                print 'saved prediction result to {}'.format(
                    saveresult_filename)
        return PrdRes
    def collectfeaturesforsig(sig,
                              SaveTrainingSampleFolder,
                              blankrangelist=None,
                              recID=None,
                              allowed_label_list=None,
                              random_relation_path=None):
        '''Label process & convert to feature.'''
        #
        # parameters:
        # blankrangelist : [[l,r],...]
        #
        # collect training features from sig
        #
        # init
        Extractor = extfeature.ECGfeatures(
            sig['sig'], random_relation_path=random_relation_path)
        negposlist = []
        posposlist = []  # positive position list
        labellist = []  # positive label list
        tarpos = []
        # Including positive samples & negtive samples.
        trainingX, trainingy = [], []
        # get Expert labels
        QTloader = QTdb.QTloader()
        # =======================================================
        # modified negposlist inside function
        # =======================================================
        ExpertLabels = QTloader.getexpertlabeltuple(None,
                                                    sigIN=sig,
                                                    negposlist=negposlist)

        # Filtering according to allowed labels
        if allowed_label_list is not None:
            allowed_expert_labels = filter(
                lambda x: x[1] in allowed_label_list, ExpertLabels)
        if len(allowed_expert_labels) == 0:
            return ([], [])
        posposlist, labellist = zip(*allowed_expert_labels)

        # ===============================
        # convert feature & append to X,y
        # Using Map build in function
        # ===============================
        FV = map(Extractor.frompos, posposlist)
        # append to trainging vector
        trainingX.extend(FV)
        trainingy.extend(labellist)

        # add neg samples
        Nneg = int(len(negposlist) * conf['negsampleratio'])

        # if Number of Neg>0 then add negtive samples
        if len(negposlist) == 0 or Nneg <= 0:
            print '[In function collect feature] Warning: negtive sample position list length is 0.'
        else:
            # collect negtive sample features
            #
            # leave blank for area without labels
            #
            negposset = set(negposlist)
            if blankrangelist is not None:
                blklist = []
                for pair in blankrangelist:
                    blklist.extend(range(pair[0], pair[1] + 1))
                blkset = set(blklist)
                negposset -= blkset

            selnegposlist = random.sample(negposset, Nneg)
            time_neg0 = time.time()
            negFv = map(Extractor.frompos, selnegposlist)
            trainingX.extend(negFv)
            trainingy.extend(['white'] * Nneg)
            print '\nTime for collect negtive samples:{:.2f}s'.format(
                time.time() - time_neg0)
        # =========================================
        # Save sample list
        # =========================================
        ResultFolder = os.path.join(SaveTrainingSampleFolder,
                                    'TrainingSamples')
        # mkdir if not exists
        if os.path.exists(ResultFolder) == False:
            os.mkdir(ResultFolder)
        # -----
        # sample_list
        # [(pos,label),...]
        # -----
        sample_list = zip(selnegposlist, len(selnegposlist) * ['white'])
        sample_list.extend(ExpertLabels)
        if recID is not None:
            # save recID sample list
            with open(os.path.join(ResultFolder, recID + '.pkl'), 'w') as fout:
                pickle.dump(sample_list, fout)
            save_mat_filename = os.path.join(ResultFolder, recID + '.mat')
            reslist_to_mat(sample_list, mat_filename=save_mat_filename)
        return (trainingX, trainingy)