import numpy as np, matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
boxes = np.array([[1,1,4,5],[1.3,0.8,4.2,5.1],[0.7,1.2,3.8,4.7],
[6,2,9,6],[6.3,2.2,9.2,6.1],[4.5,5.5,6,7]], float)
scores = np.array([0.95,0.88,0.80, 0.92,0.79, 0.55])
def iou(a,b):
x1,y1=max(a[0],b[0]),max(a[1],b[1]); x2,y2=min(a[2],b[2]),min(a[3],b[3])
inter=max(0,x2-x1)*max(0,y2-y1)
return inter/((a[2]-a[0])*(a[3]-a[1])+(b[2]-b[0])*(b[3]-b[1])-inter)
def nms(b,s,thr=0.5):
idx=list(np.argsort(s)[::-1]); keep=[]
while idx:
i=idx.pop(0); keep.append(i); idx=[j for j in idx if iou(b[i],b[j])<thr]
return keep
keep=nms(boxes,scores)
fig,ax=plt.subplots(1,2,figsize=(6.8,2.8))
for a,sel,t in [(ax[0],range(len(boxes)),"all detections"),(ax[1],keep,"after NMS")]:
for k in sel:
x1,y1,x2,y2=boxes[k]
a.add_patch(Rectangle((x1,y1),x2-x1,y2-y1,fill=False,ec="#5d2c80",lw=2))
a.text(x1,y1-.2,f"{scores[k]:.2f}",fontsize=7,color="crimson")
a.set_xlim(0,10); a.set_ylim(0,8); a.set_title(t,fontsize=9); a.set_xticks([]); a.set_yticks([])
plt.tight_layout(); plt.show()