public TrajectoryModel(CHnMMClassificationSystem system, string name, IEnumerable <BaseTrajectory> trainingData) { recognitionSystem = system; Name = name; strokeMap = system.HiddenModelCreator.createStrokeMap(trainingData); model = system.HiddenModelCreator.createModel(trainingData, strokeMap); }
public static void Main() { var strokeCollection = new List <KeyValuePair <String, StrokeData> >(); var param1 = new IntParamVariation("nAreaForStrokeMap", 10, 10, 20); var param2 = new DoubleParamVariation("minRadiusArea", 0.01, 0.04, 0.25); var param3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.4, 2.5); var param5 = new BoolParamVariation("useFixAreaNumber", true); var param6 = new BoolParamVariation("useSmallestCircle", true); var param7 = new BoolParamVariation("isTranslationInvariant", true); var param8 = new BoolParamVariation("useAdaptiveTolerance", false); var param9 = new DoubleParamVariation("hitProbability", 0.9); var param10 = new StringParamVariation("distEstName", new string[] { nameof(NaiveUniformEstimator), nameof(NormalEstimator) }); var param11 = new BoolParamVariation("useEllipsoid", false); var configSet = ParameterVariation.getParameterVariations(param1, param2, param3, param5, param6, param7, param8, param9, param10, param11).Select(ps => new CHnMMParameter(ps)).ToArray(); CHnMMClassificationSystem cs = new CHnMMClassificationSystem(configSet[0]); string ConnectionString = "Server=localhost; Port=5432; User Id=touchy; Password=123456;Database = touchy_data_development"; NpgsqlConnection connection = new NpgsqlConnection(ConnectionString); try { connection.Open(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } NpgsqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT * FROM trajectories WHERE user_id='1' AND gesture_id='0' AND is_password='******'"; NpgsqlDataReader reader = command.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); foreach (DataRow row in dt.Rows) { string[,] db_points = row["points"] as string[, ]; var gestureName = row["user_id"] + "-" + row["gesture_id"] + "-" + row["stroke_seq"]; var user = Convert.ToInt32(row["id"]); var trace = Convert.ToInt32(row["stroke_seq"]); var trajectory = new StrokeData(user, trace, db_points); strokeCollection.Add(new KeyValuePair <String, StrokeData>(gestureName, trajectory)); } var lookup = strokeCollection.ToLookup(kvp => kvp.Key, kvp => kvp.Value); var keys = lookup.Select(g => g.Key).ToList(); for (int i = 0; i < keys.Count; i++) { List <StrokeData> fingerCollection = new List <StrokeData>(); foreach (StrokeData x in lookup[keys[i]]) { fingerCollection.Add(x); } cs.trainGesture(keys[i], fingerCollection.Cast <BaseTrajectory>()); } //command.CommandText = "SELECT * FROM trajectories WHERE exec_num='1' AND user_id='1' AND gesture_id='0'"; command.CommandText = "SELECT * FROM trajectories WHERE user_id='1' AND gesture_id='0' AND is_password='******'"; NpgsqlDataReader read = command.ExecuteReader(); DataTable vg = new DataTable(); vg.Load(read); var result = new double[vg.Rows.Count]; int c = 0; foreach (DataRow row in vg.Rows) { string[,] db_points = row["points"] as string[, ]; var gestureName = row["user_id"] + "-" + row["gesture_id"] + "-" + row["stroke_seq"]; var user = Convert.ToInt32(row["id"]); var trace = Convert.ToInt32(row["stroke_seq"]); var trajectory = new StrokeData(user, trace, db_points); result[c] = cs.getSimilarity(gestureName, trajectory); c++; } bool ok = false; foreach (var prob in result) { Console.WriteLine(prob); if (prob <= 0) { ok = false; //break; } ok = true; } NpgsqlCommand insertion = connection.CreateCommand(); if (ok) { Console.WriteLine(" Gesture matches!"); insertion.CommandText = "UPDATE gestures SET verified=1 WHERE user_id=1"; insertion.ExecuteNonQuery(); } else { Console.WriteLine(" Gesture does not match!"); insertion.CommandText = "UPDATE gestures SET verified=2 WHERE user_id=1"; insertion.ExecuteNonQuery(); } }
public static void Main() { var param1 = new IntParamVariation("nAreaForStrokeMap", 10, 5, 20); var param2 = new DoubleParamVariation("minRadiusArea", 0.01); var param3 = new DoubleParamVariation("toleranceFactorArea", 1.7, 0.2, 2.1); var param5 = new BoolParamVariation("useFixAreaNumber", true); var param6 = new BoolParamVariation("useSmallestCircle", true); var param7 = new BoolParamVariation("isTranslationInvariant", false); var param8 = new BoolParamVariation("useAdaptiveTolerance", false); var param9 = new DoubleParamVariation("hitProbability", 0.9); var param10 = new StringParamVariation("distEstName", new string[] { nameof(NaiveUniformEstimator), nameof(NormalEstimator) }); var param11 = new BoolParamVariation("useEllipsoid", false); var configSet = ParameterVariation.getParameterVariations(param1, param2, param3, param5, param6, param7, param8, param9, param10, param11).Select(ps => new CHnMMParameter(ps)).ToArray(); string ConnectionString = "Server=localhost; Port=5432; User Id=macbook; Database = touchy_data_development"; string ConnectionString_heroku = "Database=dcbpejtem8e4qu; Server=ec2-54-75-239-237.eu-west-1.compute.amazonaws.com; Port=5432; User Id=pbcgcsyjsmpeds; Password=323743a3eec80c0a49dcee493617af7b94fee458a6a89a671dc3acaad0c3f437; Sslmode=Require;Trust Server Certificate=true"; NpgsqlConnection connection = new NpgsqlConnection(ConnectionString); try { connection.Open(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } NpgsqlCommand command = connection.CreateCommand(); //######################################################### //RECOGNITION TASK// //######################################################### command.CommandText = "SELECT id FROM Tgestures"; NpgsqlDataReader ges_read = command.ExecuteReader(); DataTable gesture_table = new DataTable(); gesture_table.Load(ges_read); ges_read.Close(); var set = configSet[0]; //foreach (var set in configSet) //{ bool head = true; var file_name = "../../recognition/"; file_name += "tol_" + set.toleranceFactorArea; file_name += "_dist_" + set.distEstName; file_name += "_nArea_" + set.nAreaForStrokeMap; file_name += ".csv"; Console.WriteLine(file_name); System.Text.StringBuilder sb = new System.Text.StringBuilder(); CHnMMClassificationSystem cs = new CHnMMClassificationSystem(set); for (int global_user = 1; global_user < 12; global_user++) { foreach (DataRow gesture in gesture_table.Rows) { List <StrokeData> gestureStrokes = new List <StrokeData>(); var accumulate = new List <KeyValuePair <int, string[]> >(); command.CommandText = "SELECT * FROM trajectories WHERE user_id = " + global_user + " AND gesture_id=" + gesture["id"] + " AND exec_num % 2 = 1 ORDER BY exec_num, stroke_seq;"; NpgsqlDataReader reader = command.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); reader.Close(); var prev_exec = 1; var prev_stroke = 0; var time_lapse = 0; foreach (DataRow row in dt.Rows) { if (prev_exec != Convert.ToInt32(row["exec_num"])) { var trajectory = new StrokeData(global_user, accumulate); gestureStrokes.Add(trajectory); prev_exec = Convert.ToInt32(row["exec_num"]); time_lapse = 0; accumulate.Clear(); } string[,] db_points = row["points"] as string[, ]; int trace = Convert.ToInt32(row["stroke_seq"]); int rowLength = db_points.GetLength(0); if (prev_stroke != trace) { time_lapse = Convert.ToInt32(accumulate.Last().Value[2]); } for (int i = 0; i < rowLength; i++) { string[] single_pt = new string[4]; single_pt[0] = db_points[i, 0]; single_pt[1] = db_points[i, 1]; single_pt[2] = (Convert.ToInt32(db_points[i, 2]) + time_lapse).ToString(); single_pt[3] = trace.ToString(); accumulate.Add(new KeyValuePair <int, string[]>(Convert.ToInt32(db_points[i, 2]), single_pt)); } } if (accumulate.Count > 0) { var last_trajectory = new StrokeData(global_user, accumulate); gestureStrokes.Add(last_trajectory); } var gestureName = global_user + "-" + gesture["id"]; cs.trainGesture(gestureName, gestureStrokes.Cast <BaseTrajectory>()); Console.WriteLine("=============================================================================\n"); Console.WriteLine("============================================================================="); } } for (int global_user = 1; global_user < 12; global_user++) { Console.WriteLine("User=========================================================" + global_user); foreach (DataRow gesture in gesture_table.Rows) { var accumulate = new List <KeyValuePair <int, string[]> >(); command.CommandText = "SELECT * FROM trajectories WHERE user_id = " + global_user + " AND gesture_id=" + gesture["id"] + " AND exec_num % 2 = 0 ORDER BY exec_num, stroke_seq;"; NpgsqlDataReader reader = command.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); reader.Close(); var prev_exec = 2; var prev_stroke = 0; var time_lapse = 0; foreach (DataRow row in dt.Rows) { if (prev_exec != Convert.ToInt32(row["exec_num"])) { var trajectory = new StrokeData(global_user, accumulate); cs.recognizeGesture(trajectory); prev_exec = Convert.ToInt32(row["exec_num"]); time_lapse = 0; accumulate.Clear(); } string[,] db_points = row["points"] as string[, ]; int trace = Convert.ToInt32(row["stroke_seq"]); int rowLength = db_points.GetLength(0); if (prev_stroke != trace) { time_lapse = Convert.ToInt32(accumulate.Last().Value[2]); } for (int i = 0; i < rowLength; i++) { string[] single_pt = new string[4]; single_pt[0] = db_points[i, 0]; single_pt[1] = db_points[i, 1]; single_pt[2] = (Convert.ToInt32(db_points[i, 2]) + time_lapse).ToString(); single_pt[3] = trace.ToString(); accumulate.Add(new KeyValuePair <int, string[]>(Convert.ToInt32(db_points[i, 2]), single_pt)); } } if (accumulate.Count > 0) { var last_trajectory = new StrokeData(global_user, accumulate); var result = cs.recognizeGesture(last_trajectory); if (result == null) { Console.WriteLine(gesture["id"] + ": Not Recognized"); } else { Console.WriteLine(gesture["id"] + ": " + result); } } } } }