竞赛项目 深度学习的视频多目标跟踪实现
文章目录
- 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逆向篇 先看报文:请求和响应都是全加密,这种情况就不像参数加密可以方便全文搜索定位加密代码,但因为前端必须解密响应的密文,因此万能的方法就是搜索拦截器,…...
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.…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
