Yolov5-Lite + Sort算法实现边缘目标跟踪

article/2025/8/20 6:49:41

文章目录

  • 前言
  • 项目结构
  • Sort算法实现
    • 卡尔曼跟踪器
    • 工具类
    • 多目标跟踪器
  • 整合

前言

昨天挖了个坑,那么今天的话把坑填上,只要是实现Sort算法和Yolov5-Lite的一个整合。当然先前的话,我们在Yolov3–Tiny的时候,也做了一个,不过当时的话,有几个问题没有解决。第一就是当时以中心点进行预测的,这样做的结果就是如果目标框的波动比较大的话,影响会很大,同时,当时设计是为了应对直线旋转平移这样的运动进行捕捉。所以效果比较差。同时就是对于目标点的匹配不合理。那就是,我是按照,当预测点和识别点进行距离计算,计算当前点的最小距离。在同一个类别之下,但是这里有个问题,就是,假设有一个的A,和点B,C,由于B点先进行计算,那么假设A,B匹配了,当C进来的时候,由于C可能和A点的距离更小,但是由于B,A已经匹配导致C没有和A匹配。那么这样一来明明C是最合适A的,但是由于B先来,导致A和B先匹配了(淦,有点像极了人生)

所以,这里的话,还是要引入匈牙利算法,当然这个算法的话,在先前的算法刷题专栏当中已经说过了,那么这里就不重复了,其实就是简单的应用。

项目结构

这里先说一下,这个项目的基本原理还是类似的:
在这里插入图片描述
只是,现在匹配我们换成了匈牙利算法。
在这里插入图片描述

Sort算法实现

那么,在这里的话,我们先来实现Sort算法。本来是打算嫖个开源的做整合的,但是没想到,他们的代码有很多问题,改别人的bug,还不如自己手写,所以的话,这里的话,我自己手写了一个Sort算法。这里注意的是,Sort算法只是一个匹配算法,通过IOU,和卡尔曼滤波做预测,来匹配当前的跟踪器和新产生的目标框是不是同一个目标。如果你的目标识别算法不准确的话,也就是目标框不稳定,会不断生成新的目标框,那么你的Sort算法就会不断认为这是新的目标的。解决办法的话,可以考虑使用deepsort。 但是的话,我们这里是边缘设备,如果没有deepsort-lite的话实在是不好搞。而且,比如一些简单场景,比如车流量检查,行人检测啥的,机位固定倒也用不上。

卡尔曼跟踪器

那么首先,在这里要实现的就是卡尔曼跟踪器。
这里的话,原理就不扯了,我这里都提到好几次了。

import numpy as np
from filterpy.kalman import KalmanFilter
import cv2
from sort.utils import convert_bbox_to_z, convert_x_to_bbox
np.random.seed(0)@DeprecationWarning
class ObjectTrackerKF:"""这个滤波是只跟踪中心点坐标,不过,还是会还原为[x1,y1,x2,y2]的"""def __init__(self,bbox, dt=1, sigma=10):# 每次创建新的kalman滤波器时,计数ID都会加1self.id = 0self.hit_streak = 0self.bbox = bbox# 自上次未匹配成功,经过的帧数self.time_since_update = 0# 自上次未匹配成功,连续成功匹配的帧数self.hit_streak = 0self.dt = dtx_init, y_init = (bbox[0]+bbox[2])/2 ,(bbox[1]+bbox[3])/2# 状态向量,包含位置和速度信息self.state = np.array([[x_init], [y_init], [0], [0]], np.float32)# 系统矩阵,将状态向量映射为下一时刻的状态向量self.A = np.array([[1, 0, self.dt, 0],[0, 1, 0, self.dt],[0, 0, 1, 0],[0, 0, 0, 1]], np.float32)# 测量矩阵,将状态向量映射为测量向量self.H = np.array([[1, 0, 0, 0],[0, 1, 0, 0]], np.float32)# 过程噪声,表示模型中未考虑的外部因素产生的偏差self.Q = np.array([[self.dt ** 4 / 4, 0, self.dt ** 3 / 2, 0],[0, self.dt ** 4 / 4, 0, self.dt ** 3 / 2],[self.dt ** 3 / 2, 0, self.dt ** 2, 0],[0, 0, 0, self.dt ** 2]], np.float32) * sigma ** 2# 测量噪声,表示测量器的误差self.R = np.array([[1, 0],[0, 1]], np.float32) * sigma ** 2# 卡尔曼滤波器初始化self.kf = cv2.KalmanFilter(4, 2, 0)self.kf.statePost = self.stateself.kf.transitionMatrix = self.Aself.kf.measurementMatrix = self.Hself.kf.processNoiseCov = self.Qself.kf.measurementNoiseCov = self.Rdef predict(self):self.state = self.kf.predict()t = self.state[:2].reshape(-1)t = list(t)w = self.bbox[2] - self.bbox[0]h = self.bbox[3] - self.bbox[1]box = [(t[0]-w/2),t[1]-h/2,t[0]+w/2,t[1]+h/2,self.bbox[4]]self.bbox = boxif self.time_since_update > 0:self.hit_streak = 0return self.bboxdef update(self,bbox):x, y = (bbox[0]+bbox[2])/2 ,(bbox[1]+bbox[3])/2self.time_since_update = 0# 表示连续匹配成功的次数加一if(self.hit_streak<=30):self.hit_streak+=1self.kf.correct(np.array([[x], [y]], np.float32))return self.state[:2].reshape(-1)class KalmanBoxTracker(object):# 利用bounding box初始化Kalman滤波轨迹def __init__(self, bbox):self.id = 0#注意这里的bboxs是[x1,y1,x2,y2,conf]是list类型self.bbox = bbox# 定义恒定速度模型,7个状态变量和4个观测输入self.kf = KalmanFilter(dim_x=7, dim_z=4)# 状态向量 X = [检测框中心的横坐标,检测框中心的纵坐标,检测框的面积,长宽比,横坐标速度,纵坐标速度,面积速度]# SORT假设一个物体在不同帧中检测框的长宽比不变,是个常数,所以速度变化只考虑横坐标、横坐标、检测框面积self.kf.F = np.array([[1, 0, 0, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1, 0],[0, 0, 1, 0, 0, 0, 1],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1]])self.kf.H = np.array([[1, 0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0]])# R是测量噪声的协方差矩阵,即真实值与测量值差的协方差# R = diagonal([1, 1, 10, 10])self.kf.R[2:, 2:] *= 10.# [[ 1.  0.  0.  0.]#  [ 0.  1.  0.  0.]#  [ 0.  0. 10.  0.]#  [ 0.  0.  0. 10.]]# P是先验估计的协方差,对不可观测的初始速度,给予高度不确定性# P = diagonal([10,10,10,10,1000,1000,1000])self.kf.P[4:, 4:] *= 1000.self.kf.P *= 10.# [[   10.     0.     0.     0.     0.     0.     0.]#  [    0.    10.     0.     0.     0.     0.     0.]#  [    0.     0.    10.     0.     0.     0.     0.]#  [    0.     0.     0.    10.     0.     0.     0.]#  [    0.     0.     0.     0. 10000.     0.     0.]#  [    0.     0.     0.     0.     0. 10000.     0.]#  [    0.     0.     0.     0.     0.     0. 10000.]]# Q是系统状态变换误差的协方差# Q = diagonal([1, 1, 1, 1, 0.01, 0.01, 0.0001])self.kf.Q[

http://chatgpt.dhexx.cn/article/qtAhKRhO.shtml

相关文章

如何用剪映翻译英文字幕?

需要借助第三方工具。 这次是小编在上个版本的基础上进行升级&#xff0c;支持并兼容剪映最新版本3.3。 之前小编方包的那款只支持2.3.0以下的。这次剪映pc端所有版本都兼容。可以翻译国外的英文的视频&#xff01;比如&#xff1a;tik~、某管的视频~ 工具如下图 使用教程&am…

英文字幕视频翻译成中文字幕

参考 教程 https://www.bilibili.com/read/cv2223816/ https://www.bilibili.com/video/av34725774 1、下载英文视频 例如下面这个视频 QGIS提取DSM数据中房屋的屋顶类型和高度 2、导出英文字幕并重命名为bcc格式 参考 https://www.bilibili.com/read/cv2223816/ 3、bcc格…

不限网站的视频字幕实时翻译工具(视频只要有声音就可以翻译)

一个实时中英互译的软件 问题 经常在网上搜索一些我们需要的学习资源&#xff0c;会遇到一些非常好的视频资源&#xff0c;可惜是英文的&#xff0c;这时&#xff0c;像我这样英文不是很好的同学就该犯难了。再找别的资源会很麻烦。 像有一些网站会自带自动字母和自动翻译功…

python自动翻译视频字幕_音视频自动字幕生成(翻译)—[autosub]

国外有些视频无中文字幕找字幕也不方便 此工具可生成*.srt格式字幕和json autosub依赖ffmpeg 安装环境:VUlTR Ubuntu 18.04系统 地域:日本 充值10刀送10刀 安装ffmpeg [sudo] apt-get install ffmpeg 安装python [sudo] apt-get install python-pip 安装autosub pip…

体验SDL Trados 2021 翻译视频字幕

对于视频字幕翻译以往多采用的是以下几种方式&#xff1a; 直接打开翻译ASS, SRT等字幕文件 文本文件直接操作有风险可能会破坏时间轴或样式使用字幕工具&#xff0c;人人译世界&#xff0c;字幕通等第三方工具打开编辑字幕 不能使用到翻译记忆库的优势第三方工具结合SDL Trad…

工具-python实现电影字幕的自动翻译

文章目录 前言思路效果如图实现第二种方案第一种方案第一种方案 中英文翻译想白嫖中英文翻译&#xff1f;如何将ocr识别到的没有空格文本正确分割&#xff1f;python截屏 前言 看一些电影&#xff0c;发现只是标注了字幕而没有中文翻译&#xff0c;当然也没有字幕文件&#xf…

如何让纯英文字幕的视屏 实时翻译

情景&#xff1a; 你有一个视屏&#xff0c;只有英文字幕&#xff0c;恰好像我一样英文不怎么样&#xff0c;可以试着用下面的方法。当然&#xff0c;对应的翻译是机翻的&#xff0c;接受不了请忽略。 步骤&#xff1a; 需要将原视频下载下来&#xff1b;有的时候&#xff0c…

剪映PC版英文字幕翻译最新方法(中英互译)

原文地址 剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09; – 方包博客 – java|python|前端开发|运维|电商|ui设计剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09;https://www.fang1688.cn/ziyuan/3431.html 我的是剪映 v3.3.0版本。旧版不支持…

推荐一款自己开发的剪映字幕翻译工具

点击上方"优派编程"选择“加入星标”&#xff0c;第一时间关注原创干货 最新的剪映英文转中文字幕翻译工具 https://www.fang1688.cn/python/3259.html 小编方包今天介绍剪映翻译工具的教程 之前的那款剪映字幕翻译工具不是方包我本人写的。听各位神通广大的网友们反…

字幕翻译,如何合并和拆分过分断句

我时常会接到字幕翻译项目&#xff0c;大多是英到中。如果字数比较多&#xff0c;我通常会问客户能不能增加一两个小时的预算&#xff0c;原因很简单&#xff1a;过分断句(over-segmentation)对译员很不友好&#xff0c;特别是在使用CAT (computer-aided translation)的情况下…

视频字幕翻译

字幕是指以文字形式显示电视、电影、舞台作品中的对话等非影像内容&#xff0c;也泛指影视作品后期加工的文字。在电影银幕或电视机荧光屏下方出现的解说文字以及种种文字&#xff0c;如影片的片名、演职员表、唱词、对白、说明词以有人物介绍、地名和年代等都称为字幕。 近年来…

英文视频实时字幕翻译

本视频是基于livecaption这个软件&#xff08;免安装&#xff09;来实现的。软件下载地址阅读后面可见。 使用阿里云进行语音识别&#xff0c;使用腾讯云进行实时翻译。 一、阿里云 阿里云官网&#xff1a;https://www.aliyun.com/ 没有注册和实名认证的&#xff0c;请注册…

翻译视频字幕的软件叫什么?安利这几个软件给你

如今有很多小伙伴都喜欢追一些韩剧、美剧、泰剧等等外国影片&#xff0c;但是同时也会出现一个问题&#xff0c;那就是有些片段听不懂的问题&#xff0c;很多的影片其实是没有中文字幕的&#xff0c;这时候&#xff0c;很多小伙伴就会直接放弃观看了&#xff0c;其实我们只需要…

怎么把英文字幕翻译成中文?快把这些方法收好

在日常的学习工作中&#xff0c;我们偶尔会接触到一些英文文件&#xff0c;这些文件里面通常都会夹杂着一些比较深奥的词汇。小伙伴们平时遇到这些看不懂的词汇会怎么办呢&#xff1f;是一个词一个词的翻译吗&#xff1f;这样子是可以理解词的意思&#xff0c;可是要带入句子中…

使用Trinity 软件进行拼接(无参转录组)

文章背景&#xff08;此背景非彼背景&#xff09; 本文主要是对Trinity软件的背景、安装以及参数做一个详细的介绍。别问为什么没有接着做 02——转录组分析——软件下载&#xff1b;因为发现师兄留下来的数据是需要用无参转录组进行分析的。。。。内心真的毫无波澜。。。。。…

[转]魔兽世界私服Trinity,从源码开始

转自&#xff1a;http://log4think.com/setup_wow_private_server/ 缘起因由 在一个无所事事的周末下午&#xff0c;突然想起魔兽世界&#xff0c;官方的账号很久没有上了&#xff0c;里面的大小号现在连满级都不是。以前曾经搭过传奇和星际争霸战网的私服自娱自乐&#xff0c;…

分析方法升级三代测序辅助,优化无参转录组测序策略

分析方法升级&三代测序辅助&#xff0c;优化无参转录组测序策略 无参转录组拼接升级 Corset 让“基因”概念更准确 在无参转录组项目中,利用主流软件 Trinity 进行 De novo 拼接转录本, 而后选取最长的转录本作为 unigene 进行后续分析。 但是研究表明&#xff0c;完全以…

使用Trinity进行转录组组装

Trinity Trinity是Broad Institute和Hebrew University of Jerusalem开发的RNA-Seq数据 转录组组装工具&#xff0c;包括三个模块&#xff0c; Inchworn(尺蠖): 将RNA-seq数据组装成单个转录本&#xff0c;通常是主要转录亚型的全长转录本Chrysalis(蛹): 这一步将上一步得到co…

TrinityCore魔兽世界服务器-环境搭建(Debian11)

TrinityCore是模拟魔兽世界&#xff08;World of Warcraft&#xff09;的开源项目。 我这里学习搭建环境&#xff0c;基于以下&#xff1a; 客户端World of Warcraft 3.3.5(12340或13930版本)服务端TrinityCore3.3.5分支 下面是我自己用的客户端&#xff08;12340&#xff0…

魔兽世界私服Trinity,从源码开始

缘起因由 在一个无所事事的周末下午&#xff0c;突然想起魔兽世界&#xff0c;官方的账号很久没有上了&#xff0c;里面的大小号现在连满级都不是。以前曾经搭过传奇和星际争霸战网的私服自娱自乐&#xff0c;也听说过魔兽世界有开源的服务端模拟&#xff0c;既然兴致来了就小小…