算法笔记——iou04

微信公众号:小白图像与视觉

关于技术、关注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

更多请扫码关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值