public Bitmap DrawDataToGrid(IList <Tuple <Vector <double>, Color, string> > data, int imageSize, Color bg, int cols) { Contract.Requires(data.Count > 0); int count = data.Count; int rows = (count + cols - 1) / cols; Size size = new Size(1 + cols * (imageSize + 1), 1 + rows * (imageSize + 1)); Bitmap img = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb); var font = new Font(FontFamily.GenericSansSerif, 5); var drawingImg = new Bitmap(imageSize, imageSize, PixelFormat.Format24bppRgb); var ic = new NetInputConvertor(); using (Graphics g = Graphics.FromImage(img), imgG = Graphics.FromImage(drawingImg)) { g.Clear(bg); int row = 0; int col = 0; foreach (var item in data) { Contract.Assert(row < rows && col < cols); var bb = new Rectangle(1 + col * (imageSize + 1), 1 + row * (imageSize + 1), imageSize, imageSize); imgG.Clear(item.Item2); ic.VectorToImage(item.Item1, drawingImg); g.DrawImageUnscaled(drawingImg, bb); if (!string.IsNullOrWhiteSpace(item.Item3)) { g.DrawString(item.Item3, font, Brushes.White, bb.X + 1, bb.Y + 1); g.DrawString(item.Item3, font, Brushes.Black, bb.Location); } col += 1; if (col >= cols) { col = 0; row += 1; } } } return(img); }
private void prepareInOut(MausrDb db) { var ic = new NetInputConvertor(); var dbInputs = db.SymbolDrawings.Where(x => x.Approved == true).ToList(); var baseInputsAndDrawings = dbInputs .Select(sd => new { SymbolId = sd.Symbol.SymbolId, RawDrawing = sd.GetRawDrawing() }) .ToList(); var inputsAndDrawings = baseInputsAndDrawings.ToList(); var dataProc = new RawDataProcessor(); if (trainSettings.GenerateExtraInputsByRotation != 0) { inputsAndDrawings.AddRange(baseInputsAndDrawings .Select(x => new { SymbolId = x.SymbolId, RawDrawing = dataProc.Rotate(x.RawDrawing, trainSettings.GenerateExtraInputsByRotation) })); inputsAndDrawings.AddRange(baseInputsAndDrawings .Select(x => new { SymbolId = x.SymbolId, RawDrawing = dataProc.Rotate(x.RawDrawing, -trainSettings.GenerateExtraInputsByRotation) })); } if (trainSettings.NormalizeInput) { foreach (var iad in inputsAndDrawings) { dataProc.NormalizeInPlace(iad.RawDrawing); } } ic.Shuffle(inputsAndDrawings); var rasterizer = new Rasterizer() { ImageSize = trainSettings.InputImgSizePx, DrawPoints = false, ExtraMargin = true, PenSizePerc = trainSettings.PenThicknessPerc / 100f }; int testSamplesCount = 1 + (trainSettings.TestDataSetSizePerc * inputsAndDrawings.Count / 100); { var testSet = inputsAndDrawings.Take(testSamplesCount).ToList(); var testDrawings = testSet.Select(x => x.RawDrawing).ToList(); testInputs = ic.CreateInputsMatrix(testDrawings, rasterizer, false); testOutIds = testSet.Select(x => x.SymbolId).ToArray(); testOutNeuronIndices = ic.CreateOutIndicesFromIds(testOutIds, network); } { var trainSet = inputsAndDrawings.Skip(testSamplesCount).ToList(); var trainDrawings = trainSet.Select(x => x.RawDrawing).ToList(); trainInputs = ic.CreateInputsMatrix(trainDrawings, rasterizer, false); trainOutIds = trainSet.Select(x => x.SymbolId).ToArray(); trainOutNeuronIndices = ic.CreateOutIndicesFromIds(trainOutIds, network); } }