我做过模特。我有100个成组技术和预测部件的包围盒。我想计算每个欠条的记分。但我不能直接这么做,因为有命令。包围盒的坐标顺序是不同的。例如,gt的第一个边界框与预测的第43个边界框重叠。我试图找到匹配的订单,并使用以下代码计算每个订单的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)
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
....我不能拿最高的欠条分,因为他们有的没有重叠,即使他们有最高的欠条score.How,我能解决这个问题吗?
新版本:
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))发布于 2022-09-05 08:49:03
问题是,如果iarea和(ixmax-ixmin)都为负值(在这种情况下不存在交集),则代码片段将为IOU分配一个正值,从而导致正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可以更有效地完成此任务(如果您愿意的话,我可以提供一个示例)。
https://stackoverflow.com/questions/73606209
复制相似问题