Approach 1 - Classify Gestures based on  range of  Wiimote acceleration values


In this approach the acceleration values for X, Y, Z axis are read into the program and then gesture is classified as follows:

          if(x_accel > 0 && z_accel > 0 && (y_accel > -1 && y_accel < 1) )
         display('right')
   
         elseif(x_accel < 0 && z_accel > 0 && (y_accel > -1 && y_accel < 1)  )
         display('left')

         elseif(y_accel > 0 && (z_accel < 0) && (x_accel >-1 && x_accel <1) )
         display('forward')

         elseif(y_accel < 0 && (z_accel > 0)&& (x_accel >-1 && x_accel < 1) )
         display('back')
 


This approach is fast, but lacks accuracy, so I also developed approach 2 which provides more accurate gesture recognition and can also be used to recognize more complex gestures  (like the Square gesture) which approach 1 cannot do. 

 


Approach 2 - Using Counter Propagation Neural Network for Gesture Recognition


In this approach the X,Y,Z wiimote acceleration values are recorded for 3 seconds at an interval of 1 second. The following graphs depict this:

These acceleration values are stored in the form of a 12 x 1 vector ( First 4 values - X acceleration, Next 4 - Y acceleration, Next 4 - Z acceleration).  

This vector is then fed to the Counter Propogation Neural network as shown below, which is then trained with 3 samples (three 12x1 vectors) for each gesture. 

It consists of :

Kohonen Layer - 5 neurons ( 1 for each gesture)

Grossberg Layer - 4 neurons ( Provides output for each getsure )


The Kohonen Layer is used for classification and then the Grossberg Layer is used to calculate the output (binary) for  each gesture by comparing it with targets T1, T2, T3 and T4. So for example if I did a Pull up gesture, the output of the network should be 0001. 


The following algorithm was used to train the network in accordance with the technique mentioned in [3]:


1.      Get all training data vectors Xi, i = 1, 2 ….L.

2.      For each group of data vectors belonging to the same class, Xi ,  i = 1, 2 …..N.

           (a) Normalize each Xi, i = 1, 2,..N; X’i  = Xi / sqrt(∑X2j)

           (b) Compute the average vector X = (∑X’j)/N

           (c) Normalize the average vector, X’ = X /sqrt(∑X2)

           (d) Set corresponding Kohonen Neuron's, Weights, Wk = X     

           (e) Set the Grossberg weights, [W1k, W1k….W1k] to output vector Y.

    3.  Repeat step 2 until each class of training data is propagated into the network.

         Once the network is trained its ready for gesture recognition.

Make a Free Website with Yola.