Пример #1
0
        public double CalcRMSE(PragmaLearn.Learner.BackpropNeuralNetwork net, Dataset data, int count)
        {
            var error = 0.0;
            var c = 0;
            for (int i = 0; i < count; ++i)
            {
                var x = Tools.rnd.Index(data.input.Count);
                var p = net.Predict(data.input[x]);
                var y = data.output[x];
                var se = 0.0;
                for (int j = 0; j < p.Length; ++j)
                {
                    if (y[j] != -1)
                    {
                        se += (p[j] - y[j]) * (p[j] - y[j]);
                        c++;
                    }
                }
                error += se;
            }

            error /= c;

            return Math.Sqrt(error);
        }
        public static void ExportResult(Dataset testData, BackpropNeuralNetwork net)
        {
            var reader = new StreamReader(Path.Combine(dataPath, "IdLookupTable.csv"));
            var writer = new StreamWriter(Path.Combine(dataPath, "result.csv"));

            var featureNames = new List<string>()
            {
                "left_eye_center_x", "left_eye_center_y",
                "right_eye_center_x", "right_eye_center_y",
                "left_eye_inner_corner_x", "left_eye_inner_corner_y",
                "left_eye_outer_corner_x", "left_eye_outer_corner_y",
                "right_eye_inner_corner_x", "right_eye_inner_corner_y",
                "right_eye_outer_corner_x", "right_eye_outer_corner_y",
                "left_eyebrow_inner_end_x", "left_eyebrow_inner_end_y",
                "left_eyebrow_outer_end_x", "left_eyebrow_outer_end_y",
                "right_eyebrow_inner_end_x", "right_eyebrow_inner_end_y",
                "right_eyebrow_outer_end_x", "right_eyebrow_outer_end_y",
                "nose_tip_x", "nose_tip_y",
                "mouth_left_corner_x", "mouth_left_corner_y",
                "mouth_right_corner_x", "mouth_right_corner_y",
                "mouth_center_top_lip_x", "mouth_center_top_lip_y",
                "mouth_center_bottom_lip_x", "mouth_center_bottom_lip_y"
            };

            var featureLookup = featureNames.Select((f, i) => new { key = f, value = i }).ToDictionary(t => t.key, t => t.value);

            Console.WriteLine();

            var image = -1;
            var p = default(float[]);
            var s = reader.ReadLine();
            writer.WriteLine("RowId,Location");
            int row = 1;
            while((s = reader.ReadLine()) != null)
            {
                var v = s.Split(',');
                var img = int.Parse(v[1]);
                if (img != image)
                {
                    image = img;
                    p = net.Predict(testData.input[image-1]);
                }

                var idx = featureLookup[v[2]];
                var value = Tools.Clamp(p[idx] * origImgSize, 0, origImgSize);
                var rl = row + "," + value;
                row++;
                writer.WriteLine(rl);
                Console.Write(".");
            }
            Console.WriteLine();
            reader.Dispose();
            writer.Dispose();
        }
Пример #3
0
        static void addSample(Dataset data)
        {
            var input = default(float[]);
            var output = default(float[]);
            var count = minLineCount + Tools.rnd.Next(maxLineCount - minLineCount + 1);
            var points = new List<Vec2>();
            var lines = new List<LineSegment>();

            for (int i = 0; i < count; ++i)
            {
                var l = generateRandomLine();
                lines.Add(l);
                points.AddRange(generatePointsOnLine(l, epsilon));
                points.AddRange(generateWhiteNoise(whiteNoise));
            }

            var patchPointCount = 0;
            var patch = default(Rectangle);
            while (patchPointCount < 5)
            {
                patch = getRandomPatch(2 * tileSize);

                using (var i_bmp = new Bitmap(size, size))
                {
                    i_bmp.Clear(Color.Black);
                    foreach (var p in points)
                    {
                        var x = p.Xi;
                        var y = p.Yi;
                        if (x >= 0 && x < i_bmp.Width && y >= 0 && y < i_bmp.Height)
                        {
                            i_bmp.SetPixel(x, y, Color.White);
                            if (patch.Contains(p.Xi, p.Yi))
                                patchPointCount++;
                        }
                    }
                    if (patchPointCount < 5)
                        continue;
                    // Tools.Once(() => i_bmp.Save("input.png"));
                    using (var pbmp = i_bmp.GetPatch(patch, tileSize))
                    {
                        input = Tools.bmp_to_float(pbmp,0);
                    }
                }
            }

            using (var o_bmp = new Bitmap(size, size))
            {
                o_bmp.Clear(Color.Black);
                drawLines(lines, o_bmp);
                using (var lbmp = o_bmp.GetPatch(patch, tileSize))
                {
                    output = Tools.bmp_to_float(lbmp);
                }
            }

            addData(input, output, data);
        }
Пример #4
0
 private static void addData(float[] input, float[] output, Dataset data)
 {
     Monitor.Enter(data);
     if (data.input.Count % 1000 == 0)
         Console.WriteLine("{0}", data.input.Count);
     data.AddPair(input, output);
     Monitor.Exit(data);
 }
Пример #5
0
        public static Dataset Create(int samples)
        {
            Dataset result = new Dataset();
            Console.WriteLine("creating dataset: ");
            // for (int i = 0; i < samples; ++i)
            Parallel.For(0, samples, (x) =>
            {
                addSample(result);
            });

            result.VisualizeInput = (input) => Tools.float_to_bmp(input, tileSize, tileSize);
            result.VisualizeOutput = (output) => Tools.float_to_bmp(output, tileSize, tileSize);

            return result;
        }
        public static Dataset LoadResultData()
        {
            Dataset result = new Dataset();

            var reader = new StreamReader(Path.Combine(dataPath, "test.csv"));

            // ignore first line
            var line = reader.ReadLine();

            while ((line = reader.ReadLine()) != null)
            {
                var ls = line.Split(',');

                int pos = 0;

                var output = default(float[]);

                var pic = ls.Last().Split(' ');
                var img = new float[inputSize];
                for (int j = 0; j < inputSize; ++j)
                {
                    img[j] = float.Parse(pic[j]) / 255.0f;
                }

                var input = default(float[]);
                using (var bmp = Tools.float_to_bmp(img, origImgSize, origImgSize))
                {
                    using (var filtered = applyFilters(bmp))
                    {
                        input = Tools.bmp_to_float(filtered);
                    }
                }

                result.AddPair(input, output);
            }

            return result;
        }
        public static Dataset LoadTrainData()
        {
            Dataset result = new Dataset();
            var net = new PragmaLearn.Learner.BackpropNeuralNetwork();
               //  net.Open("network.dat");
            var reader = new StreamReader(Path.Combine(dataPath, "training.csv"));

            // ignore first line
            var line = reader.ReadLine();

            while ((line = reader.ReadLine()) != null)
            {
                var ls = line.Split(',');

                bool skipped = false;
                var keypoints = new double[outputSize];
                for (int i = 0; i < outputSize; ++i)
                {
                    if (string.IsNullOrEmpty(ls[i]))
                    {
                        Console.Write(".");
                        keypoints[i] = -1;
                        // output[i] = Tools.rnd.NextDouble();
                        skipped = true;
                        // break;
                    }
                    else
                    {
                        keypoints[i] = double.Parse(ls[i]);
                    }
                }

                //if (skipped)
                //    continue;

                var pic = ls.Last().Split(' ');
                var img = new float[inputSize];
                for (int j = 0; j < inputSize; ++j)
                {
                    img[j] = float.Parse(pic[j]) / 255.0f;
                }

                //if (skipped)
                //{
                //    using (var bmp = Tools.double_to_bmp(img, origImgSize, origImgSize))
                //    {
                //        using (var filtered = applyFilters(bmp))
                //        {
                //            var input = Tools.bmp_to_double(filtered);
                //            var p = net.Predict(input);

                //            for (int i = 0; i < keypoints.Length; ++i)
                //            {
                //                if (keypoints[i] == -1)
                //                    keypoints[i] = p[i] * origImgSize;
                //            }
                //        }
                //    }
                //}

                for (int x = 0; x < 20; ++x)
                {

                    var points = new PointF[keypoints.Length / 2];
                    for (int i = 0; i < keypoints.Length; i += 2)
                    {
                        points[i / 2] = new PointF((float)keypoints[i], (float)keypoints[i + 1]);
                    }

                    var input = default(float[]);

                    using (var bmp = Tools.float_to_bmp(img, origImgSize, origImgSize))
                    {
                        if (x != 0)
                        {
                            using (var transformed = transformRandom(bmp, points))
                            {
                                using (var filtered = applyFilters(transformed))
                                {
                                    input = Tools.bmp_to_float(filtered);
                                }
                            }
                        }
                        else
                        {
                            using (var filtered = applyFilters(bmp))
                            {
                                input = Tools.bmp_to_float(filtered);
                            }

                        }
                    }
                    var output = new float[keypoints.Length];
                    for (int i = 0; i < points.Length; i++)
                    {
                        output[2 * i] = points[i].X != -1 ? points[i].X / origImgSize : -1;
                        output[2 * i + 1] = points[i].Y != -1 ? points[i].Y / origImgSize : -1;
                    }

                    result.AddPair(input, output);
                }

                //if (skipped)
                //{
                //    var p = net.Predict(input);

                //    for (int i = 0; i < output.Length; ++i)
                //    {
                //        if (output[i] == -1)
                //            output[i] = p[i];
                //    }
                //}

            }

            reader.Dispose();
            return result;
        }
Пример #8
0
        public void RandomSplit(float ratio, out Dataset trainData, out Dataset testData)
        {
            if (ratio < 0 || ratio > 1)
                throw new ArgumentException("ratio must be in [0, 1]");

            trainData = new Dataset();
            testData = new Dataset();

            var indices = Enumerable.Range(0, input.Count).ToList();

            for (int i = 0; i < input.Count; ++i)
            {
                var d = default(Dataset);
                if (i < (int)(ratio * input.Count))
                    d = trainData;
                else
                    d = testData;

                var pos = Tools.rnd.Index(indices.Count);
                var x = indices[pos];
                indices.RemoveAt(pos);
                d.AddPair(input[x], output[x]);
            }
        }
Пример #9
0
        private void bLoadData_Click(object sender, EventArgs e)
        {
            resultData = KeypointData.LoadResultData();
            var data = KeypointData.LoadTrainData();
            data.RandomSplit(0.9f, out trainData, out testData);

            var hidden = trainData.GetInputDimension();
            initNet();
            clonedNet = network.Clone();
        }
Пример #10
0
        private void train(Dataset data, int batchSize = 100, int testModulo = 250)
        {
            Task.Run(() =>
            {
                running = true;

                int t = 1;
                while (running)
                {
                    Console.Write(".");
                    var batch = genMiniBatch(batchSize);
                    network.TrainMiniBatch(data, batch);

                    //if (network.learningRate > 0.00001)
                    //    network.learningRate *= 0.9995;
                    if (t % testModulo == 0)
                    {
                        Console.WriteLine("test begin");
                        this.Invoke(() => test(t));
                        Console.WriteLine("test end");
                    }
                    t++;
                }
            });
        }
Пример #11
0
        void display(int pos, Dataset data)
        {
            if (clonedNet == null)
                return;
            var input = data.input[pos];
            var s = KeypointData.imgSize;
            var p = clonedNet.Predict(input);
            replaceNetworkOutput(vizKeypoints(input, p));
            replaceOutput(vizKeypoints(data.input[pos], data.output[pos]));
            replaceInput(Tools.float_to_bmp(input, s, s));

            clonedNet.sampleDown();
            replaceNetworkInput(Tools.float_to_bmp(clonedNet.GetInputLayer(), s, s));
        }
Пример #12
0
        private void bOpenData_Click(object sender, EventArgs e)
        {
            trainData = new Dataset();
            trainData.Open("train.data");
            testData = new Dataset();
            testData.Open("test.data");
            resultData = new Dataset();
            resultData.Open("result.data");
            initNet();

            Console.WriteLine("opened");
        }