微信公众号:小白图像与视觉
关于技术、关注yysilence00。有问题或建议,请公众号留言。
计算IoU的公式如下图,可以看到IoU是一个比值,即交并比。
在分子中,我们计算预测框和ground-truth之间的重叠区域;
分母是并集区域,或者更简单地说,是预测框和ground-truth所包含的总区域。
重叠区域和并集区域的比值,就是IoU。
在回归问题中,我们预测的bounding box的坐标需要去匹配ground-truth的坐标,而坐标完全匹配基本是不现实的。因此,我们需要定义一个评估指标,奖励那些与ground-truth匹配较好(重叠较大)的预测框。最开始我们定义的是欧式距离,这里可以理解为设定一个阈值然后计算面积比值来代替距离会更加准确。
这是顺丰科技计算机视觉算法工程师第一题(已AC),第二题考察非极大值(NMS)这部分在后面的算法将会实现,由此看来目前人工智能的考察队算法底层概念的实现也做出了要求
#!/usr/bin/env python3.6.5# -*- coding: UTF-8 -*-"""Author: yanyongDate: 2020/10/16 15:51docs:"""import sysdef compute_iou(f_list): x1 = f_list[0] y1 = f_list[1] x2 = f_list[2] y2 = f_list[3] x3 = f_list[4] y3 = f_list[5] x4 = f_list[6] y4 = f_list[7] x_ = min(x2, x4) - max(x1, x3) y_ = min(y2, y4) - max(y1, y3) #print(x_, y_) rect_1_union = abs((x2 - x1)) * abs((y2 - y1)) rect_2_union = abs((x4 - x3)) * abs((y4 - y3)) #print(rect_1_union, rect_2_union) if x_ < 0 or y_ < 0: inter_area = 0 # print('inter_area', inter_area) # 交集 else: inter_area = abs(x_) * abs(y_) # print('inter_area',inter_area) # 并集 union_area = max(0, rect_1_union) + max(0, rect_2_union) - inter_area # 求iou iou = inter_area / union_area print(iou)if __name__ == '__main__': ##0.0,0.0,1.0,1.0 0.0,0.0,0.5,1.0 str_list = sys.stdin.readline().strip().split(' ')#以空格为分割生成一个列表 #print(str_list) # f_list = input().split(' ') str = ','.join(str_list)#将字符串列表合并成一个字符串 #print(str) #print(type(str)) f_list = str.split(',')#以逗号为分割将字符串生成一个列表 #print(f_list) #f_list =[float(i) for i in f_list]#将字符列表强制转换成数字列表 f_list = list(map(float, f_list)) #print(type(f_list)) compute_iou(f_list)计算结果:
输入:0.0,0.0,1.0,1.0 0.0,0.0,0.5,1.00.5下面是fast r-cnn中源代码
1 # -------------------------------------------------------- 2 # Fast R-CNN 3 # Copyright (c) 2015 Microsoft 4 # Licensed under The MIT License [see LICENSE for details] 5 # Written by Ross Girshick 6 # -------------------------------------------------------- 7 8 import numpy as np 9 10 def py_cpu_nms(dets, thresh):11 """Pure Python NMS baseline."""12 x1 = dets[:, 0]13 y1 = dets[:, 1]14 x2 = dets[:, 2]15 y2 = dets[:, 3]16 scores = dets[:, 4]17 18 areas = (x2 - x1 + 1) * (y2 - y1 + 1)19 order = scores.argsort()[::-1]20 21 keep = []22 while order.size > 0:23 i = order[0]24 keep.append(i)25 xx1 = np.maximum(x1[i], x1[order[1:]])26 yy1 = np.maximum(y1[i], y1[order[1:]])27 xx2 = np.minimum(x2[i], x2[order[1:]])28 yy2 = np.minimum(y2[i], y2[order[1:]])29 30 w = np.maximum(0.0, xx2 - xx1 + 1)31 h = np.maximum(0.0, yy2 - yy1 + 1)32 inter = w * h33 ovr = inter / (areas[i] + areas[order[1:]] - inter)34 35 inds = np.where(ovr <= thresh)[0]36 order = order[inds + 1]37 38 return keep更多请扫码关注: