- 处理数据集中的每一副图片,判断图片中的预测框是TP还是FP
- 预测框按confidence降序排序
- 对预测框中的每个类别:计算预测框和真实框的iou,取iou最大值满足阈值的,去重,得到TP
def iou(a, b):
A=len(a)
B=len(b)
area1=a[:,2]*a[:,3]
area1=np.repeat(area1.reshape(A,1), B, 1)
area2=b[:,2]*b[:,3]
area2=np.repeat(area2.reshape(1,B), A, 0)
aa=np.zeros((A,4))
aa[:,0:2]=a[:,0:2]-a[:,2:4]/2.0
aa[:,2:4]=aa[:,0:2]+a[:,2:4]
aa=np.repeat(aa.reshape(A,1,4), B, 1)
bb=np.zeros((B,4))
bb[:,0:2]=b[:,0:2]-b[:,2:4]/2.0
bb[:,2:4]=bb[:,0:2]+b[:,2:4]
bb=np.repeat(bb.reshape(1,B,4), A, 0)
lt=np.maximum(aa[:,:,0:2], bb[:,:,0:2])
rb=np.minimum(aa[:,:,2:4], bb[:,:,2:4])
inter=rb-lt
inter[inter<0]=0
inter=inter[:,:,0]*inter[:,:,1]
return inter/(area1+area2-inter)
'''
判断一副图片是TP或FP
preds : 数组,经过后处理的预测框,N×6,(x,y,w,h,class_id,confidence)
gts : 数组,真实框,M×5,(x,y,w,h,class_id)
sums : 长度为类别数的列表,sums[i]是某个类别的列表,sums[i][j]是(confidence, a), a=1 if TP else 0
thld : iou阈值
return :更新后的sums
'''
def deal_image(preds, gts, sums, thld):
preds = preds[preds[:,-1].argsort()[::-1]]
class_id = preds[:,-2].astype(int)
cls = np.unique(class_id)
cls_all = len(sums)
for c in cls:
if c >= cls_all: continue
pred = preds[class_id == c]
if len(gts) < 1:
for j in range(len(pred)):
sums[c].append([pred[j]