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); } }
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); }
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); }