コード例 #1
0
        public string recognizeGesture(string gestureName, BaseTrajectory trace, out TrajectoryModel.ReasonForFail failReason)
        {
            //GestureRepresentation.ReasonForFail failReason;
            //var calculations = knownGestures.Select((gest,i) => new { GestureName = gest.Key, Similarity = gest.Value.validateGestureTrace(trace, out failReasons[i]) });

            double best   = 0;
            string winner = "";

            TrajectoryModel.ReasonForFail tmp;
            failReason = TrajectoryModel.ReasonForFail.UNDEFINED;
            foreach (var gest in knownGestures)
            {
                var sim = gest.Value.validateGestureTrace(trace, out tmp);
                if (gest.Key == gestureName)
                {
                    failReason = tmp;
                }
                if (sim > best)
                {
                    best   = sim;
                    winner = gest.Key;
                }
            }

            if (best == 0)
            {
                return(null);
            }
            else
            {
                return(winner);
            }
        }
コード例 #2
0
        public bool authenticateUser(string userName, GestureTrace trace, out TrajectoryModel.ReasonForFail failReason)
        {
            var targetGesture = knownGestures[userName];
            var similarity    = targetGesture.validateGestureTrace(trace.LongestStroke, out failReason);

            //ToDo: evtl. Schwellwerte hier prüfen?
            return(similarity > 0);
        }
コード例 #3
0
        public static LinkedList <AuthenticationResultRow> validateAuthentication(CHnMMRecognitionSystem system, Dictionary <string, GestureTrace[]> dataSets, int nSubsets)
        {
            //if(nTrainSets + nTestSets != nSubsets) throw new ArgumentException("Anzahl der Train- und Testsets passt nicht zur angegebenen Anzahl an Subsets");

            var results = new LinkedList <AuthenticationResultRow>();

            foreach (var entry in dataSets)
            {
                var trueUser     = entry.Key;
                var trueUserData = entry.Value;

                var subsets = createSubsets(trueUserData, nSubsets);

                //Leave one out cross validation: http://en.wikipedia.org/wiki/Cross-validation_%28statistics%29#Leave-one-out_cross-validation
                for (int curTestSetIndex = 0; curTestSetIndex < nSubsets; curTestSetIndex++)
                {
                    var trainSet = subsets.Where((ss, i) => i != curTestSetIndex).SelectMany(ss => ss).ToArray();
                    var testSet  = subsets[curTestSetIndex];

                    //use trainSet to train the model
                    system.trainGesture(trueUser, trainSet.Select(gt => gt.LongestStroke).ToArray());

                    //true positives, false negatives, false positives and true negatives
                    int TP    = 0;
                    int FN    = 0;
                    int FP    = 0;
                    int TN    = 0;
                    int wbfTU = 0;
                    int wbtTU = 0;
                    int wbfFU = 0;
                    int wbtFU = 0;


                    //calc estimated FRR
                    foreach (var testTrace in testSet)
                    {
                        TrajectoryModel.ReasonForFail reason;
                        if (!system.authenticateUser(trueUser, testTrace, out reason))
                        {
                            FN++;
                        }
                        else
                        {
                            TP++;
                        }

                        if (reason == TrajectoryModel.ReasonForFail.MissedArea)
                        {
                            wbfTU++;
                        }
                        if (reason == TrajectoryModel.ReasonForFail.MissedTransition)
                        {
                            wbtTU++;
                        }
                    }

                    //calc estimated FAR
                    foreach (var falseData in dataSets)
                    {
                        var falseUser     = falseData.Key;
                        var falseUserData = falseData.Value;

                        if (trueUser == falseUser)
                        {
                            continue;
                        }

                        TrajectoryModel.ReasonForFail reason = TrajectoryModel.ReasonForFail.UNDEFINED;
                        foreach (var falseUserTrace in falseUserData)
                        {
                            if (!system.authenticateUser(trueUser, falseUserTrace, out reason))
                            {
                                TN++;
                            }
                            else
                            {
                                FP++;
                            }
                        }

                        if (reason == TrajectoryModel.ReasonForFail.MissedArea)
                        {
                            wbfFU++;
                        }
                        if (reason == TrajectoryModel.ReasonForFail.MissedTransition)
                        {
                            wbtFU++;
                        }
                    }

                    //save result
                    var result = new AuthenticationResultRow();
                    result.user = trueUser;
                    result.run  = curTestSetIndex;
                    result.FN   = FN;
                    result.FP   = FP;
                    result.TP   = TP;
                    result.TN   = TN;
                    result.wrongByFormFalseUser = wbfFU;
                    result.wrongByFormTrueUser  = wbfTU;
                    result.wrongByTimeFalseUser = wbtFU;
                    result.wrongByTimeTrueUser  = wbtTU;
                    results.AddLast(result);
                }
            }

            return(results);
        }