Пример #1
0
        public bool TrainSceneFeature(SceneFeatureData scenefeatureData)
        {
            //Create bow
            Bitmap mask   = Utils.CreateMaskBitmap(new Size(1280, 720), new Rectangle[] { scenefeatureData.feature.area });
            var    bow    = BagOfVisualWords.Create(numberOfWords: scenefeatureData.feature.bowSize);
            var    images = scenefeatureData.trainData.GetBitmaps(mask);

            bow.Learn(images);
            Accord.IO.Serializer.Save(bow, path + @"\" + scenefeatureData.feature.name + String.Format(@"\train-{0}.bow", scenefeatureData.feature.bowSize));
            bow.Show();
            return(Train(bow, scenefeatureData));
        }
Пример #2
0
        private bool Train(dynamic bow, SceneFeatureData scenefeatureData)
        {
            Bitmap mask = Utils.CreateMaskBitmap(new Size(1280, 720), new Rectangle[] { scenefeatureData.feature.area });

            mask.Save(scenefeatureData.feature.name + "-mask.png");
            var trainData = scenefeatureData.trainData;

            int[]      labelIndexs = trainData.GetLabelIndexs();
            String[]   labels      = trainData.GetLabels();
            double[][] features    = trainData.GetFeature(bow, mask);
            int        numOutput   = trainData.GetNumOutput();
            var        function    = new SigmoidFunction();
            bool       flgFound    = false;
            int        count       = 0;

            while ((flgFound == false) && (count < 100))
            {
                count++;
                var network = new ActivationNetwork(function, bow.NumberOfOutputs, 20, numOutput);
                new NguyenWidrow(network).Randomize();
                var teacher = new ParallelResilientBackpropagationLearning(network);

                BowImageClassifier trainImgClassifier = new BowImageClassifier();
                trainImgClassifier.Init(bow, network, mask);
                //creat output
                double[][] outputs    = trainData.GetOutputs(numOutput);
                double     avgError   = 10000.0;
                double     prevError  = avgError;
                double     bestError  = avgError;
                int        errorCount = 0;
                while ((errorCount < 3) && (avgError > 0.00001))
                {
                    //Application.DoEvents();
                    double[] errors = new double[10];
                    for (int i = 0; i < 10; i++)
                    {
                        errors[i] = teacher.RunEpoch(features, outputs);
                    }
                    avgError = errors.Average();
                    if (prevError > avgError)
                    {
                        int trainError = trainImgClassifier.Evaluate(trainData);
                        //int testError = trainImgClassifier.Evaluate(testData);
                        //int testSetError = trainImgClassifier.Evaluate(testDataSet);
                        logger.logStr(String.Format("{0} {1} {2}", avgError, prevError, trainError));
                        prevError = avgError;
                        //save best error
                        if (bestError > avgError)
                        {
                            bestError = avgError;
                            //Accord.IO.Serializer.Save(network, dataPath + String.Format(@"\train-{0}.net", bow.NumberOfOutputs));
                        }
                        if (trainError /*+ testError + testSetError*/ == 0)
                        {
                            Accord.IO.Serializer.Save(network, path + @"\" + scenefeatureData.feature.name + String.Format(@"\train-{0}.net", bow.NumberOfOutputs));
                            logger.logStr("Done " + bestError + " " + trainError);
                            return(true);
                        }
                    }
                    else
                    {
                        logger.logStr(String.Format("{0}", avgError));
                        prevError = 10000.0;
                        errorCount++;
                    }
                    //Application.DoEvents();
                }
                logger.logStr("Done " + bestError + " " + count);
            }
            return(false);
        }