我如何匹配ground-truth和预测部分的边界框坐标?

问题描述 投票:0回答:1

我研究了一个模型,我有 100 个用于 gt 和预测部分的边界框。我想计算每个人的iou分数。但由于命令的原因,我不能直接这样做。边界框的坐标顺序不同。例如,gt 的第一个边界框与预测的第 43 个边界框重叠。我试图找到匹配的订单并使用以下代码计算每个订单的借条:

for i in range (0,100):
    for j in range(0,100):
        
        pxmin, pymin, pxmax, pymax = pred['boxes'][i]
        gtxmin, gtymin, gtxmax, gtymax = gt[j]
       

        ixmin = max(pxmin, gtxmin)
        ixmax = min(pxmax, gtxmax)
        iymin = max(pymin, gtymin)
        iymax = min(pymax, gtymax)
    
        parea = (pxmax - pxmin) * (pymax - pymin)
        gtarea = (gtxmax - gtxmin) * (gtymax - gtymin)
        iarea = (ixmax - ixmin) * (iymax - iymin)
        IOU = iarea / (parea + gtarea - iarea)
        
        if 1 > IOU > 0.7:
            print(i, j, np.array(IOU))

但是这一次,每个订单都会多次与不同的订单匹配,即使它们不重叠。例如:

0 43 0.9042958
0 44 0.9875165
0 58 0.9222096
1 16 0.7543962
1 41 0.9221437
2 26 0.90981704
....

我不能取最高的iou分数,因为有些即使他们有最高的iou分数,但彼此并不重叠。我该如何解决这个问题?

新版本:

ious = np.zeros((100, 100))
for i in range (0,100):
    for j in range(0,100):
        pxmin, pymin, pxmax, pymax = pred['boxes'][i]
        gtxmin, gtymin, gtxmax, gtymax = gt[j]
        ixmin = max(pxmin, gtxmin)
        ixmax = min(pxmax, gtxmax)
        iymin = max(pymin, gtymin)
        iymax = min(pymax, gtymax)
        parea = (pxmax - pxmin) * (pymax - pymin)
        gtarea = (gtxmax - gtxmin) * (gtymax - gtymin)
        if (ixmax - ixmin) < 0 and (iymax - iymin) < 0:
            iarea = 0
        else:
            iarea = (ixmax - ixmin) * (iymax - iymin)
        IOU = iarea / (parea + gtarea - iarea)
        ious[i, j] = IOU
        if 1 > IOU > 0.6:
            print(np.array(ious))
python metrics bounding-box
1个回答
0
投票

问题是,如果

iarea
(ixmax-ixmin)
均为负数(在这种情况下没有交集),则您的代码片段会为
(iymax-iymin)
分配正值,从而导致正值
IOU

快速解决方法是这样的:

for i in range (0,100):
    for j in range(0,100):
        
        pxmin,pymin,pxmax,pymax=pred['boxes'][i]
        gtxmin,gtymin,gtxmax,gtymax=gt[j]
       

        ixmin=max(pxmin,gtxmin)
        ixmax=min(pxmax,gtxmax)
        iymin=max(pymin,gtymin)
        iymax=min(pymax,gtymax)
    
        parea=(pxmax-pxmin)*(pymax-pymin)
        gtarea=(gtxmax-gtxmin)*(gtymax-gtymin)
        if (ixmax - ixmin) < 0 and (iymax - iymin) < 0:
            iarea = 0
        else:
            iarea = (ixmax - ixmin) * (iymax - iymin)
        IOU=iarea/(parea+gtarea-iarea)
        
        if 1>IOU>0.7:
            print(i,j,np.array(IOU))

请注意,使用 numpy 可以更有效地完成此操作(如果您愿意,我可以提供一个示例)。

© www.soinside.com 2019 - 2024. All rights reserved.