Example #1
0
        public void TestEM2()
        {
            Random r = new Random(DateTime.Now.Millisecond);
            int    N = 2000;
            int    D = 20;
            int    G = 10;

            EM             Em        = new EM();
            Matrix <int>   labels    = new Matrix <int>(N, 1);
            Matrix <float> featuresM = new Matrix <float>(N, D);

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < D; j++)
                {
                    featuresM[i, j] = 100 * (float)r.NextDouble() - 50;
                }
            }

            EMParams pars = new EMParams();

            pars.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_DIAGONAL;
            pars.Nclusters  = G;
            pars.StartStep  = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_AUTO_STEP;
            pars.TermCrit   = new MCvTermCriteria(100, 1.0e-6);

            Em.Train(featuresM, null, pars, labels);
        }
Example #2
0
        public void TestEM2()
        {
            Random r = new Random(DateTime.Now.Millisecond);
             int N = 2000;
             int D = 20;
             int G = 10;

             EM Em = new EM();
             Matrix<int> labels = new Matrix<int>(N, 1);
             Matrix<float> featuresM = new Matrix<float>(N, D);
             for (int i = 0; i < N; i++)
            for (int j = 0; j < D; j++)
               featuresM[i, j] = 100 * (float)r.NextDouble() - 50;

             EMParams pars = new EMParams();
             pars.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_DIAGONAL;
             pars.Nclusters = G;
             pars.StartStep = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_AUTO_STEP;
             pars.TermCrit = new MCvTermCriteria(100, 1.0e-6);

             Em.Train(featuresM, null, pars, labels);
        }
Example #3
0
        public void TestEM()
        {
            int N = 4; //number of clusters
             int N1 = (int)Math.Sqrt((double)4);

             Bgr[] colors = new Bgr[] {
            new Bgr(0, 0, 255),
            new Bgr(0, 255, 0),
            new Bgr(0, 255, 255),
            new Bgr(255, 255, 0)};

             int nSamples = 100;

             Matrix<float> samples = new Matrix<float>(nSamples, 2);
             Matrix<Int32> labels = new Matrix<int>(nSamples, 1);
             Image<Bgr, Byte> img = new Image<Bgr,byte>(500, 500);
             Matrix<float> sample = new Matrix<float>(1, 2);

             CvInvoke.cvReshape(samples.Ptr, samples.Ptr, 2, 0);
             for (int i = 0; i < N; i++)
             {
            Matrix<float> rows = samples.GetRows(i * nSamples / N, (i + 1) * nSamples / N, 1);
            double scale = ((i % N1) + 1.0) / (N1 + 1);
            MCvScalar mean = new MCvScalar(scale * img.Width, scale * img.Height);
            MCvScalar sigma = new MCvScalar(30, 30);
            rows.SetRandNormal(mean, sigma);
             }
             CvInvoke.cvReshape(samples.Ptr, samples.Ptr, 1, 0);

             using (EM emModel1 = new EM())
             using (EM emModel2 = new EM())
             {
            EMParams parameters1 = new EMParams();
            parameters1.Nclusters = N;
            parameters1.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_DIAGONAL;
            parameters1.StartStep = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_AUTO_STEP;
            parameters1.TermCrit = new MCvTermCriteria(10, 0.01);
            emModel1.Train(samples, null, parameters1, labels);

            EMParams parameters2 = new EMParams();
            parameters2.Nclusters = N;
            parameters2.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_GENERIC;
            parameters2.StartStep = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_E_STEP;
            parameters2.TermCrit = new MCvTermCriteria(100, 1.0e-6);
            parameters2.Means = emModel1.Means;
            parameters2.Covs = emModel1.GetCovariances();
            parameters2.Weights = emModel1.Weights;

            emModel2.Train(samples, null, parameters2, labels);

            //TODO: Find out when saving of EM model will be enable
            //emModel2.Save("emModel.xml");

            #region Classify every image pixel
            for (int i = 0; i < img.Height; i++)
               for (int j = 0; j < img.Width; j++)
               {
                  sample.Data[0, 0] = i;
                  sample.Data[0, 1] = j;
                  int response = (int) emModel2.Predict(sample, null);

                  Bgr color = colors[response];

                  img[j, i] = new Bgr(color.Blue*0.5, color.Green * 0.5, color.Red * 0.5 );
               }
            #endregion

            #region draw the clustered samples
            for (int i = 0; i < nSamples; i++)
            {
               img.Draw(new CircleF(new PointF(samples.Data[i, 0], samples.Data[i, 1]), 1), colors[labels.Data[i, 0]], 0);
            }
            #endregion
             }
        }
Example #4
0
        public void TestEM()
        {
            int N  = 4; //number of clusters
            int N1 = (int)Math.Sqrt((double)4);

            Bgr[] colors = new Bgr[] {
                new Bgr(0, 0, 255),
                new Bgr(0, 255, 0),
                new Bgr(0, 255, 255),
                new Bgr(255, 255, 0)
            };

            int nSamples = 100;

            Matrix <float>    samples = new Matrix <float>(nSamples, 2);
            Matrix <Int32>    labels  = new Matrix <int>(nSamples, 1);
            Image <Bgr, Byte> img     = new Image <Bgr, byte>(500, 500);
            Matrix <float>    sample  = new Matrix <float>(1, 2);

            CvInvoke.cvReshape(samples.Ptr, samples.Ptr, 2, 0);
            for (int i = 0; i < N; i++)
            {
                Matrix <float> rows  = samples.GetRows(i * nSamples / N, (i + 1) * nSamples / N, 1);
                double         scale = ((i % N1) + 1.0) / (N1 + 1);
                MCvScalar      mean  = new MCvScalar(scale * img.Width, scale * img.Height);
                MCvScalar      sigma = new MCvScalar(30, 30);
                rows.SetRandNormal(mean, sigma);
            }
            CvInvoke.cvReshape(samples.Ptr, samples.Ptr, 1, 0);

            using (EM emModel1 = new EM())
                using (EM emModel2 = new EM())
                {
                    EMParams parameters1 = new EMParams();
                    parameters1.Nclusters  = N;
                    parameters1.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_DIAGONAL;
                    parameters1.StartStep  = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_AUTO_STEP;
                    parameters1.TermCrit   = new MCvTermCriteria(10, 0.01);
                    emModel1.Train(samples, null, parameters1, labels);

                    EMParams parameters2 = new EMParams();
                    parameters2.Nclusters  = N;
                    parameters2.CovMatType = Emgu.CV.ML.MlEnum.EM_COVARIAN_MATRIX_TYPE.COV_MAT_GENERIC;
                    parameters2.StartStep  = Emgu.CV.ML.MlEnum.EM_INIT_STEP_TYPE.START_E_STEP;
                    parameters2.TermCrit   = new MCvTermCriteria(100, 1.0e-6);
                    parameters2.Means      = emModel1.Means;
                    parameters2.Covs       = emModel1.GetCovariances();
                    parameters2.Weights    = emModel1.Weights;

                    emModel2.Train(samples, null, parameters2, labels);

                    //TODO: Find out when saving of EM model will be enable
                    //emModel2.Save("emModel.xml");

                    #region Classify every image pixel
                    for (int i = 0; i < img.Height; i++)
                    {
                        for (int j = 0; j < img.Width; j++)
                        {
                            sample.Data[0, 0] = i;
                            sample.Data[0, 1] = j;
                            int response = (int)emModel2.Predict(sample, null);

                            Bgr color = colors[response];

                            img[j, i] = new Bgr(color.Blue * 0.5, color.Green * 0.5, color.Red * 0.5);
                        }
                    }
                    #endregion

                    #region draw the clustered samples
                    for (int i = 0; i < nSamples; i++)
                    {
                        img.Draw(new CircleF(new PointF(samples.Data[i, 0], samples.Data[i, 1]), 1), colors[labels.Data[i, 0]], 0);
                    }
                    #endregion
                }
        }