我研究了一个模型,我有 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))
问题是,如果
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 可以更有效地完成此操作(如果您愿意,我可以提供一个示例)。