微信公众号:小白图像与视觉
关于技术、关注
yysilence00
。有问题或建议,请公众号留言。
1.IoU(区域交并比值)
计算IoU的公式如下图,可以看到IoU是一个比值,即交并比。
在分子中,我们计算预测框和ground-truth之间的重叠区域;
分母是并集区域,或者更简单地说,是预测框和ground-truth所包含的总区域。
重叠区域和并集区域的比值,就是IoU。
1.1:使用IoU来评估目标检测器
在回归问题中,我们预测的bounding box的坐标需要去匹配ground-truth的坐标,而坐标完全匹配基本是不现实的。因此,我们需要定义一个评估指标,奖励那些与ground-truth匹配较好(重叠较大)的预测框。最开始我们定义的是欧式距离,这里可以理解为设定一个阈值然后计算面积比值来代替距离会更加准确。
1.2 IoU的python实现
这是顺丰科技计算机视觉算法工程师第一题(已AC),第二题考察非极大值(NMS)这部分在后面的算法将会实现,由此看来目前人工智能的考察队算法底层概念的实现也做出了要求
#!/usr/bin/env python3.6.5
# -*- coding: UTF-8 -*-
"""
Author: yanyong
Date: 2020/10/16 15:51
docs:
"""
import sys
def 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.0
0.5
1.3 Fast R-CNN 中的iou算法,下面是官方提供的代码,目前主流网站上很多都是错误的解释
- 注意
tensflow以及pytorch还有yolo中的实现iou的方式并不一样
下面是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 * h
33 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
更多请扫码关注: