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