学习目标

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

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


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

1.计算交并比

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

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

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

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

计算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并且返回IOUo_rate = wh/sreturn 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-x1h = bbox[3] - bbox[1]#高 y2-y1x = bbox[0] + w/2.0#检测框的中心坐标x:  x1+(x2-x1)/2.0y = bbox[1] + h/2.0#检测框的中心坐标y: y1+(y2-y1)/2.0s = 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 =hx1 = x[0]-w/2.0 #左上角x坐标:x1 = x-w/2.0y1 = x[1]-h/2.0 #左上角y坐标:y1 = y-h/2.0x2 = x[0]+w/2.0 #右下角x坐标:x2 = x+w/2.0y2 = x[1]+h/2.0 #右下角y坐标:y2 = y+h/2.0if 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. 候选框不同表示方式之间的转换:

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

    • [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并且返回IOUo_rate = wh/sreturn 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-x1h = bbox[3] - bbox[1]#高 y2-y1x = bbox[0] + w/2.0#检测框的中心坐标x:  x1+(x2-x1)/2.0y = bbox[1] + h/2.0#检测框的中心坐标y: y1+(y2-y1)/2.0s = 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 =hx1 = x[0]-w/2.0 #左上角x坐标:x1 = x-w/2.0y1 = x[1]-h/2.0 #左上角y坐标:y1 = y-h/2.0x2 = x[0]+w/2.0 #右下角x坐标:x2 = x+w/2.0y2 = x[1]+h/2.0 #右下角y坐标:y2 = y+h/2.0if 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))

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

  1. 智慧交通day02-车流量检测实现01:总览

    随着城市交通量的迅猛增加,车流量统计已成为智能交通系统中一项关键技术和热门研究方向.高效而精确的车流量检测可以交通管理者和决策者,以及驾驶员提供数据支撑,从而为交通调度,降低拥堵情况的发生,提高道路利 ...

  2. 智慧交通day02-车流量检测实现14:代码汇总+问题修正

    代码+权重文件+资源https://download.csdn.net/download/qq_39237205/43072746https://download.csdn.net/download/ ...

  3. 智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)

    from __future__ import print_function from numba import jit import numpy as np from scipy.optimize i ...

  4. 智慧交通day02-车流量检测实现12:基于yoloV3的目标检测

    在本章节代码编写中,发现之前的代码所处的环境是python3,因此导致了cv2.dnn.readNetFromDarknet()在代码运行中导致了i[0]的获值失败,故总结如下: cv2.dnn.re ...

  5. 智慧交通day02-车流量检测实现11:yoloV3模型

    yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测:先验框更丰富:调整了网络结构:对象分类使用logistic代替了softmax,更适用于多标签分类任务. 1.算法简介 Y ...

  6. 智慧交通day02-车流量检测实现10:多目标追踪实现

    在这里我们主要实现了一个多目标跟踪器,管理多个卡尔曼滤波器对象,主要包括以下内容: 初始化:最大检测数,目标未被检测的最大帧数 目标跟踪结果的更新,即跟踪成功和失败的目标的更新 初始化 def __i ...

  7. 智慧交通day02-车流量检测实现09:SORT/deepSORT

    SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法.DeepSORT是原团队对SORT的改进版本.现在来解析一下SORT和DeepSORT的基本思路. 1.SORT SORT核心是卡尔曼滤 ...

  8. 智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)

    # 将YOLO模型的检测框和卡尔曼滤波的跟踪框进行匹配 def associate_detection_to_tracker(detections,trackers,iou_threshold=0.3 ...

  9. 智慧交通day02-车流量检测实现07:匈牙利算法

    匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是用来解决多目标跟踪中的数据关联问题,匈牙利算法与KM算法都是为了求解二分图的最大匹配问题 ...

最新文章

  1. 当谷歌员工来到新公司的那一天,发现原来公司什么都没有
  2. python爬虫写入数据库_Python爬虫数据写入操作
  3. 打工人的一把辛酸泪,网站提现为啥多于800要扣20%的税?我想这些东西你需要明白
  4. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
  5. 计算机控制系统复习提纲,《计算机控制系统》复习要点
  6. Unity Asssetbundle问题记录
  7. Javascript:Promise异步编程解决方案
  8. 女朋友也能看懂的Zookeeper分布式锁原理
  9. 驱动开发入门 - 之二:Win7-x64 + VMWare (Win7-x64) + WinDbg 双机调试环境搭建
  10. 项目管理学习总结(11)——项目管理怎么做
  11. Dell Optiplex主流台式机驱动安装指南
  12. Photoshop (PS)下载安装
  13. python求函数零点,在函数零点问题中求解参数范围
  14. linux定时关闭系统at,『学了就忘』Linux系统管理 — 8.系统定时任务(at命令)
  15. 简述c++语言的特点(优点)
  16. Pytorch加载模型并进行图像分类预测
  17. VR-DANN: 联合视频解码与AI处理
  18. [世界杯] 意大利 VS 捷克 2:0 (据说是本届世界杯最有看头的一场)
  19. Css打造一个简单的静态七巧板
  20. LInux-文本处理相关命令笔记

热门文章

  1. 化工图纸中LISP_必备干货丨石油化工安装工程质量与成本控制研究
  2. python单向链表和双向链表的图示代码说明
  3. Linux下快速安装MySQL教程
  4. 高内聚低耦合通俗理解_抱歉,请不要把“业务逻辑层”理解为“业务中台”
  5. python 垃圾回收机制
  6. 制作已编译的html帮助文件
  7. 网络:传输层 TCP报文格式解析
  8. 《Android源码设计模式》--装饰模式
  9. vue项目导入外部css样式和js文件
  10. loadView加载(变换成ScrollView)