YOLO之trt推理+Diou/iou目标跟踪以及计数【附代码】

2023-05-16

本篇文章是对之前YOLOv4 tensorrt推理项目的更新,在trt推理,多进程语音报警的功能中又新添加了目标跟踪【可用于目标计数】

采用IOU进行跟踪【也可以选用DIOU】。

yolov4+deepsort可以参考我另一篇:yolov4+deepsort

说明:

本项目做的是单目标的跟踪,可以实现对特定类别的跟踪。iou目标跟踪效果还是比较差。适用于场景变换不大,物体移动速度慢的场景,只是检测速度会比deepsort的要快一些,如果对跟踪效果要求比较高,还是建议采用deepsort。

后期会更新CIOU进行目标跟踪。


利用iou进行跟踪是比较简单的,也是目标检测中最为常用的手段,但与目标检测还是不一样,在目标检测的iou过滤中【指预测部分】,是将大于阈值的目标过滤掉,保留小于阈值的,在训练阶段是将target box与output的box iou大的保留下来表示正样本的匹配。

而在目标跟踪中,是将目标前一帧和后一帧的box计算iou,如果大于阈值说明是同一目标。

iou对box的处理可以参考我另一篇文章:采用iou过滤预测框


这里直接附上利用iou做跟踪的代码。

 主要是返回两个值,

一个是target_dict:包含了目标的id以及box信息【x1,y1,x2,y2,score,iou的值】。

另一个是target_index:目标的ID,可以用来做计数。

当判断大于iou阈值的时候会将信息记录在reg_dict中,并设置is_track为True.如果是新目标的时候,target_index + 1.代码中的输入box_data值的是当前帧【也就是model的输出结果】,target_dict中的box信息是前一帧的信息,用这两个box计算iou。

代码注解我也都标注出来了。

'''
采用iou进行目标的跟踪,对前一帧和当前帧iou判断是否为同一目标
'''
import copy

def compute_iou(box_a, box_b, diou=True):
    S_rec1 = (box_a[2] - box_a[0]) * (box_a[3] - box_a[1])
    S_rec2 = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1])
    # 并集面积
    sum_area = S_rec1 + S_rec2

    left_X = max(box_a[1], box_b[1])  # 相交的左上角
    left_Y = max(box_a[0], box_b[0])

    right_X = min(box_a[3], box_b[3])  # 相交的右下角
    right_Y = min(box_a[2], box_b[2])

    # ----------------用来算diou内容--------------------
    center_a_x = (box_a[3] - box_a[1]) / 2 + box_a[1]
    center_a_y = (box_a[2] - box_a[0]) / 2 + box_a[0]

    center_b_x = (box_b[3] - box_b[1]) / 2 + box_b[1]
    center_b_y = (box_b[2] - box_b[0]) / 2 + box_b[0]
    # 计算两个框中心点的欧式距离
    center_distance = (center_b_x-center_a_x)**2 + (center_b_y-center_a_y) ** 2

    # 计算两个框最小矩形的左上角和右下角
    closebox_min_x = min(box_a[1], box_b[1])
    closebox_min_y = min(box_a[0], box_b[0])
    closebox_max_x = max(box_a[3], box_b[3])
    closebox_max_y = max(box_a[2], box_b[2])

    # 计算两个框最小矩形的对角线距离
    closebox_distance = (closebox_min_x-closebox_max_x)**2 + (closebox_min_y- closebox_max_y)**2
    # -------------------------------------------------

    if left_X >= right_X or left_Y >= right_Y:
        return 0.
    else:
        # 相交的面积
        inter_area = (right_X - left_X) * (right_Y - left_Y)
        iou = inter_area / (sum_area - inter_area)
        return iou - (center_distance/closebox_distance) if diou else iou


def tracking_box(box_data, target_dict, track_index, iou_thre=0.8):
    reg_dict = {}  # 用来记录识别id以及信息
    # box_data是列表形式
    for bbox in box_data:  # box_data会保存目标坐标,每个元素bbox是元组的形式,包含内容(x1.y1,x2,y2,score)
        xa0, ya0, xa1, ya1, score = bbox  # 当前帧目标的box
        is_tracke = False  # 状态初始化
        for k_ in target_dict.keys():
            xb0, yb0, xb1, yb1, s, _ = target_dict[k_]  # 前一帧的box
            iou_ = compute_iou((ya0, xa0, ya1, xa1), (yb0, xb0, yb1, xb1))
            if iou_ > iou_thre:  # 跟踪目标成功
                reg_dict[k_] = (xa0, ya0, xa1, ya1, score, iou_)
                is_tracke = True  # 跟踪√
                # print('iou_', iou_)
        if not is_tracke:  # 表示新的目标
            reg_dict[track_index] = (xa0, ya0, xa1, ya1, score, 0.)  # 记录目标id以及信息
            track_index += 1
            if track_index >= 65535:  # 越界归零
                track_index = 0
            if track_index >= 100:
                track_index = 0
    target_dict = copy.deepcopy(reg_dict)  # 记录target信息
    # print(target_dict)
    return target_dict, track_index

def target_tracking(box_data, target_dict, track_index):
    target_dict, track_index = tracking_box(box_data, target_dict, track_index)
    return target_dict, track_index

代码:

git clone --branch v3.0 https://github.com/YINYIPENG-EN/YOLOv4_tensorRT_pytorch.git 

 python predict.py --weights [weight path] --video --video_path 0 --engine --track --track_class person

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

YOLO之trt推理+Diou/iou目标跟踪以及计数【附代码】 的相关文章

  • 宏#define的三种基本定义方式:固定值,表达式,运算符。

    define xff1a define是C语言中的预处理命令 xff0c 预处理命令以 开头 xff0c 比如我们经常写的代码 include lt stdio h gt 也是预处理命令 define用于宏定义 xff0c 作用是方便程序段
  • 四旋翼飞行器的姿态解算小知识点

    1 惯性测量单元IMU InertialMeasurement Unit 姿态航向参考系统AHRS Attitude and Heading Reference System 地磁角速度重力MARG Magnetic Angular Rat
  • 四元数姿态解算中的地磁计融合解读

    笔者最近在做四轴 xff0c 涉及到地磁计的融合算法 xff0c 网上大多数是x IMU的融合代码 xff0c 但是这段代码对于地磁计的融合说明没有做过多的解释 xff0c 网上没有相关讨论 xff0c 仅在阿莫论坛看到一篇相关的代码解释
  • C++封装静态链接库及使用

    一 为什么要把程序封装成库 有时我们需要把自己的程序交给第三方调用 xff0c 但是又不想被别人看到自己的具体实现代码 xff0c 就封装成库给别人使用 库有动态链接库和静态链接库 xff0c 区别是动态链接库可以在程序运行时动态链接 xf
  • 四元数姿态的梯度下降法推导和解读

    笔者前面几篇文章讨论的是基于四元数的互补滤波算法 xff0c 并单独对地磁计融合部分做了详细的讨论和解释 而本文讨论的姿态融合算法叫做梯度下降法 xff0c 这部分代码可以参见Sebastian O H Madgwick在2010年4月发表
  • 四轴加速度计滤波

    加速度计滤波实验参数 xff1a 采样频率Fs 61 250Hz 截止频率Cutoff Frequency 未开电机静止 开电机悬停 未开电机转动飞控 原始输出 Raw 260 Hz 260Hz 260Hz MPU6050内部 LPF 94
  • Kalman论文笔记

    笔者前段时间阅读了一些关于Kalman的姿态论文 xff0c 本想把Kalman的知识点也整理出来发布 xff0c 无奈这编辑器不给力 xff0c 太多的公式无法复制粘贴 xff0c 图片格式上传的太复杂 xff0c 就放弃了 因此笔者只发
  • uCOS-III学习笔记

    前一段时间笔者学习uCOS III xff0c 第一次接触OS这个概念吧 下面把个人的学习笔记分享出来 xff0c 仅供参考 1 前后台系统 xff1a 后台程序是一个死循环 xff0c 也称为 任务级 xff0c 前台程序则是中断服务程序
  • 3.17 开发一个插件

    打开动态链接库 void dlopen const char filename int flag 返回一个操作句柄void Handle 61 dlopen libct so RTLD LAZY RTLD LAZY xff1a 解析动态库遇
  • 5.7 属性声明

    5 7 属性声明 主要用途 使用 attribute 来声明变量 函数的特殊属性 指导编译器来进行特定方面的优化或代码检查 使用方法 在声明后面添加 xff1a attribute ATTRIBUTE 例 xff1a int global
  • 8.18 模块设计原则:高内聚低耦合

    8 18 模块设计原则 xff1a 高内聚低耦合 模块内聚 定义 xff08 软考 xff09 块内联系 xff1a 模块内各元素的关联 交互程度 从功能角度 xff1a 自己的功能自己实现 xff0c 不麻烦其它模块 如何实现高内聚 功能
  • 9.12 中断(下):中断函数的编写

    9 12 中断 下 xff1a 中断函数的编写 中断特性 可随时打断正在执行的任务 可在任何地方打断正在执行的任务 中断返回后 xff0c CPU不一定重新执行被打断的任务 中断函数 调用时间不固定 xff1a 中断要自己保护现场 调用地点
  • 9.16 内存、外存与外设

    9 16 内存 外存与外设 按速度排列 寄存 缓存 内存 外存 存储分类 内存 又称主存 xff1a CPU能直接寻址的存储空间 存取速度快 包括 xff1a RAM ROM cache等 外存 又称辅存 xff1a 除CPU缓存和内存以外
  • 载波相位测量原理

    1 重建载波 定义 xff1a 载波调制了电文之后变成了非连续的波 xff0c 将非连续的载波信号恢复成连续的载波信号 码相关法 xff1a 方法 将所接收到的调制信号 xff08 卫星信号 xff09 与接收机产生的复制码相乘 技术要点
  • wpa_suplicant 详解 文章收集

    wpa suplicant 详解 文章收集 参考资料 https w1 fi wpa supplicant devel index html https zhuanlan zhihu com p 24246712 https www cnb
  • 玩转AOSP源码编译

    整理搬运一下大佬的文章 https www bilibili com video BV19f4y1r7E6 http liuwangshu cn batcoder aosp 3 compiling aosp html 1 前言 1 1 re
  • Qt 64位链接 mysql8.0 中出现的问题及其解决办法

    1 driver not loaded 原因总结 MinGW编译器中找不到 MySql驱动或者驱动位数不对MinGW编译器找不到 MySql动态库或者动态库有问题代码写的有问题 https blog csdn net l0p0c artic
  • Linux man 手册中各种括号的含义

    尖括号 lt gt 一般用于表示必选项或者参数的占位符 xff0c 实际使用时需要替换成具体的值 方括号 一般用于表示可选项或者参数的占位符 xff0c 实际使用时可以选择是否包含该选项或者参数 大括号 一般用于表示一组选项或者参数 xff
  • 批量创建 markdown 文件的脚本

    写一个 dos脚本 xff0c 其功能是创建 36 个 以 34 Linux内核编程 ch11 sec 34 为开头的 Markdown格式的文件 64 echo off chcp 65001 setlocal enabledelayede
  • libcurl库的http get和http post使用

    一 libcurl中的http get使用方法 1 为什么要使用libcurl 1 作为http的客户端 xff0c 可以直接用socket连接服务器 xff0c 然后对到的数据进行http解析 xff0c 但要分析协议头 xff0c 实现

随机推荐

  • Postman查看完整的请求报文

    第一步 工具栏 View gt Show postman console 第二步 点击 Show Postman Console 之后 就会弹出一个如下图所示的界面 小窍门 postman可以把请求的参数生成代码 可以在代码使用 仅仅只需点
  • 通用异步接收器/发送器(UART)——发送与接收

    图1 带数据总线的UART UART代表通用异步接收器 发送器 它不是像SPI和I2C这样的通信协议 xff0c 而是微控制器中的物理电路或独立的IC UART的主要目的是发送和接收串行数据 关于UART最好的一点是其仅使用两条线在设备之间
  • MYSQL导入数据出现Error 1290:The MySQL server is running with the --secure-file-priv option so it cannot ex

    最近在学习MySQL xff0c 刚入门 xff0c 在导入数据的时候出现了Error 1290 xff1a The MySQL server is running with the secure file priv option so i
  • openmv--无人机通过mavlink实现apriltag定点降落

    span class token comment 无人机通过mavlink实现apriltag定点降落例程 span span class token comment span span class token comment 这个脚本使用
  • [转] 用WWW-Authenticate实现登录验证

    用WWW Authenticate实现登录验证 文章来源 xff1a http www keakon cn bbs thread 1989 1 1 html 今天在研究HTTP协议时发现一个叫WWW Authenticate的头字段 xff
  • ROS--坐标理解

    北东地坐标系 NED north east down 东北天 ENU east north up 机体坐标系 body frame 载体坐标系 是以载体为中心 xff0c 主要作用是处理与传感器直接测得的物理量 导航坐标系 可以是地固坐标系
  • qt 编译qgc常见问题

    qt LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 xff1b 请使用 NODEFAU 如果以前没有问题 xff0c 突然出现的这个问题 xff0c 绝大可能是中间编译过程太多造成的 清理项目 重新构建
  • VINS-FUSION-GPU在jetson nx上的实现

    需要安装经过修改的Ubuntu18系统 https span class token operator span span class token comment developer nvidia com zh cn embedded do
  • 主机ping通虚拟机,虚拟机ping通主机解决方法(NAT模式)

    主机ping通虚拟机 xff0c 虚拟机ping通主机解决方法 xff08 NAT模式 xff09 有时候需要用虚拟机和宿主机模拟做数据交互 xff0c ping不通是件很烦人的事 xff0c 本文以net模式解决这一问题 宿主机系统 xf
  • 一个基于Matlab的简单Gui设计

    前几日浩子说要编一个基于Matlab的用户图像界面 xff0c 他用GUIDE搭了一个大概的框架 xff0c 大概要实现数据读入 做图分析 图像清除 关闭界面的功能 xff0c 我用函数形式给改编了一个 xff0c 虽然问题比较简单 xff
  • 关于N步相移中相位噪声仿真分析的一点说明

    在条纹投影的三维测量中 xff0c 有这么一个经典的结论 xff1a 假设光强的噪声为方差为 2 xff0c 那么 xff0c 经过N步标准相移求得的相位的方差为2 2 N B 2 xff08 xff09 xff0c 其中 xff0c B为
  • 如何给MFC对话框添加背景图片

    一 创建项目 文件 新建项目 MFC应用程序 该页面使用 基于对话框 完成即可 注意 取消 使用Unicode库 否则在使用AfxMessageBox会报错 xff0c 没有一个可以转换的参数类型 xff0c 要加AfxMessageBox
  • 如何检测应用程序调用了哪些DLL文件?

    之前所用的检测工具是Dllshow xff0c 后来突然不能用了 xff0c VS以前有Depends xff0c 后来高级版本也没了 最近找到一种简单方便的方法 xff0c 利用windowsx系统自带的功能 运行你想知道的应用程序 xf
  • 网络编程懒人入门(一):快速理解网络通信协议(上篇)

    1 写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统 xff0c 很多时候连基本的网络编程理论 xff08 如网络协议等 xff09 都不了解 xff0c 就贸然定方案 写代码 xff0c 显得非常盲目且充满技术风险 即时
  • Matlab中调用C++dll

    利用mex技术可以实现这个功能 xff0c 但是必须例外写一个接口函数 xff0c 比较麻烦 利用dll调用的方法 xff0c 简单方便 下面就以实现加法函数add 为例 xff0c 来详细介绍具体过程 一 利用VS生成dll文件 利用VS
  • 大小端序与端序转换

    最近在做客户项目的时候 xff0c 遇到了不同厂家的安防相机输出的数据大小端序不一致的情况 xff0c 导致在使用同一种方式处理时 xff0c 出现了错误 虽然问题已经解决 xff0c 还是顺手把大小端序的知识简单梳理一下 1 大端序和小端
  • debian ware source

    deb http ftp cn debian org debian jessie main non free contrib deb http ftp cn debian org debian jessie proposed updates
  • debian中文输入法——拼音和五笔的解决方法

    最近安装Debian操作系统 xff0c 但遇到一个重大的困惑 xff0c 那就是为什么Debian菜单里面有一个Fcitx的选项 xff0c 但是为什么就是无法调出前端来实现输入 xff0c 这是个大问题 xff0c 于是就研究 xff0
  • YOLOv5图像分割中的NMS处理

    在上一篇文章YOLOv5图像分割 SegmentationModel类代码详解有讲到图像经过YOLOv5网络后得到的输出形式 xff0c 主要是调用了BaseModel类下的forward得到的输出 xff0c 输出的shape为 batc
  • YOLO之trt推理+Diou/iou目标跟踪以及计数【附代码】

    本篇文章是对之前YOLOv4 tensorrt推理项目的更新 xff0c 在trt推理 xff0c 多进程语音报警的功能中又新添加了目标跟踪 可用于目标计数 采用IOU进行跟踪 也可以选用DIOU yolov4 43 deepsort可以参