def __init__(self, config, net): self.config = config self.net = net self.avg = util.getAverage(self.net.datacut, self.net.datafold) self.datalist = [] self.datanum = 0 self.has32 = False # Classify2 self.previouspredict = 6 self.predcounter = 0 self.predHistSize = 8 self.predHistHalfUpper = 5 self.predcountertreshold = 5 self.predHistory = util.createArraySix(self.predHistSize, ) # Classify3 method self.predhistoryforclassify3 = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 } self.classify3start = False # classify4 & 5 self.start = 0 self.buffer = [] self.liveData = [] self.beginClassify = 0 self.beginMax = 0 self.maxValue = 0 self.maxValueList = [] # For interacting with OS self.outkeys = None if (c.getInstance().getOSConfig()['type'] == "posix"): from systemkeys import SystemKeys self.outkeys = SystemKeys() self.classifyMethods = { 1: self.__classify1, 2: self.__classify2, 3: self.__classify3, 4: self.__classify4, 5: self.__classify5 }
def __init__(self, config, net): self.config = config self.net = net self.avg = util.getAverage(self.net.datacut, self.net.datafold) self.datalist = [] self.datanum = 0 self.has32 = False # Classify2 self.previouspredict = 6 self.predcounter = 0 self.predHistSize = 8 self.predHistHalfUpper = 5 self.predcountertreshold = 5 self.predHistory = util.createArraySix(self.predHistSize,) # Classify3 method self.predhistoryforclassify3 = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0} self.classify3start = False # classify4 & 5 self.start = 0 self.buffer = [] self.liveData = [] self.beginClassify = 0 self.beginMax = 0 self.maxValue = 0 self.maxValueList = [] # For interacting with OS self.outkeys = None if(c.getInstance().getOSConfig()['type'] == "posix"): from systemkeys import SystemKeys self.outkeys = SystemKeys() self.classifyMethods = {1:self.__classify1, 2:self.__classify2, 3:self.__classify3, 4:self.__classify4, 5:self.__classify5 }
class LSTMClassify(): def __init__(self, config, net): self.config = config self.net = net self.avg = util.getAverage(self.net.datacut, self.net.datafold) self.datalist = [] self.datanum = 0 self.has32 = False # Classify2 self.previouspredict = 6 self.predcounter = 0 self.predHistSize = 8 self.predHistHalfUpper = 5 self.predcountertreshold = 5 self.predHistory = util.createArraySix(self.predHistSize, ) # Classify3 method self.predhistoryforclassify3 = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 } self.classify3start = False # classify4 & 5 self.start = 0 self.buffer = [] self.liveData = [] self.beginClassify = 0 self.beginMax = 0 self.maxValue = 0 self.maxValueList = [] # For interacting with OS self.outkeys = None if (c.getInstance().getOSConfig()['type'] == "posix"): from systemkeys import SystemKeys self.outkeys = SystemKeys() self.classifyMethods = { 1: self.__classify1, 2: self.__classify2, 3: self.__classify3, 4: self.__classify4, 5: self.__classify5 } ''' Interface method for classifcation. WIll be called by LSTM interface and calls different implementations. Preprocess data. ''' def classify(self, data): preprocessedData = data / np.amax(data) preprocessedData = util.preprocessFrame(preprocessedData, self.net.datacut, self.net.datafold) # diffAvgData = preprocessedData - self.avg classifyMethod = self.classifyMethods[int( self.config['classifymethod'])] out = classifyMethod(preprocessedData) if (out != -1): print("Gesture " + str(out) + " detected") if (self.outkeys != None): self.outkeys.outForClass(out) ''' Gesten werden starr nach 32 frames erkannt ''' def __classify1(self, data): data = data - self.avg self.datalist.append(data) self.datanum += 1 if (self.datanum % 32 == 0): self.net.reset() out = self.net._activateSequence(self.datalist) self.datalist = [] self.datanum = 0 return out return -1 ''' Gesten werden auf folgende Art erkannt: - wenn 32 Datensaetze vorhanden sind wird das Netz aktiviert und der Output in eine Liste gespeichert - Diese Liste wird staendig erweitert und hat ein feste Laenge (siehe self.predHistory in init) - Es wird der Modus der Liste gebildet - Ist der Modus ueber einem bestimmten Treshold (self.predHistHalfUpper) wird der Wert in self.previouspredict gespeichert - Ist previouspredict 4 mal gleich wird die Gestenklasse ausgegeben, ist die Klasse groesser als 4 mal gleich erfolgt keine neue Ausgabe - ''' def __classify2(self, data): data = data - self.avg self.datanum += 1 self.datalist.append(data) if (self.datanum % 32 == 0): self.has32 = True if (self.has32): # Activate for 32 Frames self.net.reset() Y_pred = self.net._activateSequence(self.datalist) del self.datalist[0] # Save network output in list self.predHistory[0] = Y_pred self.predHistory = np.roll(self.predHistory, -1) # Get Mode of list expected = stats.mode(self.predHistory, 0) # Check if Mode count is greater than self.predHistHalfUpper if (expected[1][0] >= self.predHistHalfUpper): # If current mode is not the most one, change it and reset counter if (int(expected[0][0]) != self.previouspredict): self.previouspredict = int(expected[0][0]) self.predcounter = 1 # else increase counter and return class if counter is greater then else: self.predcounter += 1 if ((self.predcounter == self.predcountertreshold)): return self.previouspredict return -1 ''' Gesten werden innerhalb von der Geste 6 gesucht ''' def __classify3(self, data): pred = self.__classify2(data) if (pred == 6): # check for most classified class if (not self.classify3start): self.classify3start = True return -1 print self.predhistoryforclassify3 highestkey = 6 highestkey = max(self.predhistoryforclassify3.iteritems(), key=operator.itemgetter(1))[0] self.predhistoryforclassify3 = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 } return highestkey if (self.classify3start): if (pred != -1 and self.predcounter >= 4): self.predhistoryforclassify3[pred] += self.predcounter return -1 ''' Gesten werden anhand eines erkannten Starttresholds erkannt ''' def __classify4(self, data): if not self.beginClassify: # collecting live data for avg self.liveData.append(data) if self.liveData.__len__() == 20: self.beginClassify = 1 # print self.liveData self.avg = np.mean(self.liveData, axis=0) # print self.avg self.beginMax = 1 # collecting data for maxValue elif self.beginMax: data = data - self.avg self.maxValueList.append(data.max()) if self.maxValueList.__len__() == 30: for a in self.maxValueList: if self.maxValue < a: self.maxValue = a print self.maxValue # maxValue ein bischen erhohen (steuert empfindlichkeit der erkennung) self.maxValue = self.maxValue + 0.05 self.beginMax = 0 else: data = data - self.avg # print data.max() if data.max() > self.maxValue and self.start == 0: # print "starting ..." self.start = 1 if self.start: self.datalist.append(data) self.datanum += 1 if (self.datanum % 32 == 0): # print "net ac" self.net.reset() out = self.net._activateSequence(self.datalist) print(str(out)) self.datalist = [] self.datanum = 0 self.start = 0 return out return -1 ''' Gesten werden anhand eines erkannten Starttresholds erkannt ''' def __classify5(self, data): if not self.beginClassify: # collecting live data for avg self.liveData.append(data) if self.liveData.__len__() == 20: self.beginClassify = 1 # print self.liveData self.avg = np.mean(self.liveData, axis=0) # print self.avg self.beginMax = 1 # collecting data for maxValue elif self.beginMax: data = data - self.avg self.maxValueList.append(data.max()) if self.maxValueList.__len__() == 30: for a in self.maxValueList: if self.maxValue < a: self.maxValue = a print self.maxValue # maxValue ein bischen erhohen (steuert empfindlichkeit der erkennung) self.maxValue = self.maxValue + 0.05 self.beginMax = 0 else: data = data - self.avg # print data.max() if self.buffer.__len__() <= 10 and not self.start: self.buffer.append(data) elif self.buffer.__len__() == 11 and not self.start: self.buffer.pop(0) self.buffer.append(data) if data.max() > self.maxValue and self.start == 0: # print "starting ..." self.start = 1 if self.start: self.datalist.append(data) if (self.datalist.__len__() + self.buffer.__len__()) % 32 == 0: # print "net ac" # print "buffer: " + str(self.buffer.__len__()) # print "list: " + str(self.datalist.__len__()) self.net.reset() out = self.net._activateSequence(self.datalist) print(str(out)) self.datalist = [] self.buffer = [] self.datanum = 0 self.start = 0 return out return -1
class LSTMClassify(): def __init__(self, config, net): self.config = config self.net = net self.avg = util.getAverage(self.net.datacut, self.net.datafold) self.datalist = [] self.datanum = 0 self.has32 = False # Classify2 self.previouspredict = 6 self.predcounter = 0 self.predHistSize = 8 self.predHistHalfUpper = 5 self.predcountertreshold = 5 self.predHistory = util.createArraySix(self.predHistSize,) # Classify3 method self.predhistoryforclassify3 = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0} self.classify3start = False # classify4 & 5 self.start = 0 self.buffer = [] self.liveData = [] self.beginClassify = 0 self.beginMax = 0 self.maxValue = 0 self.maxValueList = [] # For interacting with OS self.outkeys = None if(c.getInstance().getOSConfig()['type'] == "posix"): from systemkeys import SystemKeys self.outkeys = SystemKeys() self.classifyMethods = {1:self.__classify1, 2:self.__classify2, 3:self.__classify3, 4:self.__classify4, 5:self.__classify5 } ''' Interface method for classifcation. WIll be called by LSTM interface and calls different implementations. Preprocess data. ''' def classify(self, data): preprocessedData = data / np.amax(data) preprocessedData = util.preprocessFrame(preprocessedData, self.net.datacut, self.net.datafold) # diffAvgData = preprocessedData - self.avg classifyMethod = self.classifyMethods[int(self.config['classifymethod'])] out = classifyMethod(preprocessedData) if(out != -1): print("Gesture " + str(out) + " detected") if(self.outkeys != None): self.outkeys.outForClass(out) ''' Gesten werden starr nach 32 frames erkannt ''' def __classify1(self, data): data = data - self.avg self.datalist.append(data) self.datanum += 1 if(self.datanum % 32 == 0): self.net.reset() out = self.net._activateSequence(self.datalist) self.datalist = [] self.datanum = 0 return out return -1 ''' Gesten werden auf folgende Art erkannt: - wenn 32 Datensaetze vorhanden sind wird das Netz aktiviert und der Output in eine Liste gespeichert - Diese Liste wird staendig erweitert und hat ein feste Laenge (siehe self.predHistory in init) - Es wird der Modus der Liste gebildet - Ist der Modus ueber einem bestimmten Treshold (self.predHistHalfUpper) wird der Wert in self.previouspredict gespeichert - Ist previouspredict 4 mal gleich wird die Gestenklasse ausgegeben, ist die Klasse groesser als 4 mal gleich erfolgt keine neue Ausgabe - ''' def __classify2(self, data): data = data - self.avg self.datanum += 1 self.datalist.append(data) if(self.datanum % 32 == 0): self.has32 = True if(self.has32): # Activate for 32 Frames self.net.reset() Y_pred = self.net._activateSequence(self.datalist) del self.datalist[0] # Save network output in list self.predHistory[0] = Y_pred self.predHistory = np.roll(self.predHistory, -1) # Get Mode of list expected = stats.mode(self.predHistory, 0) # Check if Mode count is greater than self.predHistHalfUpper if(expected[1][0] >= self.predHistHalfUpper): # If current mode is not the most one, change it and reset counter if(int(expected[0][0]) != self.previouspredict): self.previouspredict = int(expected[0][0]) self.predcounter = 1 # else increase counter and return class if counter is greater then else: self.predcounter += 1 if((self.predcounter == self.predcountertreshold)): return self.previouspredict return -1 ''' Gesten werden innerhalb von der Geste 6 gesucht ''' def __classify3(self, data): pred = self.__classify2(data) if(pred == 6): # check for most classified class if(not self.classify3start): self.classify3start = True return -1 print self.predhistoryforclassify3 highestkey = 6 highestkey = max(self.predhistoryforclassify3.iteritems(), key=operator.itemgetter(1))[0] self.predhistoryforclassify3 = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0} return highestkey if(self.classify3start): if(pred != -1 and self.predcounter >= 4): self.predhistoryforclassify3[pred] += self.predcounter return -1 ''' Gesten werden anhand eines erkannten Starttresholds erkannt ''' def __classify4(self, data): if not self.beginClassify: # collecting live data for avg self.liveData.append(data) if self.liveData.__len__() == 20: self.beginClassify = 1 # print self.liveData self.avg = np.mean(self.liveData, axis=0) # print self.avg self.beginMax = 1 # collecting data for maxValue elif self.beginMax: data = data - self.avg self.maxValueList.append(data.max()) if self.maxValueList.__len__() == 30: for a in self.maxValueList: if self.maxValue < a: self.maxValue = a print self.maxValue # maxValue ein bischen erhohen (steuert empfindlichkeit der erkennung) self.maxValue = self.maxValue + 0.05 self.beginMax = 0 else: data = data - self.avg # print data.max() if data.max() > self.maxValue and self.start == 0: # print "starting ..." self.start = 1 if self.start: self.datalist.append(data) self.datanum += 1 if(self.datanum % 32 == 0): # print "net ac" self.net.reset() out = self.net._activateSequence(self.datalist) print(str(out)) self.datalist = [] self.datanum = 0 self.start = 0 return out return -1 ''' Gesten werden anhand eines erkannten Starttresholds erkannt ''' def __classify5(self, data): if not self.beginClassify: # collecting live data for avg self.liveData.append(data) if self.liveData.__len__() == 20: self.beginClassify = 1 # print self.liveData self.avg = np.mean(self.liveData, axis=0) # print self.avg self.beginMax = 1 # collecting data for maxValue elif self.beginMax: data = data - self.avg self.maxValueList.append(data.max()) if self.maxValueList.__len__() == 30: for a in self.maxValueList: if self.maxValue < a: self.maxValue = a print self.maxValue # maxValue ein bischen erhohen (steuert empfindlichkeit der erkennung) self.maxValue = self.maxValue + 0.05 self.beginMax = 0 else: data = data - self.avg # print data.max() if self.buffer.__len__() <= 10 and not self.start: self.buffer.append(data) elif self.buffer.__len__() == 11 and not self.start: self.buffer.pop(0) self.buffer.append(data) if data.max() > self.maxValue and self.start == 0: # print "starting ..." self.start = 1 if self.start: self.datalist.append(data) if(self.datalist.__len__() + self.buffer.__len__()) % 32 == 0: # print "net ac" # print "buffer: " + str(self.buffer.__len__()) # print "list: " + str(self.datalist.__len__()) self.net.reset() out = self.net._activateSequence(self.datalist) print(str(out)) self.datalist = [] self.buffer = [] self.datanum = 0 self.start = 0 return out return -1