【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5+Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5+Deepsort中所用到的目标检测,追踪及sort&Deppsort算法。本文中用到的数据集均为自采,实验动物为斑马鱼。文尾附Deepsort原论文。

💬源码如下:

GitHub - mikel-brostrom/yolo_tracking: A collection of SOTA real-time, multi-object tracking algorithms for object detectors

GitHub - Sharpiless/Yolov5-Deepsort: 最新版本yolov5+deepsort目标检测和追踪,能够显示目标类别,支持5.0版本可训练自己数据集

目录

Ⅰ简述目标检测

0x00 什么是目标检测

0x01 一般步骤

0x02 常用算法

Ⅱ 简述目标追踪

0x00 什么是目标追踪

0x01 一般步骤

0x02 常用算法

Ⅲ sort算法

0x00 卡尔曼滤波

0x01 匈牙利算法

Ⅳ Deepsort

0x00 算法的一般流程


Ⅰ简述目标检测

0x00 什么是目标检测

目标检测是计算机视觉领域的一个重要任务,它旨在识别图像或视频中的特定对象,并通过在目标周围绘制边界框(bounding box)来标记它们的位置。

这种技术在许多实际应用中都有广泛的应用,如自动驾驶、安防监控、智能交通、人脸识别、工业质检等。

0x01 一般步骤

1. 输入图像:

  • 首先,目标检测算法会接收一个输入图像或视频帧。

2. 特征提取

  • 然后,算法会通过卷积神经网络(CNN)等方法对图像进行特征提取。这些特征可以是边缘、纹理、颜色等图像的局部或全局特征。

3. 候选区域生成

  • 接下来,目标检测算法会根据特征图选择一些可能包含目标的候选区域,通常称为区域提议(Region Proposals)。常用的方法包括Selective Search、R-CNN等。

4. 目标分类与定位:

  • 在得到候选区域后,算法会对每个区域进行目标分类和边界框的回归。目标分类是指确定区域中是否包含目标(如车、人、动物等),而边界框回归则是调整候选框的位置和大小以更准确地围绕目标。

5. 后处理:

  • 最后,算法会进行一些后处理步骤,例如非极大值抑制(NMS),以剔除重叠的边界框并保留最可信的检测结果。

目标检测有许多不同的算法和架构,其中一些著名的方法包括Faster R-CNN、YOLO、SSD(SINGLE SHOT MULTIBOX DETECTOR)、RetinaNet等。每种方法都有其优缺点和适用场景,取决于应用需求和计算资源。

0x02 常用算法

RCNN系列:

  • RCNN(Region-based Convolutional Neural Networks): 首先通过选择性搜索(Selective Search)算法提取候选区域,然后对每个候选区域进行卷积神经网络(CNN)特征提取和目标分类。

  • Fast R-CNN: 在RCNN的基础上引入ROI池化(ROI Pooling)层,使得特征提取更高效。

  • Faster R-CNN: 引入RPN(Region Proposal Network),将候选区域的提取和目标分类合并为一个端到端的网络,大大加快了检测速度。

YOLO系列

  • YOLOv1:将目标检测看作回归问题,通过一个CNN直接预测目标的边界框和类别概率。
  • YOLOv2 / YOLO9000:在YOLOv1基础上改进,引入Darknet-19网络和多尺度预测,提高检测精度。YOLO9000是在YOLOv2的基础上通过联合训练多个数据集实现了多标签分类和检测。
  • YOLOv3:进一步改进YOLOv2,采用更深的Darknet-53网络和FPN,提高小目标检测性能。

SSD(Single Shot Multibox Detector):一种单阶段目标检测算法,通过在不同尺度的特征图上预测边界框和类别概率来实现目标检测。

RetinaNet:结合了Focal Loss和FPN,用于解决目标检测中类别不平衡问题,提高了检测性能。 

EfficientDet:高效的目标检测算法,通过改进网络结构和优化目标函数,实现高精度和高效率的目标检测。

Ⅱ 简述目标追踪

0x00 什么是目标追踪

目标追踪是计算机视觉领域的一项任务,旨在从视频序列中连续地跟踪特定目标的运动轨迹。与目标检测不同,目标追踪要在时间上保持目标的一致性,而不仅仅是在单个图像中检测目标的存在。

0x01 一般步骤

1. 目标初始化: 首先,目标追踪算法会在视频序列的第一帧中检测和识别目标,并为目标分配唯一的ID。这个过程称为目标初始化。

2. 目标预测: 在之后的视频帧中,目标追踪算法会使用目标在上一帧中的位置和运动信息,对目标在当前帧的位置进行预测。通常,预测可以基于一些简单的运动模型或者基于目标的历史运动轨迹。

3. 目标更新: 接下来,算法会使用目标检测或特征匹配等技术来确定当前帧中目标的准确位置。这个过程可以使用像素级的区域匹配、相关滤波器、深度学习特征提取等方法。

4. 目标关联: 一旦目标在当前帧中被确定,算法需要将其与之前帧中的目标进行关联,以保持目标的一致性。这可能涉及到目标ID的跟踪,确保目标的唯一标识在整个视频序列中保持一致。

5. 后处理: 最后,目标追踪算法会进行一些后处理步骤,例如滤波或者平滑处理,以减少噪声或者不稳定性,并提高追踪的准确性和稳定性。

目标追踪在许多实际应用中都有广泛的应用,例如视频监控、自动驾驶、视频分析、虚拟现实等。

0x02 常用算法

卡尔曼滤波器(Kalman Filter): 卡尔曼滤波是一种递归的状态估计算法,通常用于目标运动预测和位置估计。它结合了观测数据和系统动力学模型,对目标的状态进行预测和更新。

粒子滤波器(Particle Filter): 粒子滤波是一种蒙特卡洛方法,它使用一组随机粒子来估计目标的状态。粒子滤波在非线性系统和非高斯噪声下表现较好。

单目标跟踪器:

  • MedianFlow: 基于KLT(Kanade-Lucas-Tomasi)光流和匹配的简单单目标跟踪器。
  • KCF(Kernelized Correlation Filters): 使用核相关滤波器来实现快速的单目标跟踪。
  • TLD(Tracking-Learning-Detection): 结合目标检测和跟踪,能够在目标丢失时重新检测目标。
  • MIL(Multi Instance Learning): 采用多实例学习方法跟踪目标。

多目标跟踪器:

  • SORT(Simple Online and Real Time Tracking): 在多目标跟踪中,通过卡尔曼滤波和匈牙利算法进行目标关联。
  • DeepSORT: 在SORT的基础上加入深度学习特征,提高目标关联的准确性和鲁棒性。
  • IOU Tracker: 使用目标边界框的IoU(Intersection over Union)来进行目标关联的简单方法。

深度学习方法:

  • Siamese网络: 使用孪生网络进行目标匹配,常用于目标跟踪任务。
  • SiamRPN、SiamFC、SiamMask: 基于Siam网络的不同变种,用于目标跟踪和目标分割。

在线学习方法:

  • 在线提升: 在线增强学习器,不断地更新模型来适应目标外观的变化。
  • Online SVM(Support Vector Machine): 在线学习SVM,用于目标分类和跟踪。

Ⅲ sort算法

SORT(Simple Online and Realtime Tracking)是一种用于多目标跟踪的简单而有效的算法,它在实时场景下能够进行在线目标追踪。

SORT算法基于卡尔曼滤波匈牙利算法的多目标跟踪器。

0x00 卡尔曼滤波

卡尔曼滤波是一种递归状态估计算法,主要用于估计目标在时间上的运动状态,例如位置和速度。

  • 在SORT算法中,卡尔曼滤波的作用是用于对目标的状态进行预测和更新
  • 在目标追踪过程中,卡尔曼滤波能够对目标的运动轨迹进行预测,并根据实际的检测结果对目标状态进行更新。

卡尔曼滤波的作用可分为两个主要方面:

1.目标预测

  • 在目标追踪过程中,目标在每一帧中都会进行位置预测。卡尔曼滤波通过使用之前帧中的目标状态和运动信息,预测目标在下一帧中的位置和速度。这样能够使得目标跟踪器对目标的未来位置有一个较好的估计。

2.状态更新

  • 在进行目标关联时,SORT算法会使用匈牙利算法将当前帧的检测结果与之前帧中的目标进行关联。关联的结果可能会包含一些噪声或误匹配,而卡尔曼滤波可以在一定程度上消除这些误差。通过将检测结果与卡尔曼滤波预测的状态进行融合,得到目标的最终位置和速度,并对目标状态进行更新。

0x01 匈牙利算法

匈牙利算法是用于解决二分图最优匹配问题的经典算法,它能够在多个候选匹配中找到最佳的匹配组合,以最小化总匹配成本。  

  • 在SORT算法中,匈牙利算法的作用是将当前帧的目标检测结果与之前帧中的跟踪目标进行关联,以确定目标在连续帧中的唯一ID。

SORT中的匈牙利算法的具体作用如下:

1.目标关联

  • 在每一帧中,进行目标检测,得到新的目标边界框。同时,之前帧中的每个已跟踪目标也有一个预测位置。
  • SORT算法会使用匈牙利算法,将当前帧的检测结果与之前帧中的目标进行关联。将目标检测与预测的目标进行匹配,得到最佳的匹配组合。

2.成本计算

  • 匈牙利算法会计算目标检测与预测目标之间的成本,成本通常由目标边界框之间的IoU(Intersection over Union)计算得出。IoU度量了两个边界框的重叠程度,可以用来评估目标检测与预测目标的相似程度。

3.最优匹配

  • 匈牙利算法的目标是找到一种最佳匹配,使得总成本最小。通过最小化目标检测与预测目标之间的成本,找到最佳的匹配组合,确定目标在连续帧中的唯一ID。

4.目标ID更新

  • 在完成匈牙利算法后,已跟踪目标的ID会随着匹配的结果进行更新。如果一个目标检测与之前的某个目标匹配,该目标将被赋予相应的ID,从而在多个连续帧中保持一致的跟踪。

🚩简单来说:

在sort算法中,

卡尔曼滤波的主要作用是利用当前时刻的运动变量来预测下一时刻的运动变量,同时第一次的检测结果用于初始化卡尔曼滤波的运动状态

匈牙利算法主要作用是将一组检测框和卡尔曼预测的框进行匹配,以找到卡尔曼预测的框与其最匹配的检测框,从而实现目标的追踪

Ⅳ Deepsort算法

DeepSORT(Deep Learning-based SORT)是基于深度学习的多目标跟踪算法,是SORT的改进版。

0x00 算法的一般流程

1.目标检测

  • 在每一帧中,使用目标检测算法(如YOLO、Faster R-CNN、SSD等)来检测图像中的目标,并得到目标的边界框(bounding box)和类别信息。

2.深度特征提取

  • 对于每个检测到的目标,使用预训练的深度学习模型(如ResNet、MobileNet等)来提取目标区域的特征向量。这些特征向量能够表示目标的语义信息和视觉特征。

3.目标关联

  • 利用匈牙利算法将当前帧的检测结果与之前帧中的跟踪目标进行关联。匈牙利算法通过最小化匹配的总成本来找到最佳的匹配,成本通常由目标检测与预测目标之间的外观相似性和运动一致性计算得出。

4.卡尔曼滤波预测

  • 对于每个已跟踪的目标,使用卡尔曼滤波来预测其下一帧的位置。卡尔曼滤波利用目标的历史运动信息和观测数据,预测目标在下一帧中的位置和速度。

5.特征匹配

  • 将当前帧的检测结果与之前帧中的跟踪目标进行特征匹配。采用余弦相似度或欧氏距离等度量方法,比较特征向量之间的相似性。

6.外观相似性分数计算

  • 计算目标检测结果与跟踪目标之间的外观相似性分数。综合考虑特征匹配和运动一致性,为每个匹配组合分配相似性分数。

7.最终关联

  • 根据外观相似性分数,选择最佳的目标关联组合。这样能够确定目标在连续帧中的唯一ID,实现多目标的连续跟踪。

8.卡尔曼滤波更新

  • 对于成功匹配的目标,使用卡尔曼滤波来更新其状态。通过融合检测结果和卡尔曼滤波预测的信息,得到目标的最终位置和速度,并对目标状态进行更新。

9.状态估计不确定性更新

  • 根据卡尔曼滤波的结果,更新目标的状态估计不确定性。这样可以根据目标的可信度来调整匹配的权重。

10.目标确认和删除

  • 对于一些没有成功匹配到检测结果的目标,或者匹配结果置信度较低的目标,进行确认和删除操作。可以根据跟踪器的置信度阈值来决定是否保留目标。

11.轨迹维护

  • 对于成功匹配的目标,更新目标的运动轨迹。

12.重复

  • 对于下一帧,重复上述过程,进行目标检测、特征提取、目标关联、更新等操作。

END


📝因为作者的能力有限,所以文章可能会存在一些错误和不准确之处,恳请大家指出!

 📃参考文献:

[1] Simple Online and Realtime Tracking with a Deep Association Metric

[1703.07402] Simple Online and Realtime Tracking with a Deep Association Metric (arxiv.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table 去掉边框(修改颜色)

原始&#xff1a; 去掉表格的border属性&#xff0c;每一行下面还会有一条线&#xff0c;并且不能再拖拽表头 为了满足在隐藏表格边框的情况下还能拖动表头&#xff0c;修改相关css即可&#xff0c;如下代码 <style lang"less"> .table {//避免单元格之间出现白…

UI自动化测试之Jenkins配置

背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中…

Spring5.2.x 源码使用Gradle成功构建

一 前置准备 1 Spring5.2.x下载 1.1 Spring5.2.x Git下载地址 https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2 Spring5.2.x zip源码包下载&#xff0c;解压后倒入idea https://gitcode.net/mirrors/spring-projects/spring-framework/-/…

【NLP概念源和流】 05-引进LSTM网络(第 5/20 部分)

一、说明 在上一篇博客中,我们讨论了原版RNN架构,也讨论了它的局限性。梯度消失是一个非常重要的缺点,它限制了RNN对较短序列的建模。香草 RNN 在相关输入事件和目标信号之间存在超过 5-10 个离散时间步长的时间滞时无法学习。这基本上限制了香草RNN在许多实际问题上的应用,…

数学知识(三)

一、容斥原理 #include<iostream> #include<algorithm>using namespace std;const int N 20;typedef long long LL; int n,m; int p[N];int main() {cin>>n>>m;for(int i 0;i < m;i ) cin>>p[i];int res 0;//从1枚举到2^m(位运算)for(int …

【C++】开源:事件驱动网络库libevent配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

Dockerfile构建Tomcat镜像(源码)

Dockerfile构建Tomcat镜像 目录 Dockerfile构建Tomcat镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; 1、建立工作目录 [roothuyang1 ~]# mkdir tomcat[roothuyang1 ~]# cd tomcat/[roothuyang1 tomcat]# lsapach…

【Python】基础数据结构:列表——元组——字典——集合

文章目录 一、简述二、Python中的列表详解2.1 创建列表2.2 访问列表元素2.3 修改列表元素2.4 列表切片2.5 列表方法2.6 列表推导式 三、Python中的元组详解3.1 创建元组3.2 访问元组元素3.3 元组是不可变的3.4 元组切片3.5 元组方法 四、Python中的字典详解4.1 创建字典4.2 访问…

华为HarmonyOS NEXT初体验,打造纯血鸿蒙指日可待,适配百款应用

在2023年的华为开发者大会&#xff08;HDC.Together&#xff09;&#xff0c;华为推出了面向开发者的HarmonyOS NEXT开发者预览版&#xff0c;此外还有面向消费者的HarmonyOS 4。华为宣布&#xff0c;HarmonyOS NEXT已开放给合作企业开发者&#xff0c;计划在2024年第一季度对所…

多线程篇-线程安全-原子性、可见性、有序性解析

多线程篇-线程安全-原子性、可见性、有序性解析 在程序中使用多线程的目的是什么&#xff1f; 1、提高效率&#xff0c;增加任务的吞吐量 2、提升CPU等资源的利用率&#xff0c;减少CPU的空转 多线程的应用在日常开发中很多&#xff0c;带来了很多的便利&#xff0c;让我们以前…

图像快速傅里叶变换的工业应用案例简介:图像自相关,背景纹理去除,旋转矫正,划痕检测

快速傅里叶变换是非常重要的数学分析工具&#xff0c;同时也是一种非常重要的信号处理方法。 下面借助Halcon商业图像处理库&#xff0c;介绍些工业应用案例&#xff0c;我们可以通过案例理解图像快速傅里叶变换的一些应用场景。 案例1&#xff1a;图像自相关性确定芯片间距 …

体育赛事管理系统的设计与实现(源码+论文)_kaic

摘要 许多年以前&#xff0c;人们在对数据进行统计和记录时候&#xff0c;使用的是纸和笔&#xff0c;对于大量数据的记录很不方便&#xff0c;使用的人力物力也很庞大&#xff0c;到了现在&#xff0c;人们对纸和笔的依赖慢慢降低&#xff0c;在如今的互联网时代&#xff0c;…

python爬虫1:基础知识

python爬虫1&#xff1a;基础知识 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 目录结构 文章目录 python爬虫1&#xff1a;基础知识1. 基础认知1.1 什么是爬虫&…

3.CNI网络

文章目录 CNI网络FlannelUDP模式VXLAN模式部署flannel CalicoCalico模式Calico部署 flannel 和 calico 区别 CNI网络 K8S 中 Pod 网络通信&#xff1a; Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命…

Redis内网主从节点搭建

Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…

【HDFS】每天一个RPC系列----complete(二):客户端侧

上图给出了最终会调用到complete RPC的客户端侧方法链路(除去Router那条线了)。 org.apache.hadoop.hdfs.DFSOutputStream#completeFile(org.apache.hadoop.hdfs.protocol.ExtendedBlock): 下面这个方法在complete rpc返回true之前,会进行重试,直到超过最大重试次数抛异…

ChatGPT下架官方检测工具,承认无法鉴别AI内容

去年底&#xff0c;OpenAI 推出的 ChatGPT &#xff0c;带来了生成式人工智能涌现的热潮。它不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动。 但随之而来的争议也让人…

Service not registered 异常导致手机重启分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Service not registered 异常导致手机重启二、Service not registered 解决方案 一、Service not registered 异常导致手机重启 1.重启 的部分Log如…

ruby调试

如果下载 ruby-debug-ide gem install ruby-debug-ide vscode 下载 ruby扩展 1&#xff0c; ruby 2&#xff0c;修改launch.json

Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结

近日&#xff0c;Zebec Protocol 创始人 Sam 作为嘉宾&#xff0c;与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读&#xff0c;并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…