当前位置: 首页 > news >正文

竞赛项目 深度学习的视频多目标跟踪实现

文章目录

  • 1 前言
  • 2 先上成果
  • 3 多目标跟踪的两种方法
    • 3.1 方法1
    • 3.2 方法2
  • 4 Tracking By Detecting的跟踪过程
    • 4.1 存在的问题
    • 4.2 基于轨迹预测的跟踪方式
  • 5 训练代码
  • 6 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

基于深度学习的视频多目标跟踪实现

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 先上成果

在这里插入图片描述

3 多目标跟踪的两种方法

3.1 方法1

基于初始化帧的跟踪,在视频第一帧中选择你的目标,之后交给跟踪算法去实现目标的跟踪。这种方式基本上只能跟踪你第一帧选中的目标,如果后续帧中出现了新的物体目标,算法是跟踪不到的。这种方式的优点是速度相对较快。缺点很明显,不能跟踪新出现的目标。

3.2 方法2

基于目标检测的跟踪,在视频每帧中先检测出来所有感兴趣的目标物体,然后将其与前一帧中检测出来的目标进行关联来实现跟踪的效果。这种方式的优点是可以在整个视频中跟踪随时出现的新目标,当然这种方式要求你前提得有一个好的“目标检测”算法。

学长主要分享Option2的实现原理,也就是Tracking By Detecting的跟踪方式。

4 Tracking By Detecting的跟踪过程

**Step1:**使用目标检测算法将每帧中感兴趣的目标检测出来,得到对应的(位置坐标, 分类, 可信度),假设检测到的目标数量为M;

**Step2:**通过某种方式将Step1中的检测结果与上一帧中的检测目标(假设上一帧检测目标数量为N)一一关联起来。换句话说,就是在M*N个Pair中找出最像似的Pair。

对于Step2中的“某种方式”,其实有多种方式可以实现目标的关联,比如常见的计算两帧中两个目标之间的欧几里得距离(平面两点之间的直线距离),距离最短就认为是同一个目标,然后通过匈牙利算法找出最匹配的Pair。当让,你还可以加上其他的判断条件,比如我用到的IOU,计算两个目标Box(位置大小方框)的交并比,该值越接近1就代表是同一个目标。还有其他的比如判断两个目标的外观是否相似,这就需要用到一种外观模型去做比较了,可能耗时更长。

在关联的过程中,会出现三种情况:

1)在上一帧中的N个目标中找到了本次检测到的目标,说明正常跟踪到了;

2)在上一帧中的N个目标中没有找到本次检测到的目标,说明这个目标是这一帧中新出现的,所以我们需要把它记录下来,用于下下一次的跟踪关联;

3)在上一帧中存在某个目标,这一帧中并没有与之关联的目标,那么说明该目标可能从视野中消失了,我们需要将其移除。(注意这里的可能,因为有可能由于检测误差,在这一帧中该目标并没有被检测到)

在这里插入图片描述

4.1 存在的问题

上面提到的跟踪方法在正常情况下都能够很好的工作,但是如果视频中目标运动得很快,前后两帧中同一个目标运动的距离很远,那么这种跟踪方式就会出现问题。

在这里插入图片描述
如上图,实线框表示目标在第一帧的位置,虚线框表示目标在第二帧的位置。当目标运行速度比较慢的时候,通过之前的跟踪方式可以很准确的关联(A, A’)和(B,
B’)。但是当目标运行速度很快(或者隔帧检测)时,在第二帧中,A就会运动到第一帧中B的位置,而B则运动到其他位置。这个时候使用上面的关联方法就会得到错误的结果。

那么怎样才能更加准确地进行跟踪呢?

4.2 基于轨迹预测的跟踪方式

既然通过第二帧的位置与第一帧的位置进行对比关联会出现误差,那么我们可以想办法在对比之前,先预测目标的下一帧会出现的位置,然后与该预测的位置来进行对比关联。这样的话,只要预测足够精确,那么几乎不会出现前面提到的由于速度太快而存在的误差

在这里插入图片描述

如上图,我们在对比关联之前,先预测出A和B在下一帧中的位置,然后再使用实际的检测位置与预测的位置进行对比关联,可以完美地解决上面提到的问题。理论上,不管目标速度多么快,都能关联上。那么问题来了,怎么预测目标在下一帧的位置?

方法有很多,可以使用卡尔曼滤波来根据目标前面几帧的轨迹来预测它下一帧的位置,还可以使用自己拟合出来的函数来预测下一帧的位置。实际过程中,我是使用拟合函数来预测目标在下一帧中的位置。

在这里插入图片描述
如上图,通过前面6帧的位置,我可以拟合出来一条(T->XY)的曲线(注意不是图中的直线),然后预测目标在T+1帧的位置。具体实现很简单,Python中的numpy库中有类似功能的方法。

5 训练代码

这里记录一下训练代码,来日更新

 if FLAGS.mode == 'eager_tf':# Eager mode is great for debugging# Non eager graph mode is recommended for real trainingavg_loss = tf.keras.metrics.Mean('loss', dtype=tf.float32)avg_val_loss = tf.keras.metrics.Mean('val_loss', dtype=tf.float32)for epoch in range(1, FLAGS.epochs + 1):for batch, (images, labels) in enumerate(train_dataset):with tf.GradientTape() as tape:outputs = model(images, training=True)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_lossgrads = tape.gradient(total_loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))logging.info("{}_train_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_loss.update_state(total_loss)for batch, (images, labels) in enumerate(val_dataset):outputs = model(images)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_losslogging.info("{}_val_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_val_loss.update_state(total_loss)logging.info("{}, train: {}, val: {}".format(epoch,avg_loss.result().numpy(),avg_val_loss.result().numpy()))avg_loss.reset_states()avg_val_loss.reset_states()model.save_weights('checkpoints/yolov3_train_{}.tf'.format(epoch))

6 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

相关文章:

竞赛项目 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …...

如何避免用waveformRecord复制数组

这里描述如何使用数组字段内存管理特定。这使得数组数据能够被移入和移出waveform,aai和aao类型的值字段(BPTR)。 使用这种特定包括用另一个(用户分配的)字段替代存储在BPTR字段的指针。基本规则是: 1、BPTR以及它当前指向的内存,只能在这个…...

RocketMQ 延迟消息

RocketMQ 延迟消息 RocketMQ 消费者启动流程 什么是延迟消息 RocketMQ 延迟消息是指,生产者发送消息给消费者消息,消费者需要等待一段时间后才能消费到。 使用场景 用户下单之后,15分钟未支付,对支付账单进行提醒或者关单处理…...

Dex文件混淆(一):BlackObfuscator

Dex文件混淆(一):BlackObfuscator 首发地址:http://zhuoyue360.com/crack/105.html 文章目录 Dex文件混淆(一):BlackObfuscator1. 前言2.小试牛刀3. 参考学习1. dex2jar源码简析2. BlackObfuscator简析1. 控制流平坦化1. 控制流平坦化基本介绍 2. Dex解析…...

Linux下编译arm 32 出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

一、arm-none-linux-gnueabi-gcc不能再64位系统下下编译ARM的32位库的问题解决方法如下: sudo apt-get install lib32stdc6 sudo apt-get install lib32ncurses5 sudo apt-get install lib32z1 二、交叉编译工具没有写入环境变量或写错,重新写入环境变量…...

最近遇到的两个小问题总结:git问题和node问题

这两个问题都是我帮别人看问题的解决的,在windows系统上遇到的: 1、git没有配置全局变量 在使用git的时候,报’git‘不是内部或外部命令,也不是可运行的程序。然后再在其他文件下面试一下(git --version)…...

Java # Spring(1)

一、概念 1、核心技术:依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。 2、测试:模…...

SCL更换阿里数据源

问题: zabbix安装前端环境报错 yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/ 能上网 但是不能ping通http://mirrorlist.centos.org/ 解决: 修改repo数…...

【web逆向】全报文加密流量的去加密测试方案

aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文:请求和响应都是全加密,这种情况就不像参数加密可以方便全文搜索定位加密代码,但因为前端必须解密响应的密文,因此万能的方法就是搜索拦截器&#xff0c…...

Django实现音乐网站 ⑼

使用Python Django框架制作一个音乐网站, 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保…...

【脚踢数据结构】

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…...

uni-app使用vue语法进行开发注意事项

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用(类似)小程序 语法/结构 使用vue 具体项目目录如下: 生命…...

数据结构---B树

目录标题 B-树的由来B-树的规则和原理B-树的插入分析B-树的插入实现准备工作find函数insert中序遍历 B-树的性能测试B-树的删除B树B树的元素插入B*树的介绍 B-树的由来 在前面的学习过程中,我们见过很多搜索结构比比如说顺序查找,二分查找,搜…...

c++11以后c++标准库定义的固定位宽的整数类型(Fixed width integer types)

Fixed width integer types Fixed width integer types (since C11) - cppreference.com 相关定义文件如下: Windows系统MSVC: Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\cstdint Linux系统GCC: gcc\libstdc-v3\include\c_g…...

Object.values()

Object.values() 是ES2017新增的一个对象方法,它可以将一个对象自身的所有可枚举属性值,组成一个数组返回。 基本语法: Object.values(obj)示例: jsCopy codeconst obj {foo: bar,baz: 42 };Object.values(obj); // [bar, 42]Object.values()的特点: 只返回可枚举的属性值…...

Oracle 开发篇+Java调用OJDBC访问Oracle数据库

标签:JAVA语言、Oracle数据库、Java访问Oracle数据库释义:OJDBC是Oracle公司提供的Java数据库连接驱动程序 ★ 实验环境 ※ Oracle 19c ※ OJDBC8 ※ JDK 8 ★ Java代码案例 package PAC_001; import java.sql.Connection; import java.sql.ResultSet…...

linux 查询后台任务及杀掉进程

查看后台任务命令 jobs -l删除后台进程命令 kill -9 28719...

【Vue3 博物馆管理系统】使用Vue3、Element-plus菜单组件构建前台用户菜单

系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 [第三章 使用Vue3、Element-plus菜单组件构建轮播图] [第四章 使用Vue3、Element-plus菜单组件构建组图文章] 文章目…...

Windows 11清除无效、回收站、过期、缓存、补丁更新文件

Windows 11与之前的Windows版本类似,也需要定期清理无效、垃圾、过期、缓存文件来保持系统性能和存储空间的优化。以下是在Windows 11中进行这些清理操作的一些建议方法: 磁盘清理工具 Windows 11内置了磁盘清理工具,可以帮助你删除临时文件…...

栈和队列详解(2)

目录 一、什么是队列? 二、创建一个我们自己的队列 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化队列 2.2入队 2.3队列元素个数和判空 2.4取队头元素和队尾元素 2.5出队 2.6摧毁队列 2.7测试接口 三、所有代码 1.…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...