class Processor: def __init__(self,files,chanNum): self.signal = [] self.stimulusCode = [] self.phaseInSequence = [] self.targetLetters = [] self.firsttrain = 1 self.cl = Classifier() self.sf = SpatialFilter(chanNum) self.rate = 0 self.files = files self.chanNum = chanNum # Z cisla trenovacieho znaku urci jeho poziciu v speller matici def getCharIndexes (self,num): output = [] #row index output.append((num/6)+6) #col index output.append(num % 6) return output # Pomocou opisneho pola phaseInSequence zisti na akych indexoch su prechody medzi cielovymi znakmi def findCharEnds (self): # najdi prechody medzi pismenami na ktore pouzivatel mysli (len pre dataset) charEnds = [] for i in range (len(self.phaseInSequence)): if self.phaseInSequence[i] == 3 and self.phaseInSequence[i-1] == 2: tmp = (int)(i/12) #tmp = i charEnds.append(tmp) return charEnds # Transformuje list dat na numpy array def prepairSignalArray (self,finalData): converted = [] for i in range(len(finalData)): converted.append(np.array(finalData[i])) return np.array(converted) # Vytvorenie znackovacieho pola pre IsiBinList - hovori ci dane vysvietenia zodpovedali cielovemu znaku def prepairTargetArray (self,targIndexes, isiCount = 12): output = [] for i in range(isiCount): if i in targIndexes: output.append(1) else: output.append(0) return np.array(output) # Metoda trenuje klasifikator a updatuje pouzivatelske rozhranie def trainClassifier(self, trainLetter, progress, progLab, maxSets): # nacitanie a predspracovanie signalu signalLoader = SignalLoader(self.chanNum,self.files) prpr = Preprocessor(self.chanNum,[]) signal,stimCode,phaseInSequence = signalLoader.loadSignal() self.signal = prpr.preprocess(240,1E-1,30E0,self.sf,signal,stimCode,phaseInSequence,0) self.stimulusCode = prpr.stimulusCode self.phaseInSequence = prpr.phaseInSequence self.targetLetters = sum(trainLetter,[]) # najdenie prechodov medzi znakmi charEnds = self.findCharEnds() # rozdelenie dat do epoch em = EpochManager(self.signal,self.stimulusCode,self.phaseInSequence) isiList = em.createEpochs() # trening jednotlivych znakov for i in range(len(charEnds)): progress["value"] = i progLab["text"] = ("Trénujem znak: {}/{}").format(i+1, len(charEnds)) print "Averaging character:",i,"\n" hi = charEnds[i] if i == 0: lo = 0 else: lo = charEnds[i-1] rowColBinList = em.getAveragedEpochs(hi,lo,isiList,maxSets) finalDataArray = rowColBinList classMarks = self.prepairTargetArray(self.getCharIndexes(self.targetLetters[i])) if self.firsttrain == 1: self.cl.learn(finalDataArray,classMarks,0) self.firsttrain = 0 else: self.cl.learn(finalDataArray,classMarks) # Metoda hada cielove znaky a updatuje pouzivatelske rozhranie def guessChars(self,subset,files,targetLetter,testProgress,progTestLabel,guessView,guessLab,maxSets): aktCharNum = 0 totalChars = len(sum(targetLetter,[])) if self.chanNum != 64: files.sort() files = self.createTriplets(files) for m in range(len(files)): # nacitanie a predspracovanie signalu signalLoader = SignalLoader(self.chanNum,files[m]) prpr = Preprocessor(self.chanNum,subset) signal, stimCode, phaseInSequence = signalLoader.loadSignal() self.signal = prpr.preprocess(240,1E-1,30E0,self.sf,signal,stimCode,phaseInSequence,1) self.stimulusCode = prpr.stimulusCode self.phaseInSequence = prpr.phaseInSequence if (len(targetLetter) > m): self.targetLetters = targetLetter[m] else: self.targetLetters = [] print "Processing file:",m,"\n" # najdenie prechodov medzi znakmi charEnds = self.findCharEnds() # rozdelenie dat do epoch em = EpochManager(self.signal,self.stimulusCode,self.phaseInSequence) isiList = em.createEpochs() hit = 0 # hadanie jednotlivych znakov for i in range(len(charEnds)): testProgress["value"] = aktCharNum progTestLabel["text"] = ("Hádam znak: {}/{}").format(aktCharNum+1, totalChars) aktCharNum +=1 hi = charEnds[i] if i == 0: lo = 0 else: lo = charEnds[i-1] rowColBinList = em.getAveragedEpochs(hi,lo,isiList,maxSets) finalDataArray = self.prepairSignalArray(self.sf.grandAveragingFilter(rowColBinList,subset,1)) #pomocou klasifikatora char = self.cl.predictTarget(finalDataArray,self.cl.reduce(self.sf,self,subset)) if len(self.targetLetters) > i: if char == self.targetLetters[i]: hit+=1 print "Succesfully guessed char:",char,"\n" else: print "Guessed char:",char,"\n" if i == 0: text = "(" + char + "," elif i == len(charEnds) - 1: text = char + ")" else: text = char + "," guessView.configure(state='normal') guessView.insert(INSERT, text) guessView.configure(state='disabled') self.rate += (hit)*100/float(totalChars) print "\n Success rate= ",self.rate, "\n" guessLab["text"]=("Presnosť: {}").format(self.rate) return self.rate # Pomocna funkcia pre spracovanie csv suborov epoc dat def createTriplets(self, epocFiles): triplets = [] for i in range(len(epocFiles)/3): triplet = [] triplet.append(epocFiles[i]) triplet.append(epocFiles[i+len(epocFiles)/3]) triplet.append(epocFiles[i+2*len(epocFiles)/3]) triplets.append(triplet) return triplets