gestures

[unmaintained] PoC for motion gesture detection from webcam input
Log | Files | Refs | README | LICENSE

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