fix project bug

result path
This commit is contained in:
copper 2022-11-07 20:52:36 +08:00
parent bbf60e76ae
commit 848c720435
3 changed files with 19 additions and 12 deletions

View File

@ -12,7 +12,7 @@ from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from osgeo import gdal from osgeo import gdal
from rscder.utils.icons import IconInstance from rscder.utils.icons import IconInstance
from rscder.utils.project import Project, SingleBandRasterLayer from rscder.utils.project import Project, ResultPointLayer
def kappa(confusion_matrix): def kappa(confusion_matrix):
pe_rows = np.sum(confusion_matrix, axis=0) pe_rows = np.sum(confusion_matrix, axis=0)
@ -99,12 +99,12 @@ class EvaluationPlugin(BasicPlugin):
self.action.triggered.connect(self.show_dialog) self.action.triggered.connect(self.show_dialog)
ActionManager().postop_menu.addAction(self.action) 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: if layer is None or gt is None:
return return
self.send_message.emit('正在进行精度评估...') self.send_message.emit('正在进行精度评估...')
pred_ds = gdal.Open(layer.path) pred_ds = gdal.Open(layer.result_path['path'])
pred_band = pred_ds.GetRasterBand(1) pred_band = pred_ds.GetRasterBand(1)
gt_ds = gdal.Open(gt) gt_ds = gdal.Open(gt)
gt_band = gt_ds.GetRasterBand(1) gt_band = gt_ds.GetRasterBand(1)
@ -137,13 +137,13 @@ class EvaluationPlugin(BasicPlugin):
gt_block = gt_band.ReadAsArray(*block_offset, *block_size) gt_block = gt_band.ReadAsArray(*block_offset, *block_size)
pred_block = pred_block.astype(np.uint8) pred_block = pred_block.astype(np.uint8)
gt_block = gt_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] pred_block = pred_block[valid_mask]
gt_block = gt_block[valid_mask] gt_block = gt_block[valid_mask]
for k in range(2): for k in range(2):
for l 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') 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: with open(result_path, 'w', encoding='utf-8') as f:
@ -178,9 +178,9 @@ class EvaluationPlugin(BasicPlugin):
dialog.exec_() dialog.exec_()
if dialog.result() == QDialog.Accepted: if dialog.result() == QDialog.Accepted:
layer = dialog.layer_select.current_layer layer = dialog.layer_select.current_layer
if not isinstance(layer, SingleBandRasterLayer): # if not isinstance(layer, SingleBandRasterLayer):
self.send_message.emit('请选择一个单波段栅格图层') # self.send_message.emit('请选择一个单波段栅格图层')
return # return
t = Thread(target=self.run_alg, args=(layer, dialog.gt_file)) t = Thread(target=self.run_alg, args=(layer, dialog.gt_file))
t.start() t.start()

View File

@ -39,7 +39,7 @@ def table_layer(pth:str,layer:BasicLayer, name, send_message = None):
center_y = center_y * geo[5] + geo [3] 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') 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) # print(result_layer.result_path)
layer.layer_parent.add_result_layer(result_layer) layer.layer_parent.add_result_layer(result_layer)
if send_message is not None: if send_message is not None:

View File

@ -89,6 +89,7 @@ class BasicCD(AlgFrontend):
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x, start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy = (0, j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size = (xsize, cell_size[1]) block_size = (xsize, cell_size[1])
@ -100,18 +101,24 @@ class BasicCD(AlgFrontend):
block_size1 = (xsize, end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) 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_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2) block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
# if block_data1.shape[0] == 0:
# continue
if band == 1: if band == 1:
block_data1 = block_data1[None, ...] block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # pdb.set_trace()
block_diff = block_data1.sum(0) - block_data2.sum(0) block_diff = block_data1.sum(0) - block_data2.sum(0)
block_diff = block_diff.astype(np.float32) block_diff = block_diff.astype(np.float32)
block_diff = np.abs(block_diff) 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()) max_diff = max(max_diff, block_diff.max())
out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy) out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
if send_message is not None: if send_message is not None: