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

简介: 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))


目录
相关文章
|
消息中间件 安全 NoSQL
2023春招面试专题:高并发解决方案(三)
2023春招面试专题:高并发解决方案
333 0
|
消息中间件
使用RabbitMQ如何保证消息不丢失 ?
RabbitMQ通过发布者确认、回执机制、消息持久化及消费者确认等方案,确保消息从发送到接收的每个环节都能有效防止丢失。即便如此,特殊情况下仍可能丢失,如系统故障等。为此,可设计消息状态表,记录消息ID、内容、交换机、路由键、发送时间和签收状态等,结合定时任务检查并重发未签收消息,以进一步提升消息传输的可靠性。
339 1
|
前端开发 NoSQL Java
面试官:如何防止短信盗刷和短信轰炸?
面试官:如何防止短信盗刷和短信轰炸?
1195 1
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
3772 1
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
应用服务中间件 网络安全 nginx
nginx 常用命令 |升级到1.20.1版本 | 如何更换 Nginx SSL 证书
nginx 常用命令 |升级到1.20.1版本 | 如何更换 Nginx SSL 证书
898 0
|
数据可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
|
机器学习/深度学习 编解码 计算机视觉
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
|
设计模式 前端开发 数据库
Django教程第1章 | 快速入门 | 基础知识
Django简介、Django特点、MVC与MTV模型、安装Django、开发用户管理案例【2月更文挑战第21天】
405 2
Django教程第1章 | 快速入门 | 基础知识
AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axio
AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axio