目标检测之IOU和python实现

IOU概念

  1. IOU
    最直观的理解就是两个检测框的交并比,即交集/并集
    如图所示:
    在这里插入图片描述
    2.图像检测中的IOU应用

    一般分为query_boxex和boxes
    像素坐标中的检测框的坐标
    query_box的个数为K,boxes的个数为N
    如上图所示:
    检测框的坐标为( x 0 x_0 x0, y 0 y_0 y0, x 1 x_1 x1, y 1 y_1 y1)代表的是左上角坐标和右下角坐标
    需要注意的是:像素坐标跟直角坐标系是有区别的,x轴朝右,y轴朝下。
    下面为python实现计算IOU的计算过程

import numpy as np 

'''
1、query_boxes的个数为K,boxes的个数为N
2、overlaps为query_boxes分别跟boxes的IOU值,以矩阵的形式表示,shape == (N,K)
3、当交集部分的宽或高大于0时,面积才能够大于0,否则IOU为0,故overlaps = np.zeros((N,K))
'''
class Iou():
    def __init__(self, query_boxes=None, boxes=None):
        self.query_boxes = query_boxes
        self.boxes = boxes
    def IOU(self):
        K = self.query_boxes.shape[0]
        N = self.boxes.shape[0]
        overlaps = np.zeros((N,K))  #初始化一组IOU为0的矩阵
        for k in range(K):
            #计算出query_box的长宽、高和面积
            query_width = self.query_boxes[k,2] - self.query_boxes[k,0] + 1
            query_height = self.query_boxes[k,3] - self.query_boxes[k,1] + 1
            query_area = query_width * query_height
            
            for n in range(N):
                #box的面积
                box_area = (self.boxes[n,2] -self.boxes[n,0] + 1)*(self.boxes[n,3] -self.boxes[n,1] + 1) 
            	#用max和min函数去找出交集部分的坐上角和右下角横坐标
                x_left = max(self.boxes[n,0], self.query_boxes[k,0])     #交集部分的左上角横坐标
                x_right = min(self.boxes[n,2], self.query_boxes[k,2])    #交集部分的右下角横坐标
                
                #求解交集部分的宽
                i_width = x_right - x_left + 1
                if i_width > 0:
                    #用max和min函数去找出交集部分的坐上角和右下角纵坐标
                    y_left = max(self.boxes[n,1], self.query_boxes[k,1])     #交集部分的坐上交纵坐标
                    y_right = min(self.boxes[n,3], self.query_boxes[k,3])    #交集部分的右下角纵坐标
                    i_height = y_right - y_left + 1
                    
                    if i_height > 0:
                        #计算并集部分面积
                        i_area = i_width*i_height
                        #计算并集部分面积
                        union_area = box_area + query_area - i_area
                        #计算iou
                        overlaps[n,k] = i_area/union_area
        return overlaps 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值