如何计算具有多个Buildings.And的全Tile的IOU分数,如何计算测试数据中所有图像的IOU分数。预测文件 根据地档案有没有办法从这些files.Please的帮助中计算IOU的分数,我试着在所附的QGIS照片中对两者(地面真相和预测)进行重新排序。我已经用代码计算了IOU的分数。现在我想确认一下,我的方法是否可靠?代码如下所示
import pandas as pd
import csv
import shapely
import shapely.wkt as wkt
from shapely.geometry import MultiPolygon
import shapely.ops as so
import shapely.geometry as sg
import shapely.ops as so
import matplotlib.pyplot as plt
def polt_image(mul_poly_shape):
if isinstance(mul_poly_shape, list):
image_plot = MultiPolygon(map(wkt.loads, mul_poly_shape))
else:
image_plot = mul_poly_shape
fig, axs = plt.subplots()
axs.set_aspect('equal', 'datalim')
for geom in image_plot.geoms:
xs, ys = geom.exterior.xy
axs.fill(xs, ys, alpha=0.5, fc='r', ec='none')
#plt.show()
csv_file_experiment = '/home/salman/Downloads/data/spacenet6/LGBM_CSVs/exp_0009_0_2.csv'
csv_file_gts = '/home/salman/Downloads/data/spacenet6/val_polygons/ground_truths.csv'
col1 = ["ImageId", "PolygonWKT_Pix","BuildingId"]
exp_data = pd.read_csv(csv_file_experiment, usecols=col1)
col2 = ["ImageId","PolygonWKT_Pix","TileBuildingId"]
gts_data = pd.read_csv(csv_file_gts, usecols=col2)
unique_gts_imageIDs = pd.unique(gts_data[['ImageId']].values.ravel())
#print("unique_gts_imageIDs: ",unique_gts_imageIDs)
count = 0
for i in unique_gts_imageIDs:
count = count + 1
print("count", count)
gts_inner_loop_count = 0
results1 = pd.read_csv(csv_file_gts)
gts_inner_loop_count = len(results1)
gts_inner_loop_count = gts_inner_loop_count + 1
inner_loop_count = 0
results = pd.read_csv(csv_file_experiment)
inner_loop_count = len(results)
inner_loop_count = inner_loop_count + 1
average_accuracy = 0.0
average_accuracy_sum = 0.0
wl = 0
match_count = 0
while wl < count:
print("Unique Image ID: ",unique_gts_imageIDs[wl])
print("outer loop: ",wl)
gts_tile = []
exp_tile = []
k = 0
while k <= gts_inner_loop_count:
#print("unique_gts_imageIDs['ImageId'].get(wl) : ", unique_gts_imageIDs[wl])
unique_Image_ID = unique_gts_imageIDs[wl]
gts_data_Image_ID = gts_data['ImageId'].get(k)
#print("gts_data['ImageId'].get(wl) : ", gts_data['ImageId'].get(wl))
if unique_Image_ID == gts_data_Image_ID:
#print("Matched")
print("gts_data_Image_ID: ", gts_data_Image_ID)
print("gts_data_Building_ID: ", gts_data['TileBuildingId'].get(k))
match_count = match_count + 1
#print("Match Count: ", match_count)
PolygonWKT_Pix = str(gts_data['PolygonWKT_Pix'].get(k))
#print("gts_PolygonWKT_Pix: ",PolygonWKT_Pix)
if PolygonWKT_Pix != None and PolygonWKT_Pix != "":
gts_tile.append(PolygonWKT_Pix)
#gts_tile = gts_tile.append(f"{PolygonWKT_Pix}")
k = k + 1
gts_img = MultiPolygon(map(wkt.loads, gts_tile))
print ("gts_img: ",gts_img)
t = 0
while t <= inner_loop_count:
#print("unique_gts_imageIDs['ImageId'].get(wl) : ", unique_gts_imageIDs[wl])
unique_Image_ID = unique_gts_imageIDs[wl]
exp_data_Image_ID = exp_data['ImageId'].get(t)
#print("gts_data['ImageId'].get(wl) : ", gts_data['ImageId'].get(wl))
if unique_Image_ID == exp_data_Image_ID:
#print("unique_Image_ID: ", unique_Image_ID)
print("exp_data_Image_ID: ", exp_data_Image_ID)
print("exp_data_Building_ID: ",exp_data['BuildingId'].get(t))
#print("Matched")
match_count = match_count + 1
#print("Match Count: ", match_count)
exp_PolygonWKT_Pix = str(exp_data['PolygonWKT_Pix'].get(t))
#print("\nexp_PolygonWKT_Pix: ",exp_PolygonWKT_Pix)
#if exp_PolygonWKT_Pix == 'POLYGON EMPTY':
# exp_PolygonWKT_Pix = 0
# exp_PolygonWKT_Pix = str(exp_PolygonWKT_Pix)
if exp_PolygonWKT_Pix != None and exp_PolygonWKT_Pix != "":
exp_tile.append(exp_PolygonWKT_Pix)
#gts_tile = gts_tile.append(f"{PolygonWKT_Pix}")
t = t + 1
#print("gts_tile: ",gts_tile)
#print("exp_tile: ",exp_tile)
exp_img = MultiPolygon(map(wkt.loads, exp_tile))
print("exp_img: ",exp_img)
intersection = gts_img.intersection(exp_img)
union = gts_img.union(exp_img)
#print("intersection: ", intersection)
#print("union: ", union)
#polt_image(gts_tile)
#polt_image(exp_tile)
#polt_image(intersection)
#polt_image(union)
print(intersection.area)
if intersection.area == 0.0 and union.area == 0.0:
image_accuracy = 0.0
else:
image_accuracy = intersection.area / union.area
print("\nimage_accuracy: " , image_accuracy)
average_accuracy_sum = average_accuracy_sum + image_accuracy
print("average_accuracy_sum", average_accuracy_sum)
wl = wl + 1
average_accuracy = average_accuracy_sum / count
print("average_accuracy: ", average_accuracy)

发布于 2022-03-30 13:23:30
如果您不使用IOU分数作为损失函数,我建议将每个地图进行栅格化。创建一个2D像素地图(图像),其值为1,在任何地方--一个建筑物是预测的,而其他任何地方都是0。重复地面真相。通过对这些映射进行求和,或者首先按位和操作,然后对像素映射进行求和,您可以轻松地获得相交区域和单个区域。
请注意,这种IOU计算方法的精度取决于光栅映射的粒度。
https://stackoverflow.com/questions/71675720
复制相似问题