欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深度学习笔记 - IoU python 高质量实现

程序员文章站 2022-04-21 19:20:16
文章目录深度学习笔记7 - IoU python 实现一、IoU 含义二、算法实现深度学习笔记7 - IoU python 实现一、IoU 含义二、算法实现算法思想#!/usr/bin/env python# encoding: utf-8'''@Author : pentiumCM@Email : 842679178@qq.com@Software: PyCharm@File : iou_utils.py@Time : 2020/11/22 15:32@de...



深度学习笔记7 - IoU python 实现

一、IoU 含义

IoU:IoU 的全称为交并比(Intersection over Union),IoU 计算的是 “预测框” 和 “真实框” 的交集和并集的比值。

图示如下:
深度学习笔记 - IoU python 高质量实现


二、算法实现

深度学习笔记 - IoU python 高质量实现
真实框和预测框根据实际情况,有如上四种位置关系。如果按照 暴力法 来求解 IoU 势必是一件特别麻烦而且不酷的事,如何帅气地实现 IoU 的算法,可以看我下面算法思想的环节。

算法思想:
我们以上图图2为例,IoU 的计算,是用真实框和预测框的交集面积 / 真实框和预测框的并集面积。所以关键的步骤需要求出交集部分的坐标,即上图中的A,B两点。
得到A,B坐标之后便可求出交集的宽高,来求出交集的面积。并集的面积 = 真实框的面积 + 预测框的面积 - 交集的面积。
问题便可解决

  1. A,B坐标求法:
    A:交集部分的左上坐标,来源于 真实框和预测框左上坐标中的较大值。 inter_upleft = np.maximum(box1[:2], box2[:2])
    B:交集部分的左上坐标,来源于 真实框和预测框左上坐标中的较大值。 inter_botright = np.minimum(box1[2:], box2[2:])

  2. 交集的宽高求法:
    inter_wh = inter_botright - inter_upleft
    inter_wh = np.maximum(inter_wh, 0) :如果没有交集,宽高就赋值为0,解决图3,4的情况。


    关于 np.maximum,np.minimum的解释如下:

	np.maximum(X, Y, out=None):X 和 Y 逐位进行比较,选择最大值。
	np.maximum(X, Y, out=None):X 和 Y 逐位进行比较,选择最小值。

完整代码如下:

#!/usr/bin/env python
# encoding: utf-8
'''
@Author  : pentiumCM
@Email   : 842679178@qq.com
@Software: PyCharm
@File    : iou_utils.py
@Time    : 2020/11/22 15:32
@desc	 : iou的工具模块
'''

import numpy as np

def iou(box1, box2):
    """
    计算预测框和真实框之间的IoU
    :param box1:预测框
    :param box2: 真实框
    :return:
    """
    inter_upleft = np.maximum(box1[:2], box2[:2])
    inter_botright = np.minimum(box1[2:], box2[2:])

    inter_wh = inter_botright - inter_upleft
    inter_wh = np.maximum(inter_wh, 0)

    # 交集面积
    inter = inter_wh[0] * inter_wh[1]
 
    # 真实框的面积
    area_gt = (box2[2] - box2[0]) * (box2[3] - box2[1])
    # 预测框的面积
    area_pred = (box1[2] - box1[0]) * (box1[3] - box1[1])

    # 并集面积
    union = area_gt + area_pred - inter

    # 计算 IoU
    iou_val = inter / union
    return iou_val


if __name__ == '__main__':
    box1 = np.array([50, 100, 150, 200])
    box2 = np.array([100, 50, 200, 150])
    iou_val = iou(box1, box2)

    print(iou_val)

本文地址:https://blog.csdn.net/pentiumCM/article/details/109962380