models.py (2495B)
1 import ghmm 2 import simplejson 3 import os.path 4 5 UP = 0 6 DOWN = 1 7 LEFT = 2 8 RIGHT = 3 9 UP_RIGHT = 4 10 UP_LEFT = 5 11 DOWN_RIGHT = 6 12 DOWN_LEFT = 7 13 GESTES_COUNT = 4 14 OBSERVATIONS_COUNT = 8 15 16 gestures = [ 17 ([UP, RIGHT], ['/usr/bin/xdotool', 'getactivewindow', 'windowkill']), 18 ([UP, LEFT], ['notify-send', '"received command"', '"Hooray!"']), 19 ([DOWN], ['amixer', 'set', 'Master', '10%-']), 20 ([UP], ['amixer', 'set', 'Master', '10%+']), 21 ([UP, DOWN, UP], ['mplayer']), 22 ] 23 24 training_data = [[] for gesture in gestures] 25 26 def normalize_rows(matrix): 27 new_matrix = [] 28 29 for row in matrix: 30 div = sum(row) 31 new_matrix.append([]) 32 33 for elem in row: 34 if div != 0: 35 new_matrix[-1].append(float(elem)/div) 36 else: 37 new_matrix[-1].append(elem) 38 39 return new_matrix 40 41 # TODO: Zuordnung von Indizes stimmt noch nicht 42 def transition_matrix(gesture): 43 A = [[0 for i in range(GESTES_COUNT)] for j in range(GESTES_COUNT)] 44 # self transitions are high 45 for geste in gesture: 46 A[geste][geste] = 0.7 47 48 first = gesture[0] 49 50 for second in gesture[1:]: 51 # if we have a transition, prob must be high 52 A[first][second] = 0.4 53 first = second 54 55 # ending element has no transitions anymore, so give it one 56 A[gesture[-1]][gesture[-1]] = 1 57 58 return normalize_rows(A) 59 60 def emission_matrix(): 61 B = [[float(1)/OBSERVATIONS_COUNT for i in range(OBSERVATIONS_COUNT)] for j in range(GESTES_COUNT)] 62 63 B[UP] = [0.37, 0.04, 0.08, 0.08, 0.165, 0.165, 0.05, 0.05] 64 B[DOWN] = [0.04, 0.37, 0.08, 0.08, 0.05, 0.05, 0.165, 0.165] 65 B[LEFT] = [0.08, 0.08, 0.37, 0.04, 0.05, 0.165, 0.05, 0.165] 66 B[RIGHT] = [0.08, 0.08, 0.04, 0.37, 0.165, 0.05, 0.165, 0.05] 67 return B 68 69 def initial_vector(gesture): 70 vec = [0 for i in range(GESTES_COUNT)] 71 vec[gesture[0]] = 1 72 return vec 73 74 # Construct parameters 75 models = [] 76 77 sigma = ghmm.IntegerRange(0, 8) 78 i = 0 79 B = emission_matrix() 80 for gesture in gestures: 81 A = transition_matrix(gesture[0]) 82 pi = initial_vector(gesture[0]) 83 84 m = ghmm.HMMFromMatrices(sigma, ghmm.DiscreteDistribution(sigma), A, B, pi) 85 print(m) 86 if os.path.isfile(''.join(('models/', str(i), '.train'))): 87 with open(''.join(('models/', str(i), '.train'))) as f: 88 training_data[i] = simplejson.load(f) 89 m.baumWelch(ghmm.SequenceSet(sigma, training_data[i])) 90 print(m) 91 models.append((m, gesture[1])) 92 93 i += 1