diff --git a/plugins/evaluation/main.py b/plugins/evaluation/main.py index 62689b7..28acb23 100644 --- a/plugins/evaluation/main.py +++ b/plugins/evaluation/main.py @@ -12,7 +12,7 @@ from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt from osgeo import gdal from rscder.utils.icons import IconInstance -from rscder.utils.project import Project, SingleBandRasterLayer +from rscder.utils.project import Project, ResultPointLayer def kappa(confusion_matrix): pe_rows = np.sum(confusion_matrix, axis=0) @@ -99,12 +99,12 @@ class EvaluationPlugin(BasicPlugin): self.action.triggered.connect(self.show_dialog) ActionManager().postop_menu.addAction(self.action) - def run_alg(self, layer:SingleBandRasterLayer, gt): + def run_alg(self, layer:ResultPointLayer, gt): if layer is None or gt is None: return self.send_message.emit('正在进行精度评估...') - pred_ds = gdal.Open(layer.path) + pred_ds = gdal.Open(layer.result_path['path']) pred_band = pred_ds.GetRasterBand(1) gt_ds = gdal.Open(gt) gt_band = gt_ds.GetRasterBand(1) @@ -137,13 +137,13 @@ class EvaluationPlugin(BasicPlugin): gt_block = gt_band.ReadAsArray(*block_offset, *block_size) pred_block = pred_block.astype(np.uint8) gt_block = gt_block.astype(np.uint8) - valid_mask = ((pred_block == 1) | (pred_block == 0)) & ((gt_block == 1) | (gt_block == 0)) + valid_mask = ((pred_block == 1) | (pred_block == 0)) & ((gt_block >= 1) | (gt_block == 0)) pred_block = pred_block[valid_mask] gt_block = gt_block[valid_mask] for k in range(2): for l in range(2): - cfm[k,l] += np.sum((pred_block == k) & (gt_block == l)) + cfm[k,l] += np.sum((pred_block == k) & (gt_block >= l)) result_path = os.path.join(Project().other_path, f'{layer.name}_{os.path.basename(gt)}_evaluation.txt') with open(result_path, 'w', encoding='utf-8') as f: @@ -178,9 +178,9 @@ class EvaluationPlugin(BasicPlugin): dialog.exec_() if dialog.result() == QDialog.Accepted: layer = dialog.layer_select.current_layer - if not isinstance(layer, SingleBandRasterLayer): - self.send_message.emit('请选择一个单波段栅格图层') - return + # if not isinstance(layer, SingleBandRasterLayer): + # self.send_message.emit('请选择一个单波段栅格图层') + # return t = Thread(target=self.run_alg, args=(layer, dialog.gt_file)) t.start() \ No newline at end of file diff --git a/plugins/misc/table_layer.py b/plugins/misc/table_layer.py index f3d0f70..0365432 100644 --- a/plugins/misc/table_layer.py +++ b/plugins/misc/table_layer.py @@ -39,7 +39,7 @@ def table_layer(pth:str,layer:BasicLayer, name, send_message = None): center_y = center_y * geo[5] + geo [3] f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},{int(block_data_xy.mean() > 0.5)}\n') - result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo,result_path={}) + result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo,result_path=dict(path=pth)) # print(result_layer.result_path) layer.layer_parent.add_result_layer(result_layer) if send_message is not None: diff --git a/plugins/unsupervised_method/scripts/__init__.py b/plugins/unsupervised_method/scripts/__init__.py index c432083..0854b37 100644 --- a/plugins/unsupervised_method/scripts/__init__.py +++ b/plugins/unsupervised_method/scripts/__init__.py @@ -89,6 +89,7 @@ class BasicCD(AlgFrontend): block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1]) block_xy = (0, j * cell_size[1]) + if block_xy1[1] > end1y or block_xy2[1] > end2y: break block_size = (xsize, cell_size[1]) @@ -100,18 +101,24 @@ class BasicCD(AlgFrontend): block_size1 = (xsize, end1y - block_xy1[1]) if block_xy2[1] + block_size2[1] > end2y: block_size2 = (xsize, end2y - block_xy2[1]) + + if block_size1[0] * block_size1[1] == 0 or block_size2[0] * block_size2[1] == 0: + continue + block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2) - + # if block_data1.shape[0] == 0: + # continue if band == 1: block_data1 = block_data1[None, ...] block_data2 = block_data2[None, ...] # pdb.set_trace() + block_diff = block_data1.sum(0) - block_data2.sum(0) block_diff = block_diff.astype(np.float32) block_diff = np.abs(block_diff) - - min_diff = min(min_diff, block_diff[block_diff > 0].min()) + + min_diff = min(min_diff, block_diff[block_diff >= 0].min()) max_diff = max(max_diff, block_diff.max()) out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy) if send_message is not None: