保姆级计算mAP的python代码

  • 处理数据集中的每一副图片,判断图片中的预测框是TP还是FP
    • 预测框按confidence降序排序
    • 对预测框中的每个类别:计算预测框和真实框的iou,取iou最大值满足阈值的,去重,得到TP
def iou(a, b):
	A=len(a)
	B=len(b)
	# 计算a的面积并扩展成A×B
	area1=a[:,2]*a[:,3]
	area1=np.repeat(area1.reshape(A,1), B, 1)
	# 计算b的面积并扩展成A×B
	area2=b[:,2]*b[:,3]
	area2=np.repeat(area2.reshape(1,B), A, 0)
	# a转化成左上右下格式
	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)
	# b转化成左上右下格式
	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
	# 右下小于左上,设0
	inter[inter<0]=0
	# 计算交集的面积,inter大小为A×B
	inter=inter[:,:,0]*inter[:,:,1]
	# 返回值的形状是A×B
	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):
	### 按confidence降序排序 ###
	preds = preds[preds[:,-1].argsort()[::-1]]
	# 预测框的class_id转化成整型
	class_id = preds[:,-2].astype(int)
	# 当前预测框中的类别
	cls = np.unique(class_id)
	# 所有类别数,用于判断预测框的class_id是否超出范围
	cls_all = len(sums)
	# 遍历当前预测框中的类别
	for c in cls:
		if c >= cls_all: continue
		# 取类别c的pred和gt
		pred = preds[class_id == c]
		# 图中没有任何目标,直接赋值0
		if len(gts) < 1:
			for j in range(len(pred)):
				sums[c].append([pred[j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值