/// <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); }
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; }
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); }); }
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); }
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); }
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"); }
/// <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); } }
/// <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(); }
/// <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); } }); }
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); }
/// <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(); }
public void Visit(GRasterLayer pLayer) { _pLayer = pLayer; }
/// <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); }); }
/// <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; } }
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); }
public GoutputRaster(GRasterLayer rasterLayer) { _rasterLayer = rasterLayer; }
public void ReadRasterLayer() { GRasterLayer rasterLayer = new GRasterLayer(fullFilename); Assert.AreEqual(rasterLayer.BandCollection.Count, 18); }
/// <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)); } } } } }
public void Dispose() { _pLayer = null; }