超简单的IoU python3实现

IoU 简介及原理概述

    Intersection over Union(IoU)是一种测量在特定数据集中检测相应物体准确度的一个标准(摘自:百度百科)。通过其英文名可以很直观的看出其计算方法:交并比,即检测的边框结果与真实的边框结果的交集比上它们的并集,其取值范围限制在[0, 1]。
    IoU 的定义如下图所示:
IoU
    计算方式如下:(1)计算两个检测框的交集面积;(2)计算两个检测框各自的面积;(3)两个检测框的面积和减去交集面积,得到两个检测框的并集面积;(4)利用定义,求得IOU值。 由此分析,计算 IoU的难点在于求两个检测框的交集。

IoU 的python实现

    IoU的计算思路就是第一部分中的介绍,但是对于编程来说,如何根据两个检测框的坐标求得其交集面积及IoU值呢???
:图像坐标系与我们平常数学中接触到坐标系不同哦!!!图像坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。)

IoU 坐标
为了求交集面积,只要知道上图中两个蓝色点的坐标(或另外两个角坐标)即可。在此,我们假设两个边框的坐标分别为:rect1(left0, top0, right0, bottom0)、rect2(left1, top1, right1, bottom1)【其中(leftX, topX)为矩形左上角的坐标,(rightX,bottomX)为矩形右下角的坐标】。那么交集框的坐标为:

  • left = max(left0, left1)
  • top = max(top0, top1)
  • right = min(right0, right1)
  • bottom = min(bottom0, bottom1)

交集框左上和右下两个角的坐标分别为[left, top]、[right, bottom]。以上可简单理解为:左上角坐标取两个框x轴的最大值及y轴的最大值;右下角的坐标取两个框x轴的最小值及y轴最小值。
在这判断过程中,还需要考虑两个框不相交的情况:其实也很简单,情况1):交集框左上角的X轴的值大于右下角的X轴值(即 left >= right);情况2):交集框左上角的Y轴的值大于右下角的Y轴值(即 top>=bottom)【这个地方与常识有点相悖,此时一定谨记:该坐标系是图像坐标系哦!】。


IoU计算过程中的情况分析完毕,下面则是展现真正成果的时候了!!!!!!!!!!!!!!!


def calculate_IOU(rec1,rec2):
    """ 计算两个矩形框的交并比
    
    Args:
    	rec1: [left1,top1,right1,bottom1]  # 其中(left1,top1)为矩形框rect1左上角的坐标,(right1, bottom1)为右下角的坐标,下同。
     	rec2: [left2,top2,right2,bottom2]
     	
    Returns: 
    	交并比IoU值
    """
    left_max  = max(rec1[0],rec2[0])
    top_max = max(rec1[1],rec2[1])
    right_min = min(rec1[2],rec2[2])
    bottom_min = min(rec1[3],rec2[3])
    #两矩形相交时计算IoU
    if (left_max < right_min or bottom_min > top_max):  # 判断时加不加=都行,当两者相等时,重叠部分的面积也等于0
        rect1_area = (rec1[2]-rec1[0])*(rec1[3]-rec1[1])
        rect2_area = (rec2[2]-rec2[0])*(rec2[3]-rec2[1])
        area_cross = (bottom_min - top_max)*(right_min - left_max)
	    return area_cross / (rect1_area + rect2_area - area_cross)
	 else:
	 	return 0
### 回答1: FCN(全卷积神经网络)是一种深度学习模型,其中每一层都是卷积层。它被广泛用于图像分类和语义分割等任务。 要在 Python 中实现 FCN,你可以使用深度学习架如 TensorFlow 或 PyTorch。 例如,在 TensorFlow 中,你可以使用 `tf.keras.layers.Conv2D` 层来构建模型的卷积层,使用 `tf.keras.layers.MaxPool2D` 层来构建池化层,并使用 `tf.keras.layers.UpSampling2D` 层来构建上采样层。最后,你可以使用 `tf.keras.Model` 来构建整个模型。 示例代码: ``` import tensorflow as tf class FCN(tf.keras.Model): def __init__(self): super(FCN, self).__init__() self.conv1 = tf.keras.layers.Conv2D(32, 3, activation='relu', padding='same') self.pool1 = tf.keras.layers.MaxPool2D() self.conv2 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same') self.pool2 = tf.keras.layers.MaxPool2D() self.conv3 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same') self.pool3 = tf.keras.layers.MaxPool2D() self.conv4 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same') self.pool4 = tf.keras.layers.MaxPool2D() self.up5 = tf.keras.layers.UpSampling2D() self.conv5 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same') self.up6 = tf.keras.layers.UpSampling2D() self.conv6 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same') self.up7 = tf.keras.layers.UpSampling2D() self ### 回答2: Python实现FCN(Fully Convolutional Networks)的步骤如下: 1. 导入所需的库,如PyTorch、NumPy等。 2. 定义FCN模型的网络结构。FCN是一种基于全卷积网络的图像语义分割模型。它的网络结构一般包含卷积层、池化层和上采样层。根据具体任务的需求可自行设计。 3. 定义损失函数。在图像语义分割任务中,常用的损失函数有交叉熵损失函数。根据模型输出的预测结果和标签数据,计算损失值用于优化模型。 4. 加载数据。根据任务的需求,加载训练集和测试集的图像数据及其对应的标签数据。可以使用PyTorch提供的数据加载工具,如DataLoader。 5. 进行训练。使用加载的数据对FCN模型进行训练。根据定义的损失函数和优化器,反向传播更新模型参数,从而达到训练的目的。 6. 进行推断。使用训练好的模型对新的图像进行语义分割推断。将待推断图像经过模型前向传播得到预测结果,可以通过调整阈值或后处理操作来得到最终的分割结果。 7. 评估模型性能。使用评价指标(如准确率、IoU等)来评估模型在测试集上的性能,从而对模型进行优化或进行模型选择。 值得注意的是,FCN模型的性能取决于很多因素,包括网络结构的设计、数据集的质量、参数的选择等。因此,在实际应用中还需要对这些因素进行进一步的调试和优化。 ### 回答3: Python实现FCN(Fully Convolutional Networks)需要以下几个步骤: 1. 导入所需的库和模块:需要导入常见的机器学习和深度学习库,如NumPy、Pandas、Matplotlib和Keras等。 2. 准备数据:将训练数据和标签准备好,可以是图像数据集和相应的标签图像。可以使用Keras的ImageGenerator来加载和预处理数据。 3. 构建FCN模型:FCN模型由多个卷积层和转置卷积层组成,其中卷积层用于提取图像的特征,而转置卷积层则用于将特征映射还原为原始图像大小。可以使用Keras中提供的Conv2D和Conv2DTranspose来构建模型。 4. 编译模型:设置优化器、损失函数和评估指标,并对模型进行编译。可以使用Keras中的compile函数完成编译。 5. 训练模型:将准备好的数据输入模型进行训练,可以使用Keras中的fit函数来进行训练。在训练过程中,可以设置批次大小、训练周期数和验证集等。 6. 模型评估:使用测试集对模型进行评估,可以计算准确率、精确率、召回率和F1值等评估指标。 7. 预测应用:使用训练好的模型对新的图像进行预测,可以得到相应的分割结果。可以使用Keras中的predict函数实现。 以上就是使用Python实现FCN的基本步骤。在具体实现过程中,可以根据具体需求进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值