智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: IOU是交并比(Intersection-over-Union)是目标检测中使用的一个概念是产生的候选框

学习目标


能够实现两个目标框的交并比


了解候选框在多目标跟踪中的表达方式及相应转换方法


IOU是交并比(Intersection-over-Union)是目标检测中使用的一个概念是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。在多目标跟踪中,用来判别跟踪框和目标检测框之间的相似度。


124554a3be5244868473eb20bedde6be.png


1.计算交并比


IoU是两个区域的交除以两个区域的并得出的结果


20181102130324332.png


背景:在进行目标检测时,常常会用到交并比的概念(IOU(Intersection over Union))


20190114221649458.png


一般来说,这个IoU > 0.5 就可以被认为是一个不错的结果。


举例如下:绿色框是准确值,红色框是预测值。


20190114221957853.png


计算IOU(交并比)代码实现:


#计算IOU(交并比)
@jit
def iou(bb_test,bb_gt):
    """
      在两个box间计算IOU
      :param bb_test: box1 = [x1,y1,x2,y2] 左上角坐标
      :param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐标
      :return: 交并比IOU
    """
    #在两个box间的左上角坐标的最大值
    xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐标x的最大值
    yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐标y的最大值
    #在两个box间的右下角坐标的最小值
    xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐标x的最小值
    yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐标y的最小值
    #交的宽高
    w = np.maximum(0,xx2-xx1)
    h = np.maximum(0,yy2-yy1)
    #交的面积
    wh = w*h
    #并的面积
    s = ((bb_test[2] - bb_test[0]) * (bb_test[3] - bb_test[1])
            + (bb_gt[2] - bb_gt[0]) * (bb_gt[3] - bb_gt[1]) - wh)
    #计算IOU并且返回IOU
    o_rate = wh/s
    return o_rate


2.候选框的表示形式


在该项目中候选框有两种表示形式:


  • [x1,y1,x2,y2] 表示左上角坐标和右下角坐标,目标检测的结果以该方式表示
  • [x,y,s,r]表示中心点坐标,s 是面积尺度,r是纵横比,卡尔曼滤波器中进行运动估计是使用该方式。


这两种方式要进行相互的转换。


  • 将候选框从坐标形式转换为中心点坐标和面积的形式的代码实现:


#左上角坐标[x1,y1]和右下角坐标[x2,y2],
#将候选框从坐标形式[x1,y1,x2,y2]转换为中心点坐标和面积的形式[x,y,s,r]
#其中x,y是框的中心坐标,s是面积,尺度,r是宽高比
def convert_bbox_to_z(bbox):
    """
      将[x1,y1,x2,y2]形式的检测框转为滤波器的状态表示形式[x,y,s,r]。其中x,y是框的中心坐标,s是面积,尺度,r是宽高比
      :param bbox: [x1,y1,x2,y2] 分别是左上角坐标和右下角坐标
      :return: [ x, y, s, r ] 4行1列,其中x,y是box中心位置的坐标,s是面积,r是纵横比w/h
    """
    w = bbox[2] - bbox[0]#宽 x2-x1
    h = bbox[3] - bbox[1]#高 y2-y1
    x = bbox[0] + w/2.0#检测框的中心坐标x:  x1+(x2-x1)/2.0
    y = bbox[1] + h/2.0#检测框的中心坐标y: y1+(y2-y1)/2.0
    s = w*h #检测框的面积
    r = w/float(h) #检测框的宽高比
    return np.array([x,y,s,r]).reshape([4,1]) #kalman需要四行一列的形式


  • 将候选框从中心面积的形式转换为坐标的形式的代码实现:


#将候选框从中心面积[x,y,s,r]的形式转换成左上角坐标和右下角坐标[x1,y1,x2,y2]的形式
#即:将[cx,cy,s,r]的目标框表示转为[x_min,y_min,x_max,y_max]的形式
def convert_xto_bbox(x,score=None):
    """
        将[cx,cy,s,r]的目标框表示转为[x_min,y_min,x_max,y_max]的形式
        :param x:[ x, y, s, r ],其中x,y是box中心位置的坐标,s是面积,r是纵横比w/h
        :param score: 置信度
        :return:[x1,y1,x2,y2],左上角坐标和右下角坐标
        """
    w = np.sqrt(x[2] * x[3]) #w =sqrt(s*r)=sqrt(s*w/h)=sqrt(w*h * w/h)=sqrt(w*w)
    h = x[2]/w #h =s/w =w*h/w =h
    x1 = x[0]-w/2.0 #左上角x坐标:x1 = x-w/2.0
    y1 = x[1]-h/2.0 #左上角y坐标:y1 = y-h/2.0
    x2 = x[0]+w/2.0 #右下角x坐标:x2 = x+w/2.0
    y2 = x[1]+h/2.0 #右下角y坐标:y2 = y+h/2.0
    if score is None:
        return np.array([x1,y1,x2,y2]).reshape((1,4))
    else:
        return np.array([x1,x1,x2,y2,score]).reshape((1,5))


总结


1.IOU的计算方法:两个区域的交比上两个区域的并,即为IOU


2.候选框不同表示方式之间的转换:


1.[x1,y1,x2,y2] 表示左上角坐标和右下角坐标


2.[x,y,s,r]表示中心点坐标,s 是面积尺度,r是纵横比


代码汇总:


from __future__ import print_function
from numba import jit
import numpy as np
from scipy.optimize import linear_sum_assignment
from filterpy.kalman import KalmanFilter
#计算IOU(交并比)
@jit
def iou(bb_test,bb_gt):
    """
      在两个box间计算IOU
      :param bb_test: box1 = [x1,y1,x2,y2] 左上角坐标
      :param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐标
      :return: 交并比IOU
    """
    #在两个box间的左上角坐标的最大值
    xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐标x的最大值
    yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐标y的最大值
    #在两个box间的右下角坐标的最小值
    xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐标x的最小值
    yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐标y的最小值
    #交的宽高
    w = np.maximum(0,xx2-xx1)
    h = np.maximum(0,yy2-yy1)
    #交的面积
    wh = w*h
    #并的面积
    s = ((bb_test[2] - bb_test[0]) * (bb_test[3] - bb_test[1])
            + (bb_gt[2] - bb_gt[0]) * (bb_gt[3] - bb_gt[1]) - wh)
    #计算IOU并且返回IOU
    o_rate = wh/s
    return o_rate
#左上角坐标[x1,y1]和右下角坐标[x2,y2],
#将候选框从坐标形式[x1,y1,x2,y2]转换为中心点坐标和面积的形式[x,y,s,r]
#其中x,y是框的中心坐标,s是面积,尺度,r是宽高比
def convert_bbox_to_z(bbox):
    """
      将[x1,y1,x2,y2]形式的检测框转为滤波器的状态表示形式[x,y,s,r]。其中x,y是框的中心坐标,s是面积,尺度,r是宽高比
      :param bbox: [x1,y1,x2,y2] 分别是左上角坐标和右下角坐标
      :return: [ x, y, s, r ] 4行1列,其中x,y是box中心位置的坐标,s是面积,r是纵横比w/h
    """
    w = bbox[2] - bbox[0]#宽 x2-x1
    h = bbox[3] - bbox[1]#高 y2-y1
    x = bbox[0] + w/2.0#检测框的中心坐标x:  x1+(x2-x1)/2.0
    y = bbox[1] + h/2.0#检测框的中心坐标y: y1+(y2-y1)/2.0
    s = w*h #检测框的面积
    r = w/float(h) #检测框的宽高比
    return np.array([x,y,s,r]).reshape([4,1]) #kalman需要四行一列的形式
#将候选框从中心面积[x,y,s,r]的形式转换成左上角坐标和右下角坐标[x1,y1,x2,y2]的形式
#即:将[cx,cy,s,r]的目标框表示转为[x_min,y_min,x_max,y_max]的形式
def convert_xto_bbox(x,score=None):
    """
        将[cx,cy,s,r]的目标框表示转为[x_min,y_min,x_max,y_max]的形式
        :param x:[ x, y, s, r ],其中x,y是box中心位置的坐标,s是面积,r是纵横比w/h
        :param score: 置信度
        :return:[x1,y1,x2,y2],左上角坐标和右下角坐标
        """
    w = np.sqrt(x[2] * x[3]) #w =sqrt(s*r)=sqrt(s*w/h)=sqrt(w*h * w/h)=sqrt(w*w)
    h = x[2]/w #h =s/w =w*h/w =h
    x1 = x[0]-w/2.0 #左上角x坐标:x1 = x-w/2.0
    y1 = x[1]-h/2.0 #左上角y坐标:y1 = y-h/2.0
    x2 = x[0]+w/2.0 #右下角x坐标:x2 = x+w/2.0
    y2 = x[1]+h/2.0 #右下角y坐标:y2 = y+h/2.0
    if score is None:
        return np.array([x1,y1,x2,y2]).reshape((1,4))
    else:
        return np.array([x1,x1,x2,y2,score]).reshape((1,5))


目录
相关文章
|
11月前
|
开发工具 git
解决 VSCode 安装通义灵码后左侧菜单栏不显示按钮的问题
在 VSCode 中安装通义灵码插件后,若左侧活动栏未显示图标,可通过右键选中代码触发插件面板,并将其图标拖至左侧栏固定,便于后续快速使用。
5114 116
|
10月前
|
缓存 安全 C++
C盘爆满电脑卡?3个简单技巧+1个便捷工具,小白也能轻松清理
电脑使用久了,C盘常因系统文件、软件安装和临时缓存堆积而空间不足,导致运行卡顿甚至蓝屏。本文教你识别C盘“隐形垃圾”,并提供3个手动清理技巧和1个实用工具(CCleaner),轻松释放空间,提升电脑速度,延长使用寿命。定期清理C盘,让电脑始终保持流畅运行。
1211 0
|
前端开发 NoSQL Java
面试官:如何防止短信盗刷和短信轰炸?
面试官:如何防止短信盗刷和短信轰炸?
1302 1
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
4101 1
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
数据可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
|
机器学习/深度学习 编解码 计算机视觉
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
|
大数据 API 数据库
进行实名认证的必要性,实名认证使用很简单(附教程)
网络平台通过大数据技术进行实名认证以验证用户身份的真实性。常用方法包括身份证、手机号和银行卡信息的核验,如身份证实名认证、公安人脸实名认证、手机三要素及二要素实名认证、以及银行卡要素验证等接口。实名认证广泛应用于游戏、电商、招聘、金融和安保等领域。为调试接口,推荐使用Postman工具,可通过简单的配置测试接口有效性,并导出所需语言的代码样例。具体步骤包括:设置Header中的Authorization字段,并按需配置body参数,最后导出代码以便直接使用。
|
域名解析 网络协议 网络安全
阿里云DDoS高防(中国内地)计费说明
阿里云DDoS高防(中国内地)计费说明
|
监控 安全 网络协议
分享一下这几款超棒的上网行为管理软件
探索高效上网行为管理工具:WorkWin提供远程控制、权限管理及行为监控,助力企业提升效率与安全;Kaspersky Safe Kids保障孩子网络安全,设定屏幕时间;OpenDNS FamilyShield,免费DNS过滤不良网站,简易操作适合家庭使用。这些软件是网络管理的得力助手,确保工作与学习环境更健康、有序。[来源:B站文章]
524 2
AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axio
AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axio