root / src / gesture / Gestures.h @ 22

View | Annotate | Download (3.7 KB)

1
/*
2
 * Gestures.h
3
 *
4
 *  Created on: Jun 8, 2009
5
 *      Author: damaraju
6
 */
7
8
#ifndef GESTURES_H_
9
#define GESTURES_H_
10
11
#include <map>
12
#include <string>
13
#include <fstream>
14
15
#include <touch/Touch.h>
16
#include <gesture/models/VectorGestureClassification.h>
17
18
#include <boost/range/adaptor/transformed.hpp>
19
#include <boost/range/algorithm/copy.hpp>
20
21
using namespace std;
22
//For debug and test
23
string base = "data/reOrdered/";
24
25
void printTransform(vector<vector<double> > transformed)
26
{
27
        cout << "Transformed Size: " << transformed.size() << endl;
28
29
        for(size_t i = 0; i < transformed.size(); ++i)
30
        {
31
                for (size_t j = 0; j < transformed.at(i).size(); ++j)
32
                        cout << i << ": " << transformed.at(i).at(j) << "\t";
33
                cout << endl;
34
        }
35
}
36
37
vector<GestureSample> readFile(string fileName)
38
{
39
        vector<GestureSample> readSamples;
40
        ifstream readFile;
41
42
        cout << "Reading: " << fileName << " " << endl;
43
        readFile.open(fileName.c_str());
44
        string line;
45
46
47
        if (readFile.is_open())
48
        {
49
                while(!readFile.eof())
50
                {
51
                        getline(readFile,line);
52
                        GestureSample sample = GestureSample(line);
53
54
                        if(sample.size() > 0)
55
                                readSamples.push_back(sample);
56
                }
57
                cout << "Num Samples: " << readSamples.size() << endl;
58
                readFile.close();
59
        }
60
        else
61
        {
62
                cout << "Unable to read file: " << fileName << endl;
63
        }
64
        return readSamples;
65
66
}
67
vector<GestureSample> readGestureSet(string gid, string uid)
68
{
69
        string fileName = "gid_" + gid + "_uid_" + uid + ".seqs";
70
        return readFile(base + fileName);
71
}
72
73
74
vector<vector<vector<double> > > transformSamples(vector<GestureSample> samples)
75
{
76
        vector<vector<vector<double> > > transformedSet;
77
        //cout << "Transforming " << samples.size() << " samples" << endl;
78
79
        if (samples.size() > 0)
80
                for (size_t i = 0; i < samples.size(); ++i)
81
                        transformedSet.push_back(samples.at(i).transform());
82
        else
83
                cout << "No Samples" << endl;
84
85
        return transformedSet;
86
}
87
88
class RecognitionHelper
89
{
90
public:
91
        VectorGestureClassification classifier;
92
        map<int, string>                         gestureNameMap;
93
94
        RecognitionHelper()
95
        {}
96
        void trainWithSamples(vector<GestureSample> trainingSet, string gestureName)
97
        {
98
                vector<vector<vector<double> > > trnsfTrain = transformSamples(trainingSet);
99
                //Magical filter takes care of all preprocessing, and live processing of the incoming sample(s).
100
                multitouch_filter filter = multitouch_filter(trnsfTrain);
101
102
                //Ensure the training set is appropriately scaled for training the model.
103
                vector<vector<vector<double> > > filteredTraining = trnsfTrain;
104
                for(size_t i = 0; i < trnsfTrain.size(); i++)
105
                {
106
                        filter.reset_params_for(trnsfTrain[i]);
107
                        boost::copy(trnsfTrain[i] | boost::adaptors::transformed(filter),filteredTraining[i].begin());
108
                }
109
110
                cout << "Training With: " << filteredTraining.size() << " samples" << endl;
111
                classifier.addGestureWithExamplesAndFilter(filteredTraining, 5, filter);
112
                gestureNameMap.insert(pair<int, string>(classifier.numGestures() - 1, gestureName));
113
                cout << "\nAdded new gesture(" << classifier.numGestures() - 1 << "): " << gestureName << "\n"<<endl;
114
        }
115
116
        string classify(GestureSample sample)
117
        {
118
                vector<vector<double> > transformed = sample.transform();
119
                //printTransform(transformed);
120
                int classIndex = classifier.classify(transformed);
121
                vector<long double> probs = classifier.probabilities();
122
123
                bool allZero = true;
124
                for(unsigned int i = 0 ; i < probs.size(); i++)
125
                {
126
                        if(probs[i] > 0)
127
                                allZero = false;
128
                        cout << probs[i] << ", ";
129
                }
130
                cout << endl;
131
132
                if(!allZero && classIndex >= 0 && ((unsigned int)classIndex) < gestureNameMap.size())
133
                        return gestureNameMap[classIndex];
134
                else //classIndex == -1 || allZero probabilities when sample doesn't match any filter-model pair
135
                        return "None";
136
        }
137
138
        const std::vector<long double> &probabilities() const
139
        {
140
            return classifier.probabilities();
141
        }
142
143
};
144
145
#endif /* GESTURES_H_ */