首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从WKT多边形计算IOU分数?

如何从WKT多边形计算IOU分数?
EN

Stack Overflow用户
提问于 2022-03-30 10:40:48
回答 1查看 147关注 0票数 0

如何计算具有多个Buildings.And的全Tile的IOU分数,如何计算测试数据中所有图像的IOU分数。预测文件 根据地档案有没有办法从这些files.Please的帮助中计算IOU的分数,我试着在所附的QGIS照片中对两者(地面真相和预测)进行重新排序。我已经用代码计算了IOU的分数。现在我想确认一下,我的方法是否可靠?代码如下所示

代码语言:javascript
运行
复制
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)

EN

回答 1

Stack Overflow用户

发布于 2022-03-30 13:23:30

如果您不使用IOU分数作为损失函数,我建议将每个地图进行栅格化。创建一个2D像素地图(图像),其值为1,在任何地方--一个建筑物是预测的,而其他任何地方都是0。重复地面真相。通过对这些映射进行求和,或者首先按位和操作,然后对像素映射进行求和,您可以轻松地获得相交区域和单个区域。

请注意,这种IOU计算方法的精度取决于光栅映射的粒度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71675720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档