public IEnumerable <Prediction> PredictTopN(RawDrawing drawing, int predictionsCount, double minActivation) { if (Evaluator == null) { return(null); } var normDrawing = dataProcessor.Normalize(drawing); var img = rasterizer.Rasterize(normDrawing, TrainSettings.InputImgSizePx, TrainSettings.PenThicknessPerc / 100f, true, false); var input = inputConvertor.ImageToVector(img); return(Evaluator.PredictTopN(input, predictionsCount, minActivation)); }
public Matrix <double> CreateInputsMatrix(IEnumerable <RawDrawing> rawDrawings, Rasterizer rasterizer, bool normalize) { Contract.Requires(rawDrawings.Count() > 0); var inputVectors = new List <Vector <double> >(); using (var img = new Bitmap(rasterizer.ImageSize, rasterizer.ImageSize, PixelFormat.Format24bppRgb)) { int cols = img.Width * img.Height; foreach (var drawing in rawDrawings) { RawDrawing rd = normalize ? dataProcessor.Normalize(drawing) : drawing; rasterizer.Rasterize(img, rd); inputVectors.Add(ImageToVector(img)); } } return(DenseMatrix.OfRowVectors(inputVectors)); }
private SymbolDrawing insertSymbolDrawingFromJson(string jsonData, Symbol symbol, bool drawnUsingTouch) { RawDrawing drawing; try { var lines = JsonConvert.DeserializeObject <RawPoint[][]>(jsonData); drawing = new RawDrawing() { Lines = lines }; } catch (Exception ex) { return(null); } new RawDataProcessor().CleanData(drawing); if (drawing.LinesCount == 0) { return(null); } var userManager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(db)); ApplicationUser author = User.Identity.IsAuthenticated ? userManager.FindById(User.Identity.GetUserId()) : null; var sd = new SymbolDrawing() { Symbol = symbol, CreatedDateTime = DateTime.UtcNow, DrawnUsingTouch = drawnUsingTouch, Creator = author, Approved = (author == null || userManager.IsInRole(author.Id, RolesHelper.Teacher) == false) ? null : (bool?)true }; sd.SetRawDrawing(drawing); sd = db.SymbolDrawings.Add(sd); db.SaveChanges(); Logger.LogInfo <TeachController>("New symbol drawing [{0}].", sd.SymbolDrawingId); return(sd); }
private List <Tuple <Symbol, float> > predict(RawDrawing rawDrawing) { var predictions = evaluator.PredictTopN(rawDrawing, 8, 0.05); var rawResults = new List <Tuple <Symbol, float> >(); // TODO: Optimize this query/step, maybe? foreach (Prediction pred in predictions) { Symbol symbol = db.Symbols.Where(s => s.SymbolId == pred.OutputId).FirstOrDefault(); if (symbol != null) { rawResults.Add(new Tuple <Symbol, float>(symbol, pred.NeuronOutputValue)); } } // This selects all symbols from DB and then filters them in C# anyways. //var rawResults = predictions.Join(db.Symbols, p => p.OutputId, s => s.SymbolId, (p, s) => new { // Symbol = s, // Rating = p.NeuronOutputValue, //}).ToList(); return(rawResults); }
/// <summary> /// Serializes given drawing to the raw data. /// </summary> public void SetRawDrawing(RawDrawing value) { RawData = value.Serialize(); }
/// <summary> /// Deserializes the drawing from raw data. /// </summary> public RawDrawing GetRawDrawing() { return(RawDrawing.Deserialize(RawData)); }
public virtual ActionResult Predict(PredictModel model) { if (!ModelState.IsValid) { return(HttpNotFound()); } var sw = Stopwatch.StartNew(); RawDrawing rawDrawing; try { var lines = JsonConvert.DeserializeObject <RawPoint[][]>(model.JsonData); rawDrawing = new RawDrawing() { Lines = lines }; } catch (Exception ex) { return(HttpNotFound()); } if (rawDrawing.LinesCount == 0) { return(Json(new { Results = new int[0], // Any empty array will do (C# meets JS :). Duration = (float)sw.Elapsed.TotalMilliseconds, })); } List <Tuple <Symbol, float> > rawResults = predict(rawDrawing); var minTime = DateTime.UtcNow.AddSeconds(-GUID_CHECK_WINDOW_SECONDS); Drawing drawing = null; if (model.IsFollowupDraw) { drawing = db.Drawings .Where(d => d.ClientGuid == model.Guid && DateTime.Compare(d.DrawnDateTime, minTime) > 0) .FirstOrDefault(); } if (drawing == null) { drawing = new Drawing(); drawing.DrawnDateTime = DateTime.UtcNow; drawing.ClientGuid = model.Guid; db.Drawings.Add(drawing); } #if DEBUG else { // Delete potentially cached image - this does not happen ofthen but it is annoying when it does happen. new DrawingsController(db, DependencyResolver.Current.GetService <AppSettingsProvider>()) .ClearCachedImage(drawing.DrawingId); } #endif var firstResult = rawResults.FirstOrDefault(); drawing.TopSymbol = firstResult == null ? null : firstResult.Item1; drawing.TopSymbolScore = firstResult == null ? null : (double?)firstResult.Item2; drawing.DrawnUsingTouch = model.DrawnUsingTouch; drawing.SetRawDrawing(rawDrawing); db.SaveChanges(); return(Json(new { Results = rawResults.Select(x => new { SymbolId = x.Item1.SymbolId, Symbol = x.Item1.SymbolStr, SymbolName = x.Item1.Name, Rating = x.Item2, HtmlEntity = x.Item1.HtmlEntity ?? "", UtfCode = char.ConvertToUtf32(x.Item1.SymbolStr, 0), }), Duration = (float)sw.Elapsed.TotalMilliseconds, })); }