目标检测中的IOU和CIOU原理讲解以及应用(附测试代码))

2023-11-17

                                                   

上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现。
 

交并比IOU

交并比IOU(Interp over union)

在目标检测任务中,我们用框框来定位对象,如下图定位图片中这个汽车,假设实际框是图中红色的框框,你的算法预测给出的是紫色的框框,怎么判断你的算法预测的这个框框的效果好坏呢?

这就用到我们的交并比函数IOU了,计算公式如下:

将我们图片汽车的实际红色框记为A,算法的预测框记为B,交并比就是数学中A和B的交集A∩B跟A和B的并集的A∪B的面积之比,非常容易理解。IOU实际上衡量了两个边界框重叠地相对大小,预测框和真实框重叠越大,说明你的算法预测效果比较好,IOU是一个评价指标

那么回到刚刚的问题: 如何利用IOU进行判断算法的预测效果好坏呢?也就是这个预测框是否可以当做正确的定位到我们的目标汽车呢?

在计算机检测任务中,如果我们算法的预测框和实际框之间的交并比IOU≧0.5,那么你的算法预测结果是可以接受的,就说你预测的这个框框是正确的,这个阈值0.5,你可以设置得更高,边界框越精确,在YOLOv3中正是用到这个IOU来对我们的先验框进行了一个筛选,以及计算测试集的模型效果mAP时也用到了IOU进行阈值判断

效果图

首先借助Opencv和numpy框画两个框,然后计算IOU进行展示,如下图。

IOU实现代码

以框的左上角(x1,y1)和右下角(x2,y2)坐标形式来计算它们之间的IOU。

import cv2
import numpy as np

def CountIOU(RecA, RecB):
  xA = max(RecA[0], RecB[0])
  yA = max(RecA[1], RecB[1])
  xB = min(RecA[2], RecB[2])
  yB = min(RecA[3], RecB[3])

  # 计算交集部分面积
  interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)

  # 计算预测值和真实值的面积
  RecA_Area = (RecA[2] - RecA[0] + 1) * (RecA[3] - RecA[1] + 1)
  RecB_Area = (RecB[2] - RecB[0] + 1) * (RecB[3] - RecB[1] + 1)

  # 计算IOU
  iou = interArea / float(RecA_Area + RecB_Area - interArea)
  return iou

if __name__ == "__main__":
  img = np.zeros((512, 512, 3), np.uint8)
  img.fill(255)
  RecA = [50, 50, 300, 300]   # x1,y1,x2,y2
  RecB = [60, 60, 320, 320]
  cv2.rectangle(img, (RecA[0], RecA[1]), (RecA[2], RecA[3]), (0, 255, 0), 5)
  cv2.rectangle(img, (RecB[0], RecB[1]), (RecB[2], RecB[3]), (255, 0, 0), 5)
  IOU = CountIOU(RecA, RecB)
  font = cv2.FONT_HERSHEY_SIMPLEX
  cv2.putText(img, "IOU = %.2f" % IOU, (130, 190), font, 0.8, (0, 0, 0), 2)
  cv2.imshow("image", img)
  cv2.waitKey()
  cv2.destroyAllWindows()

CIOU(Complete-IOU)

CIOU(Complete-IOU)

IoU是比值的概念,对目标物体的尺寸scale是不敏感的。我们在计算框框BBox的回归损失函数进行优化有多种优化方式,如在CIOU之前有GIOU、DIOU,而CIOU解决了一般IoU无法直接优化两个框框没有重叠的部分。

IoU经过GIOU再到DIOU最终发展到CIOU,CIOU将目标与框框anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题,而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去,在最新发布的yolov4中anchor的回归就是用的CIOU方式

CIOU计算公式

其中分别代表了预测框和真实框的中心点的欧式距离,也就是图中的d。代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。

CIOU回归时的LOSS计算:

效果图

首先借助Opencv和numpy框画两个框,然后按照公式计算CIOU进行展示,如下图。

 

代码实现:

import torch
import numpy as np
import cv2
import math


def box_ciou(b1, b2):
    """
    输入为:    ----------
    b1: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
    b2: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
    返回为:    -------
    ciou: tensor, shape=(batch, feat_w, feat_h, anchor_num, 1)
    """
    # 求出预测框左上角右下角
    b1_xy = b1[..., :2]
    b1_wh = b1[..., 2:4]
    b1_wh_half = b1_wh/2.
    b1_mins = b1_xy - b1_wh_half
    b1_maxes = b1_xy + b1_wh_half
    # 求出真实框左上角右下角
    b2_xy = b2[..., :2]
    b2_wh = b2[..., 2:4]
    b2_wh_half = b2_wh/2.
    b2_mins = b2_xy - b2_wh_half
    b2_maxes = b2_xy + b2_wh_half

    # 求真实框和预测框所有的iou
    intersect_mins = torch.max(b1_mins, b2_mins)
    intersect_maxes = torch.min(b1_maxes, b2_maxes)
    intersect_wh = torch.max(intersect_maxes - intersect_mins, torch.zeros_like(intersect_maxes))
    intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]
    b1_area = b1_wh[..., 0] * b1_wh[..., 1]
    b2_area = b2_wh[..., 0] * b2_wh[..., 1]
    union_area = b1_area + b2_area - intersect_area
    iou = intersect_area / (union_area + 1e-6)

    # 计算中心的差距
    center_distance = torch.sum(torch.pow((b1_xy - b2_xy), 2), axis=-1)
    # 找到包裹两个框的最小框的左上角和右下角
    enclose_mins = torch.min(b1_mins, b2_mins)
    enclose_maxes = torch.max(b1_maxes, b2_maxes)
    enclose_wh = torch.max(enclose_maxes - enclose_mins, torch.zeros_like(intersect_maxes))
    # 计算对角线距离
    enclose_diagonal = torch.sum(torch.pow(enclose_wh,2), axis=-1)
    ciou = iou - 1.0 * (center_distance) / (enclose_diagonal + 1e-7)
    v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(b1_wh[..., 0]/b1_wh[..., 1]) - torch.atan(b2_wh[..., 0]/b2_wh[..., 1])), 2)
    alpha = v / (1.0 - iou + v)
    ciou = ciou - alpha * v
    return ciou

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)
    img.fill(255)
    RecA = [1, 90, 90, 150, 150]
    RecB = [1, 150, 150, 200, 200]
    a = torch.tensor(RecA, dtype=torch.float)  # tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
    b = torch.tensor(RecB, dtype=torch.float)
    cv2.rectangle(img, (int(RecA[1]-RecA[3]/2), int(RecA[2]-RecA[4]/2)), (int(RecA[1]+RecA[3]/2), int(RecA[2]+RecA[4]/2)), (0, 255, 0), 5)
    cv2.rectangle(img,(int(RecB[1]-RecB[3]/2), int(RecB[2]-RecB[4]/2)), (int(RecB[1]+RecB[3]/2), int(RecB[2]+RecB[4]/2)), (255, 0, 0), 5)

    CIOU = box_ciou(a,b)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(img, "CIOU = %.2f" % CIOU, (130, 190), font, 0.8, (0, 0, 0), 2)
    cv2.imshow("image", img)
    cv2.waitKey()
    cv2.destroyAllWindows()

所有实现代码,在后台回复关键字:IOU,即可下载使用。

精彩推荐

目标检测中的数据增强方法(附代码讲解)

目标检测中的数据增强方法(附代码讲解)

制作自己的训练数据集之图像标注工具labelimg和labelme

 

关注微信公众号:码农的后花园,后台回复关键字:Python工具,即可获取,查看Python学习系列教程即可快速安装,更有Python系列学习。

                                                                 微信号:码农的后花园

                                                                                     

                                                                                长按识别关注哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)) 的相关文章

随机推荐

  • STL中的排序算法一览[By ACM郭老师]

    这篇文章我很喜欢 是郭老师的新作 希望大家喜欢 详细的从算法的效率方面来说明了排序算法 STL中有多种排序算法 各有各的适用范围 下面听我一一道来 I 完全排序 sort 首先要隆重推出的当然是最最常用的sort了 sort有两种形式 第一
  • python知识系列:os.path.listdir的坑

    问题描述 os path listdir在返回中文路径时 返回的是0xd4等非gbk或utf 8格式的编码 不知道具体编码格式是什么 E Projects PythonProjects DirectorySearchTest 3918L E
  • 【C++历险记】面向对象

    个人主页 兜里有颗棉花糖 欢迎 点赞 收藏 留言 加关注 本文由 兜里有颗棉花糖 原创 收录于专栏 C 之路 本专栏旨在记录C 的学习路线 望对大家有所帮助 希望我们一起努力 成长 共同进步 目录 一 多继承以及菱形继承 二 多继承引发的问
  • 优加DaaS背后,看见新的营销潮

    DaaS 融合开放 这是京东云优加对外传递出来的两个最清晰的声音 前者对应的是能力和边界 后者对应的是态度和打法 两者结合 恰构成了京东云优加 或者说京东在营销侧的未来想象力 作者 皮爷 出品 产业家 今年我们有接近60 以上的营销费用花在
  • Sublime Text 工具安装&配置

    一 安装 官网下载 https www sublimetext com download Windows 下载下来为exe安装程序 portable version 下载下来为zip压缩包 解压后无需安装就能运行 二 安装插件 插件官网 h
  • HIT--ICS计算机系统大作业

    目录 摘要 第1章 概述 1 1 Hello简介 1 2 环境与工具 1 3 中间结果 1 4 本章小结 第2章 预处理 2 1 预处理的概念与作用 2 2在Ubuntu下预处理的命令 2 3 Hello的预处理结果解析 2 4 本章小结
  • 伪类和伪元素的区别?

    前言 伪类和伪元素是CSS中的两种特殊方式 可以对HTML元素添加一些不同于普通选择器样式的显示效果 它们的实现方法类似 但其意义和使用方式有所不同 伪类 Pseudo Class 是在 CSS3 中引入的 用于描述元素的一些动态的和行为相
  • 蓝桥杯接龙数列(动态规划)

    蓝桥杯2023年第十四届省赛真题 接龙数列 C语言网 dotcpp com 我们要求最少删除多少个数 可以使剩下的序列是接龙序列 那么找到一条最长的接龙数列即可求出最少删除的个数 运用动态规划的思想 从前往后挨个考虑每个数字 一个前缀为6的
  • 五分钟带你了解Python基础知识【精华】

    Python基础知识详解 一 Python输出 1 repr 或 str 转成字符串 2 字符串填充空格进行格式化 3 a 使用 ascii s 使用 str 和 r 使用 repr 可以用于在格式化某个值之前对其进行转化 二 Python
  • .NET/C# 随机不重不漏的输出一个集合中的元素

    一 介绍 1 Random Random 类是一个产生伪随机数字的类 介绍 https docs microsoft com en us dotnet api system random redirectedfrom MSDN view n
  • C++primer习题3.14 vector读写字符

    include
  • sentinel-3卫星测高学习资料整理

    在学习过程中 整理关于sentinel 3测高的学习资料 1 SAR Radar Altimeter SRAL instrument specifics https eumetsatspace atlassian net wiki spac
  • pandas中DataFrame 数据合并,连接(merge,join,concat)

    pandas作者Wes McKinney 在 PYTHON FOR DATA ANALYSIS 中对pandas的方方面面都有了一个权威简明的入门级的介绍 但在实际使用过程中 我发现书中的内容还只是冰山一角 谈到pandas数据的行更新 表
  • Ubuntu16.04如何调整屏幕分辨率至1920*1080

    1 引言 ubuntu16 04桌面版安装好后 发现屏幕分辨率调整选项里没有1920x1080这一选项 经过一番研究 可通过如下方式进行屏幕分辨率设置 以下操作均在ubuntu16 04桌面版操作 不要用远程连接操作 否则xrandr命令会
  • 华为OD机试(2021-04)题目一

    题目 一个 0 1000 的整数 拆解为一个 本身 或多个连续自然数的和 按照自然数的个数从少到多输出各个方案 input solution 方案内的自然数按照从小到大排列 public static void main String ar
  • 循环“停止”的三种特殊语句

    对于一个初学者来说 循环的控制无疑是一个难点和重点 但是在有些时候循环是不需要执行完的 或者这个循环的这一次是不用执行的 那么我们如何来实现这些功能呢 下面通过一个例子来加以说明 1 break语句跳出就近的一层循环 while i lt
  • 渗透相关问题(3)

    1 sql注入绕过的方法 注释符号绕过 大小写绕过 内联注释绕过 双写关键字绕过 特殊编码绕过 宽字节绕过 2 WAF常用的类型 硬件设备类型 软件产品类型 基于云的WAF 3 sql注入漏洞防御方法 代码层面 对输入进行严格的转义和过滤
  • JavaSE学习总结:异常处理

    Java异常处理 1 什么是异常 2 异常的处理机制的原理 过程 3 异常的体系结构 1 java lang Throwable 2 java lang Error 3 java lang Exception 4 异常的处理机制 1 抛 2
  • 以太坊区块链技术开发岗位面试题集锦,附答案

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 超过100道以太坊区块链开发技术岗位的面试题 附参考答案 面试题目涵盖 以太坊的基本概念 Geth客户端使用 智能合约基本概念 Solidity开发语言 去中心化 应用DA
  • 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码))

    上期讲解了目标检测中的三种数据增强的方法 这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现 交并比IOU 交并比IOU Interp over union 在目标检测任务中 我们用框框来定位对象 如下图定位