Example #1
0
        /// <summary>
        /// job complete
        /// </summary>
        /// <param name="taskName"></param>
        /// <param name="outputs"></param>
        private void Job_OnTaskComplete(string taskName, params object[] outputs)
        {
            switch (taskName)
            {
            //load image classification result
            case "COVRasterTask":
            case "RFClassificationTask":
            case "CnnClassificationTask":
            case "DqnClassificationTask":
                string fullFilename = outputs[0] as string;
                ReadRaster(fullFilename);
                break;

            //load image
            case "ReadRasterTask":
                string nodeName = outputs[0] as string;
                Dictionary <string, Bitmap2> dict = outputs[1] as Dictionary <string, Bitmap2>;
                GRasterLayer rasterLayer          = outputs[2] as GRasterLayer;
                UpdateReadRasterUI(nodeName, dict, rasterLayer);
                break;

            // rpc rester rectify
            case "RPCRasterRectifyTask":
                break;

            default:
                break;
            }
            //print completed information
            string msg = string.Format("time:{0},task:{1} completed", Now, taskName);

            Invoke(new UpdateMapListBoxHandler(UpdateMapListBox), msg);
        }
        public void ClassificationByDQN()
        {
            double _loss = 1.0;
            //
            GRasterLayer featureLayer = new GRasterLayer(featureFullFilename);
            GRasterLayer labelLayer   = new GRasterLayer(trainFullFilename);
            //create environment for agent exploring
            IEnv env = new ImageClassifyEnv(featureLayer, labelLayer);
            //create dqn alogrithm
            DQN dqn = new DQN(env);

            //in order to do this quickly, we set training epochs equals 10.
            //please do not use so few training steps in actual use.
            dqn.SetParameters(10, 0);
            //register event to get information while training
            dqn.OnLearningLossEventHandler += (double loss, double totalReward, double accuracy, double progress, string epochesTime) => { _loss = loss; };
            //start dqn alogrithm learning
            dqn.Learn();
            //in general, loss is less than 1
            Assert.IsTrue(_loss < 1.0);
            //apply dqn to classify fetureLayer
            //pick value
            IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();

            pRasterLayerCursorTool.Visit(featureLayer);
            //
            double[] state         = pRasterLayerCursorTool.PickNormalValue(50, 50);
            double[] action        = dqn.ChooseAction(state).action;
            int      landCoverType = dqn.ActionToRawValue(NP.Argmax(action));

            //do something as you need. i.e. draw landCoverType to bitmap at position ( i , j )
            //the classification results are not stable because of the training epochs are too few.
            Assert.IsTrue(landCoverType >= 0);
        }
Example #3
0
 public Bitmap2(Bitmap bmp = null, string name = "", string dec = "", GRasterLayer gdalLayer = null, IGBand gdalBand = null)
 {
     _bitmap    = bmp;
     _name      = name;
     _dec       = dec;
     _gdalBand  = gdalBand;
     _gdalLayer = gdalLayer;
 }
Example #4
0
 public JobCNNClassify(GRasterLayer featureRasterLayer, GRasterLayer labelRasterLayer, int epochs, int model, int width, int height, int channel)
 {
     _t = new Thread(() => {
         ImageClassifyEnv env = new ImageClassifyEnv(featureRasterLayer, labelRasterLayer);
         CNN cnn = new CNN(new int[] { channel, width, height }, env.ActionNum);
         //training
         Summary = "模型训练中";
         for (int i = 0; i < epochs; i++)
         {
             int batchSize       = cnn.BatchSize;
             var(states, labels) = env.RandomEval(batchSize);
             double[][] inputX   = new double[batchSize][];
             for (int j = 0; j < batchSize; j++)
             {
                 inputX[j] = states[j];
             }
             double loss = cnn.Train(inputX, labels);
             Process     = (double)i / epochs;
         }
         //classify
         Summary = "分类应用中";
         IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();
         pRasterLayerCursorTool.Visit(featureRasterLayer);
         //GDI graph
         Bitmap classificationBitmap = new Bitmap(featureRasterLayer.XSize, featureRasterLayer.YSize);
         Graphics g = Graphics.FromImage(classificationBitmap);
         //
         int seed        = 0;
         int totalPixels = featureRasterLayer.XSize * featureRasterLayer.YSize;
         //应用dqn对图像分类
         for (int i = 0; i < featureRasterLayer.XSize; i++)
         {
             for (int j = 0; j < featureRasterLayer.YSize; j++)
             {
                 //get normalized input raw value
                 double[] normal = pRasterLayerCursorTool.PickNormalValue(i, j);
                 //}{debug
                 double[] action = cnn.Predict(normal);
                 //convert action to raw byte value
                 int gray = env.RandomSeedKeys[NP.Argmax(action)];
                 //后台绘制,报告进度
                 Color c          = Color.FromArgb(gray, gray, gray);
                 Pen p            = new Pen(c);
                 SolidBrush brush = new SolidBrush(c);
                 g.FillRectangle(brush, new Rectangle(i, j, 1, 1));
                 //report progress
                 Process = (double)(seed++) / totalPixels;
             }
         }
         //保存结果至tmp
         string fullFileName = Directory.GetCurrentDirectory() + @"\tmp\" + DateTime.Now.ToFileTimeUtc() + ".png";
         classificationBitmap.Save(fullFileName);
         //complete
         Summary  = "CNN训练分类完成";
         Complete = true;
         OnTaskComplete?.Invoke(Name, fullFileName);
     });
 }
Example #5
0
        private void button3_Click(object sender, EventArgs e)
        {
            //计算kappa,并输出矩阵
            GRasterLayer truthLayer = _rasterDic[truthKey];
            GRasterLayer predLayer  = _rasterDic[predKey];

            var(matrix, kappa, actionsNumber, oa) = KappaIndex.Calcute(truthLayer, predLayer);
            //matrix for binding and kappa for display
            kappa_label.Text = string.Format("kappa:{0:P} oa:{1:P}", kappa, oa);
            //绘表头
            webBrowser1.DocumentText = GenericTable(matrix);
        }
Example #6
0
        public void RasterBandStatisticTool()
        {
            GRasterLayer             rasterLayer            = new GRasterLayer(fullFilename);
            IRasterBandStatisticTool pRasterBandStasticTool = new GRasterBandStatisticTool();

            pRasterBandStasticTool.Visit(rasterLayer.BandCollection[0]);
            var rawGraph = pRasterBandStasticTool.StaisticalRawGraph;
            var rawTable = pRasterBandStasticTool.StatisticalRawQueryTable;

            Assert.AreEqual(rawGraph.Count, 255);
            Assert.AreEqual(rawTable.Length, 768000);
        }
Example #7
0
        public void RasterLayerPickValueTool()
        {
            GRasterLayer           rasterLayer            = new GRasterLayer(fullFilename);
            IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();

            pRasterLayerCursorTool.Visit(rasterLayer);
            //returen the nomalized values form each layer at given point (100,100)
            double[] normalValue = pRasterLayerCursorTool.PickNormalValue(100, 100);
            //the col and row should be odd number
            double[] rangeNormalValue = pRasterLayerCursorTool.PickRagneNormalValue(100, 100, 3, 3);
            Assert.AreEqual(string.Join(",", normalValue), "0.622047244094488,0.574803149606299,0.322834645669291,0.12992125984252,0.145669291338583,0.338582677165354,0.192913385826772,0.192913385826772,0.354330708661417,0.488188976377953,0.165354330708661,0.181102362204724,0.12992125984252,0.366141732283465,0.133858267716535,0.102362204724409,0.381889763779528,0.133858267716535");
            Assert.AreEqual(string.Join(",", rangeNormalValue), "0.645669291338583,0.637795275590551,0.661417322834646,0.614173228346457,0.622047244094488,0.645669291338583,0.614173228346457,0.618110236220472,0.622047244094488,0.622047244094488,0.598425196850394,0.610236220472441,0.574803149606299,0.574803149606299,0.586614173228346,0.570866141732283,0.566929133858268,0.566929133858268,0.385826771653543,0.354330708661417,0.354330708661417,0.330708661417323,0.322834645669291,0.326771653543307,0.322834645669291,0.31496062992126,0.311023622047244,0.12992125984252,0.137795275590551,0.153543307086614,0.125984251968504,0.12992125984252,0.145669291338583,0.133858267716535,0.137795275590551,0.141732283464567,0.165354330708661,0.15748031496063,0.18503937007874,0.133858267716535,0.145669291338583,0.177165354330709,0.125984251968504,0.133858267716535,0.137795275590551,0.409448818897638,0.374015748031496,0.362204724409449,0.346456692913386,0.338582677165354,0.334645669291339,0.338582677165354,0.326771653543307,0.322834645669291,0.196850393700787,0.196850393700787,0.228346456692913,0.18503937007874,0.192913385826772,0.216535433070866,0.196850393700787,0.200787401574803,0.208661417322835,0.196850393700787,0.196850393700787,0.228346456692913,0.18503937007874,0.192913385826772,0.216535433070866,0.196850393700787,0.200787401574803,0.208661417322835,0.413385826771654,0.385826771653543,0.385826771653543,0.358267716535433,0.354330708661417,0.358267716535433,0.358267716535433,0.346456692913386,0.338582677165354,0.409448818897638,0.425196850393701,0.551181102362205,0.409448818897638,0.488188976377953,0.362204724409449,0.374015748031496,0.437007874015748,0.275590551181102,0.106299212598425,0.153543307086614,0.141732283464567,0.12992125984252,0.165354330708661,0.125984251968504,0.141732283464567,0.114173228346457,0.137795275590551,0.122047244094488,0.188976377952756,0.177165354330709,0.145669291338583,0.181102362204724,0.133858267716535,0.133858267716535,0.0984251968503937,0.118110236220472,0.12992125984252,0.133858267716535,0.153543307086614,0.125984251968504,0.12992125984252,0.145669291338583,0.133858267716535,0.137795275590551,0.141732283464567,0.437007874015748,0.401574803149606,0.397637795275591,0.374015748031496,0.366141732283465,0.37007874015748,0.366141732283465,0.358267716535433,0.354330708661417,0.153543307086614,0.145669291338583,0.169291338582677,0.125984251968504,0.133858267716535,0.161417322834646,0.118110236220472,0.125984251968504,0.125984251968504,0.094488188976378,0.102362204724409,0.118110236220472,0.0984251968503937,0.102362204724409,0.110236220472441,0.118110236220472,0.118110236220472,0.122047244094488,0.452755905511811,0.417322834645669,0.405511811023622,0.389763779527559,0.381889763779528,0.374015748031496,0.389763779527559,0.374015748031496,0.366141732283465,0.153543307086614,0.145669291338583,0.169291338582677,0.125984251968504,0.133858267716535,0.161417322834646,0.118110236220472,0.125984251968504,0.125984251968504");
        }
Example #8
0
        /// <summary>
        /// Update Read Raster UI
        /// </summary>
        private void UpdateReadRasterUI(string nodeName, Dictionary <string, Bitmap2> dict, GRasterLayer rasterLayer)
        {
            TreeNode node = map_treeView.Nodes[nodeName];

            _imageDic[nodeName]  = null;
            _rasterDic[nodeName] = rasterLayer;
            foreach (var key in dict.Keys)
            {
                TreeNode childNode = new TreeNode(key);
                _imageDic[key] = dict[key];
                Invoke(new UpdateTreeNodeHandler(UpdateTreeNode), node, childNode);
            }
        }
Example #9
0
 /// <summary>
 /// 指定观察的图像,和样本所在的层位置
 /// </summary>
 /// <param name="featureRasterLayer"></param>
 /// <param name="sampleIndex"></param>
 public ImageClassifyEnv(GRasterLayer featureRasterLayer, GRasterLayer labelRasterLayer)
 {
     //input feature raster layer
     _featureRasterLayer = featureRasterLayer;
     //groundtruth raster layer
     _labelRasterLayer = labelRasterLayer;
     //num of categories
     //标注层要求:
     //1.分类按照顺序,从1开始,逐步+1
     //2.背景值设置为0
     //ActionNum = Convert.ToInt32(_labelRasterLayer.BandCollection[0].Max - _labelRasterLayer.BandCollection[0].Min);
     ActionNum = Convert.ToInt32(_labelRasterLayer.BandCollection[0].Max - 0);
     //statical graph
     Prepare();
 }
Example #10
0
        /// <summary>
        /// 波段读取
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="parentNode"></param>
        private void ReadBand(string rasterFilename, TreeNode parentNode)
        {
            string       name   = parentNode.Text;
            GRasterLayer _layer = new GRasterLayer(rasterFilename);

            for (int i = 0; i < _layer.BandCollection.Count; i++)
            {
                IGBand band = _layer.BandCollection[i];
                band.BandName = name + "_波段_" + i;
                Bitmap2 bmp2 = new Bitmap2(bmp: band.GetBitmap(), name: band.BandName, gdalBand: band, gdalLayer: _layer);
                //获取band对应的bitmap格式图像,载入treedNode中
                _imageDic.Add(band.BandName, bmp2);
                TreeNode childrenNode = new TreeNode(band.BandName);
                Invoke(new UpdateTreeNodeHandler(UpdateTreeNode), parentNode, childrenNode);
            }
        }
 /// <summary>
 /// DQN classify task
 /// </summary>
 /// <param name="featureRasterLayer"></param>
 /// <param name="labelRasterLayer"></param>
 /// <param name="epochs"></param>
 public JobDQNClassify(GRasterLayer featureRasterLayer, GRasterLayer labelRasterLayer, int epochs = 3000)
 {
     _t = new Thread(() =>
     {
         ImageClassifyEnv env = new ImageClassifyEnv(featureRasterLayer, labelRasterLayer);
         _dqn = new DQN(env);
         _dqn.SetParameters(epochs: epochs, gamma: _gamma);
         _dqn.OnLearningLossEventHandler += _dqn_OnLearningLossEventHandler;
         //training
         Summary = "模型训练中";
         _dqn.Learn();
         //classification
         Summary = "分类应用中";
         IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();
         pRasterLayerCursorTool.Visit(featureRasterLayer);
         Bitmap classificationBitmap = new Bitmap(featureRasterLayer.XSize, featureRasterLayer.YSize);
         Graphics g      = Graphics.FromImage(classificationBitmap);
         int seed        = 0;
         int totalPixels = featureRasterLayer.XSize * featureRasterLayer.YSize;
         for (int i = 0; i < featureRasterLayer.XSize; i++)
         {
             for (int j = 0; j < featureRasterLayer.YSize; j++)
             {
                 //get normalized input raw value
                 double[] normal = pRasterLayerCursorTool.PickNormalValue(i, j);
                 var(action, q)  = _dqn.ChooseAction(normal);
                 //convert action to raw byte value
                 int gray         = _dqn.ActionToRawValue(NP.Argmax(action));
                 Color c          = Color.FromArgb(gray, gray, gray);
                 Pen p            = new Pen(c);
                 SolidBrush brush = new SolidBrush(c);
                 g.FillRectangle(brush, new Rectangle(i, j, 1, 1));
                 //report progress
                 Process = (double)(seed++) / totalPixels;
             }
         }
         //save result
         string fullFileName = Directory.GetCurrentDirectory() + @"\tmp\" + DateTime.Now.ToFileTimeUtc() + ".png";
         classificationBitmap.Save(fullFileName);
         //complete
         Summary  = "DQN训练分类完成";
         Complete = true;
         OnTaskComplete?.Invoke(Name, fullFileName);
     });
 }
 public IJobRPCRectify(double[] a, double[] b, double[] c, double[] d, Dictionary <string, double> paramaters, List <string> rawBinRasterFullFilenames)
 {
     _t = new Thread(() =>
     {
         using (IRasterRPCTool pRasterRPCTool = new GRasterRPCTool(a, b, c, d, paramaters))
         {
             for (int i = 0; i < rawBinRasterFullFilenames.Count; i++)
             {
                 string rasterFilename    = rawBinRasterFullFilenames[i];
                 GRasterLayer rasterLayer = new GRasterLayer(rasterFilename);
                 Summary = string.Format("total:{1}/{2}, RPC rectify for {0} is in progress.... ", rasterLayer.Name, i + 1, rawBinRasterFullFilenames.Count);
                 pRasterRPCTool.Visit(rasterLayer);
                 pRasterRPCTool.DoRPCRectify();
                 Process = i / (double)rawBinRasterFullFilenames.Count;
             }
             OnTaskComplete?.Invoke(Name);
         }
     });
 }
Example #13
0
        public void RasterBandPickValueTool()
        {
            GRasterLayer          rasterLayer           = new GRasterLayer(fullFilename);
            IRasterBandCursorTool pRasterBandCursorTool = new GRasterBandCursorTool();

            pRasterBandCursorTool.Visit(rasterLayer.BandCollection[0]);
            double normalValue = pRasterBandCursorTool.PickNormalValue(100, 100);

            //the col and row should be odd number
            double[] rangeNormalValue = pRasterBandCursorTool.PickRangeNormalValue(100, 100, 3, 3);
            double   rawValue         = pRasterBandCursorTool.PickRawValue(100, 100);

            //the col and row should be odd number
            double[] rangeRawValue = pRasterBandCursorTool.PickRangeRawValue(100, 100, 3, 3);
            //
            Assert.AreEqual(normalValue, 0.62204724409448819);
            Assert.AreEqual(string.Join(",", rangeNormalValue), "0.645669291338583,0.637795275590551,0.661417322834646,0.614173228346457,0.622047244094488,0.645669291338583,0.614173228346457,0.618110236220472,0.622047244094488");
            Assert.AreEqual(rawValue, 159);
            Assert.AreEqual(string.Join(",", rangeRawValue), "165,163,169,157,159,165,157,158,159");
        }
        public void ClassificationByCNN()
        {
            //loss
            double _loss = 1.0;
            //training epochs
            int epochs = 100;
            //
            GRasterLayer featureLayer = new GRasterLayer(featureFullFilename);
            GRasterLayer labelLayer   = new GRasterLayer(trainFullFilename);
            //create environment for agent exploring
            IEnv env = new ImageClassifyEnv(featureLayer, labelLayer);
            //assume 18dim equals 3x6 (image)
            CNN cnn = new CNN(new int[] { 1, 3, 6 }, env.ActionNum);

            //training
            for (int i = 0; i < epochs; i++)
            {
                int batchSize = cnn.BatchSize;
                var(states, labels) = env.RandomEval(batchSize);
                double[][] inputX = new double[batchSize][];
                for (int j = 0; j < batchSize; j++)
                {
                    inputX[j] = states[j];
                }
                _loss = cnn.Train(inputX, labels);
            }
            //in general, loss is less than 5
            Assert.IsTrue(_loss < 5.0);
            //apply cnn to classify featureLayer
            IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();

            pRasterLayerCursorTool.Visit(featureLayer);
            //get normalized input raw value
            double[] normal        = pRasterLayerCursorTool.PickNormalValue(50, 50);
            double[] action        = cnn.Predict(normal);
            int      landCoverType = env.RandomSeedKeys[NP.Argmax(action)];

            //do something as you need. i.e. draw landCoverType to bitmap at position ( i , j )
            //the classification results are not stable because of the training epochs are too few.
            Assert.IsTrue(landCoverType >= 0);
        }
Example #15
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="fullFilename"></param>
 public JobReadRaster(string fullFilename)
 {
     _t = new Thread(() =>
     {
         Dictionary <string, Bitmap2> dict = new Dictionary <string, Bitmap2>();
         string name = Path.GetFileNameWithoutExtension(fullFilename);
         GRasterLayer rasterLayer = new GRasterLayer(fullFilename);
         //reading
         Summary = "数据读取中";
         for (int i = 0; i < rasterLayer.BandCount; i++)
         {
             GRasterBand band    = rasterLayer.BandCollection[i];
             band.BandName       = name + "_band_" + i;
             Bitmap2 bmp2        = new Bitmap2(bmp: band.GrayscaleImage, name: band.BandName, gdalBand: band, gdalLayer: rasterLayer);
             dict[band.BandName] = bmp2;
             Process             = (double)(i + 1) / rasterLayer.BandCount;
         }
         //read complete
         Summary  = "读取完毕";
         Complete = true;
         OnTaskComplete?.Invoke(Name, name, dict, rasterLayer);
     });
 }
 /// <summary>
 /// 指定观察的图像,和样本所在的层位置
 /// </summary>
 /// <param name="featureRasterLayer"></param>
 /// <param name="sampleIndex"></param>
 public ExtractRoadEnv(GRasterLayer featureRasterLayer, GRasterLayer labelRasterLayer)
 {
     //input
     _featureRasterLayer = featureRasterLayer;
     //output
     _labelRasterLayer = labelRasterLayer;
     // 探索方式,沿顺时针
     // -----------------------------------------------------
     // *    0  |  1  |  2
     // * -----------------------
     // *    7  |  p  |  3
     // * -----------------------
     // *    6  |  5  |  4
     //represent eight direction actions
     ActionNum = 8;
     //
     _channel = _featureRasterLayer.BandCount;
     //limit of x
     _limit_x = _labelRasterLayer.XSize;
     //limit of y
     _limit_y = _labelRasterLayer.YSize;
     //read labellayer
     Prepare();
 }
Example #17
0
 public void Visit(GRasterLayer pLayer)
 {
     _pLayer = pLayer;
 }
Example #18
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="treeCount"></param>
 /// <param name="fullFilename"></param>
 /// <param name="rasterLayer"></param>
 public JobRFClassify(int treeCount, string fullFilename, GRasterLayer rasterLayer)
 {
     _t = new Thread(() =>
     {
         RF rf = new RF(treeCount);
         //training
         Summary = "随机森林训练中";
         using (StreamReader sr = new StreamReader(fullFilename))
         {
             List <List <double> > inputList = new List <List <double> >();
             List <int> outputList           = new List <int>();
             string text = sr.ReadLine().Replace("\t", ",");
             do
             {
                 string[] rawdatas = text.Split(',');
                 outputList.Add(Convert.ToInt32(rawdatas.Last()));
                 List <double> inputItem = new List <double>();
                 for (int i = 0; i < rawdatas.Length - 1; i++)
                 {
                     inputItem.Add(Convert.ToDouble(rawdatas[i]));
                 }
                 inputList.Add(inputItem);
                 text = sr.ReadLine();
             } while (text != null);
             double[][] inputs = new double[inputList.Count][];
             int[] outputs     = outputList.ToArray();
             for (int i = 0; i < inputList.Count; i++)
             {
                 inputs[i] = inputList[i].ToArray();
             }
             rf.Train(inputs, outputs);
         }
         //image classify
         Summary = "分类应用中";
         IRasterLayerCursorTool pRasterLayerCursorTool = new GRasterLayerCursorTool();
         pRasterLayerCursorTool.Visit(rasterLayer);
         //GDI graph
         Bitmap classificationBitmap = new Bitmap(rasterLayer.XSize, rasterLayer.YSize);
         Graphics g = Graphics.FromImage(classificationBitmap);
         //
         int seed        = 0;
         int totalPixels = rasterLayer.XSize * rasterLayer.YSize;
         Process         = 0.0;
         //应用dqn对图像分类
         for (int i = 0; i < rasterLayer.XSize; i++)
         {
             for (int j = 0; j < rasterLayer.YSize; j++)
             {
                 //get normalized input raw value
                 double[] raw      = pRasterLayerCursorTool.PickRawValue(i, j);
                 double[][] inputs = new double[1][];
                 inputs[0]         = raw;
                 //}{debug
                 int[] ouputs = rf.Predict(inputs);
                 int gray     = ouputs[0];
                 //convert action to raw byte value
                 Color c          = Color.FromArgb(gray, gray, gray);
                 Pen p            = new Pen(c);
                 SolidBrush brush = new SolidBrush(c);
                 g.FillRectangle(brush, new Rectangle(i, j, 1, 1));
                 //report progress
                 Process = (double)seed++ / totalPixels;
             }
         }
         //保存结果至tmp
         string fullFileName = Directory.GetCurrentDirectory() + @"\tmp\" + DateTime.Now.ToFileTimeUtc() + ".png";
         classificationBitmap.Save(fullFileName);
         //rf complete
         Summary  = "RF训练分类完成";
         Complete = true;
         OnTaskComplete?.Invoke(Name, fullFileName);
     });
 }
Example #19
0
        /// <summary>
        /// 底图区域功能按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Map_function_Click(object sender, EventArgs e)
        {
            ToolStripItem item = sender as ToolStripItem;

            switch (item.Name)
            {
            case "Export_Bitmap_ToolStripMenuItem":
                Bitmap saveBmp = map_pictureBox.Image as Bitmap;
                SaveBitmap(saveBmp);
                //导出图片
                break;

            case "DL_CLASS_toolStripButton":
                if (map_treeView.SelectedNode == null)
                {
                    UpdateStatusLabel("请选择一副图像或者一个图层后,进行分类操作", STATUE_ENUM.ERROR);
                    return;
                }
                else
                {
                    DLClassifyForm dlclassify = new DLClassifyForm();
                    if (dlclassify.ShowDialog() == DialogResult.OK)
                    {
                        //1.选择处理那副图像
                        string       imageName    = map_treeView.SelectedNode.Text;
                        Bitmap2      imageBitmap2 = _imageDic[imageName];
                        GRasterLayer rasterLayer  = imageBitmap2.GdalLayer;
                        ThreadStart  clsfy_ts     = delegate { RunClassify(rasterLayer, dlclassify.UseSLIC, dlclassify.PBName, dlclassify.CenterName, dlclassify.LabelName); };
                        Thread       clsfy_t      = new Thread(clsfy_ts);
                        clsfy_t.IsBackground = true;
                        clsfy_t.Start();
                    }
                }
                break;

            case "open_toolstripmenuitem":    //添加图像
                ReadImage();
                break;

            case "open_contextMenuStrip":
                ReadImage();
                break;

            //超像素分割
            case "SLIC_toolStripButton":
            case "SLIC_toolStripMenu":
                Bitmap bmp = map_pictureBox.Image as Bitmap;
                if (bmp != null)
                {
                    ThreadStart slic_ts = delegate { RunSLIC(bmp); };
                    Thread      slic_t  = new Thread(slic_ts);
                    slic_t.IsBackground = true;
                    slic_t.Start();
                }
                else
                {
                    UpdateStatusLabel("未选中待计算图像,地图区域无图片", STATUE_ENUM.ERROR);
                }
                break;

            //超像素中心应用
            case "SLIC_Center_toolStripButton":
            case "SLIC_Center_toolStripMenu":
                OpenFileDialog opg = new OpenFileDialog
                {
                    Filter = "JSON文件|*.json"
                };
                if (opg.ShowDialog() == DialogResult.OK)
                {
                    //1.读取center中心
                    using (StreamReader sr = new StreamReader(opg.FileName))
                    {
                        List <byte> colors  = new List <byte>();
                        Center[]    centers = SuperPixelSegment.ReadCenter(sr.ReadToEnd());
                        //2.设置使用图层
                        CenterApplyForm centerApplyForm = new CenterApplyForm();
                        if (centerApplyForm.ShowDialog() == DialogResult.OK)
                        {
                            ThreadStart s = delegate { RunCenter(centerApplyForm.FileNameCollection, centers); };
                            Thread      t = new Thread(s)
                            {
                                IsBackground = true
                            };
                            t.Start();
                        }
                    }
                }
                break;

            default:
                break;
            }
        }
Example #20
0
        public static (int[, ] matrix, double kappa, int actionsNumber, double oa) Calcute(GRasterLayer truthLayer, GRasterLayer predLayer)
        {
            //statical label band graph
            IRasterBandStatisticTool pBandStaticTool = new GRasterBandStatisticTool();

            pBandStaticTool.Visit(truthLayer.BandCollection[0]);
            Dictionary <int, List <Point> > memory = pBandStaticTool.StaisticalRawGraph;
            //key index
            List <int> Keys          = memory.Keys.ToList();
            int        actionsNumber = Keys.Count;

            int[,] matrix = new int[actionsNumber, actionsNumber];
            IRasterBandCursorTool pBandCursorTool = new GRasterBandCursorTool();

            pBandCursorTool.Visit(predLayer.BandCollection[0]);
            //
            pBandStaticTool.Visit(predLayer.BandCollection[0]);
            var m = pBandStaticTool.StaisticalRawGraph;

            //
            for (int i = 0; i < actionsNumber; i++)
            {
                int          key    = Keys[i];
                List <Point> points = memory[key];
                //计算realKey类分类结果,存入混淆矩阵
                points.ForEach(p =>
                {
                    int rawType   = (int)pBandCursorTool.PickRawValue(p.X, p.Y);
                    int indexType = Keys.IndexOf(rawType);
                    if (indexType != -1)
                    {
                        matrix[i, indexType]++;
                    }
                });
            }
            // Create a new multi-class Confusion Matrix
            var cm = new GeneralConfusionMatrix(matrix);
            //
            int totalNum = cm.NumberOfSamples;
            //p0
            double p0 = 0;

            for (int i = 0; i < actionsNumber; i++)
            {
                p0 += Convert.ToDouble(matrix[i, i]);
            }
            //pc
            double pc = 0;

            for (int i = 0; i < actionsNumber; i++)
            {
                pc += Convert.ToDouble(cm.ColumnTotals[i]) * Convert.ToDouble(cm.RowTotals[i]);
            }
            pc = pc / totalNum;
            //
            double kappa = (p0 - pc) / (totalNum - pc);
            double oa    = p0 / totalNum;

            //
            return(matrix, kappa, actionsNumber, oa);
        }
Example #21
0
 public GoutputRaster(GRasterLayer rasterLayer)
 {
     _rasterLayer = rasterLayer;
 }
Example #22
0
        public void ReadRasterLayer()
        {
            GRasterLayer rasterLayer = new GRasterLayer(fullFilename);

            Assert.AreEqual(rasterLayer.BandCollection.Count, 18);
        }
Example #23
0
        /// <summary>
        /// 应用深度学习模型进行分类
        /// </summary>
        /// <param name="rasterLayer"></param>
        private void RunClassify(GRasterLayer rasterLayer, bool useSLIC, string pbName, string centerName, string labelName)
        {
            //判断图层结构,选用不同的tensor输入
            ShapeEnum shapeEuum;

            if (rasterLayer.BandCount == 130)
            {
                shapeEuum = ShapeEnum.THIRTEEN_TEN;
            }
            else if (rasterLayer.BandCount == 100)
            {
                shapeEuum = ShapeEnum.TEN_TEN;
            }
            else if (rasterLayer.BandCount == 64)
            {
                shapeEuum = ShapeEnum.EIGHT_EIGHT;
            }
            else
            {
                shapeEuum = ShapeEnum.TEN_TEN;
            }
            //构建结果图层,用于动态绘制
            Bitmap   bmp          = new Bitmap(rasterLayer.XSize, rasterLayer.YSize);
            string   nodeName     = rasterLayer.Name + "结果图层";
            TreeNode childrenNode = new TreeNode(nodeName);

            _imageDic.Add(nodeName, new Bitmap2(name: nodeName, bmp: bmp));
            Invoke(new UpdateTreeNodeHandler(UpdateTreeNode), null, childrenNode);
            //获取波段
            TensorflowBootstrap model = new TensorflowBootstrap(pbName);

            //判断是否基于超像素
            if (!useSLIC)
            {
                for (int i = 0; i < rasterLayer.XSize; i++)
                {
                    for (int j = 0; j < rasterLayer.YSize; j++)
                    {
                        float[] input      = rasterLayer.GetPixelFloat(i, j).ToArray();
                        long    classified = model.Classify(input, shapeEuum);
                        Invoke(new PaintPointHandler(PaintPoint), bmp, i, j, Convert.ToByte(classified * 15));
                        Invoke(new UpdateStatusLabelHandler(UpdateStatusLabel), "应用分类中,总进度:" + i + "列" + j + "行", STATUE_ENUM.WARNING);
                    }
                }
            }
            else
            {
                //基于slic的超像素绘制方法
                using (StreamReader sr_center = new StreamReader(centerName))
                    using (StreamReader sr_label = new StreamReader(labelName))
                    {
                        Center[] centers = SuperPixelSegment.ReadCenter(sr_center.ReadToEnd());
                        Bitplane labels  = SuperPixelSegment.ReadLabel(sr_label.ReadToEnd());
                        int[]    mask    = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
                        for (int i = 0; i < centers.Length; i++)
                        {
                            Center  center     = centers[i];
                            float[] input      = rasterLayer.GetPixelFloatWidthConv((int)center.X, (int)center.Y, mask).ToArray();
                            long    classified = model.Classify(input, shapeEuum);
                            center.L = classified * 15;
                            center.A = classified * 15;
                            center.B = classified * 15;
                            Invoke(new UpdateStatusLabelHandler(UpdateStatusLabel), "已处理第" + i + "/" + centers.Length + "个中心", STATUE_ENUM.WARNING);
                        }
                        //遍历图片进行绘制
                        for (int i = 0; i < rasterLayer.XSize; i++)
                        {
                            for (int j = 0; j < rasterLayer.YSize; j++)
                            {
                                Invoke(new PaintPointHandler(PaintPoint), bmp, i, j, Convert.ToByte(centers[(int)Math.Floor(labels.GetPixel(i, j))].L));
                            }
                        }
                    }
            }
        }
Example #24
0
 public void Dispose()
 {
     _pLayer = null;
 }