NanoTrack原理与转tensorrt推理
文章目录
- 前言
- 一、NanoTrack 工作原理
- 二、运行demo与转换tensorrt模型
- 2.1 运行pt模型demo
- 2.2 转onnx模型
- 2.3 转tensorrt模型
- 2.4 运行trt模型推理
- 三、推理速度对比
- 总结
前言
NanoTrack 是一种轻量级且高效的目标跟踪算法,基于Siamese网络架构,旨在在资源受限的设备(如无人机、嵌入式系统等)上实现实时且精确的目标跟踪。随着计算机视觉领域的快速发展,传统的目标跟踪算法(如KCF等)逐渐暴露出在复杂场景中的局限性,特别是在处理目标的尺度变化、遮挡和背景复杂时,性能难以保证。
本文档将详细介绍 NanoTrack 的模型结构以帮助读者更好地理解并应用该算法,同时对比pt、onnx、tensorrt进行推理的耗时情况。
NanoTrack源码下载:https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack
一、NanoTrack 工作原理
NanoTrackV1 Architecture
-
模型架构:NanoTrack 使用两个相同的卷积神经网络分别处理模板图像(target template)和搜索区域图像(search region)。这两个网络提取的特征随后用于相似性计算。
-
模板分支与搜索分支:
模板分支:处理目标的模板图像,通常是目标的初始帧或之前帧的一个小区域。通过卷积操作,提取模板的深度特征表示。模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,48,8,8]的模板特征;
搜索分支:处理搜索区域图像,该图像包含当前帧中可能包含目标的较大区域。这个分支也通过卷积操作提取深度特征。图像S的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,48,16,16]的图像特征; -
相关性计算:特征图上的每个位置都进行一次简单的元素级相乘,通过这种方式生成一个新的响应图。这个响应图每个像素的位置反映了该位置上的模板和搜索区域特征的相似度,表示目标在搜索区域中的可能位置。
-
边界框回归:在响应图生成后,跟踪器会根据该响应图来估计目标的位置和尺寸。Pointwise-Correlation 的输出会传递给回归网络,预测目标的最终边界框。
二、运行demo与转换tensorrt模型
2.1 运行pt模型demo
配置环境这些基础的步骤这里就不做赘述了。
以下讲解以V3源码为例:
在NanoTrack/bin/demo.py
里修改配置文件与模型路径,改成V3版本的:
parser = argparse.ArgumentParser(description='tracking demo') parser.add_argument('--config', default='../models/config/configv3.yaml',type=str, help='config file')parser.add_argument('--snapshot', default='../models/pretrained/nanotrackv3.pth', type=str, help='model name')parser.add_argument('--video_name', default='../bin/girl_dance.mp4', type=str, help='videos or image files')parser.add_argument('--save', action='store_true', help='whether visualzie result') args = parser.parse_args()
然后运行:
python demo.py
2.2 转onnx模型
这里将pt模型拆成3个部分,在NanoTrack/pytorch2onnx.py
中进行修改:
# backbone input-xfbackbone_s = torch.randn([1, 3, 255, 255], device=device)export_onnx_file_path = './models/onnx/nanotrack_backbone_S.onnx'torch.onnx.export(backbone_net, backbone_s, export_onnx_file_path, input_names=['input'], output_names=['output'],verbose=True, opset_version=14)# backbone input-xfbackbone_x = torch.randn([1, 3, 127, 127], device=device)export_onnx_file_path = './models/onnx/nanotrack_backbone_T.onnx'torch.onnx.export(backbone_net, backbone_x, export_onnx_file_path, input_names=['input'], output_names=['output'],verbose=True, opset_version=14)# head change forward /media/dell/Data/NanoTrack/nanotrack/models/model_builder.pyhead_zf, head_xf = torch.randn([1, 96, 8, 8], device=device), torch.randn([1, 96, 16, 16], device=device)export_onnx_file_path = './models/onnx/nanotrack_head.onnx'torch.onnx.export(head_net, (head_zf, head_xf), export_onnx_file_path, input_names=['input1', 'input2'],output_names=['output1', 'output2'], verbose=True, opset_version=14)
这里需要注意V3模型,模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,96,8,8]的模板特征;
图像S的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,96,16,16]的图像特征;
output1和output2会作为input1与input2被送入模型head部分,v3默认输出是output1[1,2,15,15],output2[1,4,15,15]
具体的可以查询NanoTrack/models/config/configv3.yaml
中的:
2.3 转tensorrt模型
下载NanoTrack TRT项目:https://github.com/SSSSSSL/NanoTrack_TensorRT/tree/master
这里根据自己转出的onnx模型为例,进行修改路径(也可以直接运行NanoTrack_TensorRT/create_trt_engine.sh生成项目自带的模型)
BACK_EXAM_ONNX="models/nanotrack_backbone_S.onnx"
BACK_TEMP_ONNX="models/nanotrack_backbone_T.onnx"
HEAD_ONNX="models/nanotrack_head.onnx"TRT_BIN="/usr/src/tensorrt/bin/trtexec"BACK_EXAM_TRT="models/nanotrack_backbone_S.engine"
BACK_TEMP_TRT="models/nanotrack_backbone_T.engine"
HEAD_TRT="models/nanotrack_head.engine"
运行NanoTrack_TensorRT/create_trt_engine.sh
出现上图说明转模型成功
2.4 运行trt模型推理
修改NanoTrack_TensorRT/main.py
中的engine文件路径:
def main():""" 主要功能是加载TensorRT引擎并进行推理 """back_exam_engine_path = "models/nanotrack_backbone_S.engine"back_temp_engine_path = "models/nanotrack_backbone_T.engine"head_engine_path = "models/nanotrack_head.engine"tracker = Tracker(back_exam_engine_path, back_temp_engine_path, head_engine_path)# webcam 开始追踪# trackLive(tracker)# video 开始追踪video_path = "/home/nvidia/Desktop/project/video/girl_dance.mp4"trackVideo(tracker, video_path, save_video=True)# benchmark 开始# vot_path = "/home/rgblab/tracking/dataset/VOT"# benchmarkVOT(tracker, vot_path)
因为我们输出的onnx响应图为15*15的,需要在NanoTrack_TensorRT/core/config.py
进行相应修改:
相应的NanoTrack_TensorRT/core/process.py
中的HeadProcessor
的post
部分也要修改:
完成以上运行:
python main.py
三、推理速度对比
模型 | 平均FPS |
---|---|
pt | 70 |
onnx | 95 |
tensorrt | 132 |
总结
本文介绍了 NanoTrack 的工作原理,并通过实践展示了如何运行pt模型、转换为ONNX模型以及TensorRT模型,最终在嵌入式设备上进行推理。通过对比不同推理框架的耗时情况,展示了TensorRT模型在加速推理方面的优势(相比于pt模型,TensorRT模型平均FPS提升了约90%)。
参考文档:
https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack
https://github.com/SSSSSSL/NanoTrack_TensorRT/tree/master
https://blog.csdn.net/X_windy/article/details/126153227
https://blog.csdn.net/qq_58248345/article/details/135825911
如果阅读本文对你有用,欢迎一键三连呀!!!
2024年10月24日08:48:03
相关文章:

NanoTrack原理与转tensorrt推理
文章目录 前言一、NanoTrack 工作原理二、运行demo与转换tensorrt模型2.1 运行pt模型demo2.2 转onnx模型2.3 转tensorrt模型2.4 运行trt模型推理 三、推理速度对比总结 前言 NanoTrack 是一种轻量级且高效的目标跟踪算法,基于Siamese网络架构,旨在在资源…...

YOLO11改进 | 卷积模块 | 卷积模块替换为选择性内核SKConv【附完整代码一键运行】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文给大家带来的教程是将YOLO11的卷积替…...

CentOS进入单用户模式进行密码重置
一、单用户模式介绍 单用户模式是一种特殊的启动模式,主要用于系统维护和故障排除。在单用户模式下,系统以最小化的状态启动,只有最基本的系统服务会被加载,通常只有root用户可以登录。这种模式提供了对系统的完全控制࿰…...
bitpoke- mysql-operator cluster
sidecar版本只支持到8.0.35,35可以支持到mysql8.0.35 . 默认镜像是5.7的。需要自己打sidecar的镜像: # Docker image for sidecar containers # https://github.com/bitpoke/mysql-operator/tree/master/images/mysql-operator-sidecar-8.0 # 参考5…...
第5课 基本数据类型
一、数据类型的诞生 在Python的世界里,万物皆对象,每个对象都有自己的若干属性,每一个属性都能描述对象的某一个方面。就像我们每个人,都有自己的身高、年龄、姓名、性别等很多方面的信息,这里的身高、年龄、姓名、性…...

OceanBase 首席科学家阳振坤:大模型时代的数据库思考
2024年 OceanBase 年度大会 即将于10月23日,在北京举行。 欢迎到现场了解更多“SQL AI ” 的探讨与分享! 近期,2024年金融业数据库技术大会在北京圆满举行,聚焦“大模型时代下数据库的创新发展”议题,汇聚了国内外众多…...
国内知名的几个镜像源
在国内,有许多常用的Python库镜像源可以帮助加速库的下载。以下是几个知名的镜像源: 1. 清华大学TUNA协会 网址: https://pypi.tuna.tsinghua.edu.cn/simple命令示例:pip install numpy --index-url https://pypi.tuna.tsinghua.edu.cn/simple2. 阿里云…...

海外著名新闻门户媒体软文发稿之华盛顿独立报-大舍传媒
在当今全球化的时代,信息传播的速度和范围达到了前所未有的程度。对于企业和个人而言,如何在国际舞台上有效地展示自己、传递信息,成为了一项至关重要的任务。而海外媒体发稿,特别是通过像华盛顿独立报这样的知名新闻门户…...
青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写
青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写 课题摘要:一、函数内置函数用户定义的函数 (User-Defined Functions, UDFs)使用示例主要特点 二、内置函数数学函数(Mathematical Functions)字符串函数(String Functions…...

关于LaTeX的floatrow包导入后标题无法直接放到浮动体上方
排版一个文章,标题怎么弄都弄不到表格上方,经过阅读帮助文档才发现问题。又是一个坑。 标题位置控制 使用floatrow包之后,类似 \begin{table}[htbp]\caption{xxx。}\label{table1}\centering\begin{tabular}{lcccc}\toprule& \multicol…...

Flutter Image和Text图文组件实战案例
In this section, we’ll go through the process of building a user interface that showcases a product using the Text and Image widgets. We’ll follow Flutter’s best practices to ensure a clean and effective UI structure. 在本节中,我们将使用“Te…...
使用 xlrd 和 xlwt 库进行 Excel 文件操作
使用 xlrd 和 xlwt 库进行 Excel 文件操作 在数据分析和处理的过程中,Excel 文件是最常用的数据存储格式之一。Python 提供了多种库来处理 Excel 文件,其中 xlrd 和 xlwt 是两个经典的库,分别用于读取和写入 Excel 文件。本文将详细介绍如何使用这两个库进行 Excel 文件的操…...
03.04、化栈为队
03.04、化栈为队 1、题目描述 实现一个 MyQueue 类,该类用两个栈来实现一个队列。 2、解题思路 本题要求使用两个栈来实现一个队列。队列遵循先进先出(FIFO)的原则,而栈遵循后进先出(LIFO)的原则。因此…...

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)
coppelia sim[V-REP]仿真实现 机器人于3D相机手眼标定与实时视觉追踪 二 zmq API接口python调用python获取3D相机的数据获取彩色相机的数据获取深度相机的数据用matpolit显示 python控制机器人运动直接控制轴的位置用IK运动学直接移动到末端姿态 相机内参的标定记录拍照点的位置…...

苏州金龙技术创新赋能旅游新质生产力
2024年10月23日,备受瞩目的“2024第六届旅游出行大会”在云南省丽江市正式开幕。作为客车行业新质生产力标杆客车,苏州金龙在大会期间现场展示了新V系V12商旅版、V11和V8E纯电车型,为旅游出行提供全新升级方案。 其中,全新15座V1…...
ceph pg stale 恢复
问题 如果 ceph -s 看到 ceph 有类似如下状态的 pg data:volumes: 1/1 healthypools: 5 pools, 113 pgsobjects: 6.94k objects, 22 GiBusage: 24 GiB used, 33 TiB / 33 TiB availpgs: 0.885% pgs not active366/13880 objects degraded (2.637%)...

Openlayers高级交互(8/20):选取feature,平移feature
本示例介绍如何在vue+openlayers中使用Translate,选取feature,平移feature。选择的时候需要按住shift。Translate 功能通常是指在地图上平移某个矢量对象的位置。在 OpenLayers 中,可以通过修改矢量对象的几何位置来实现这一功能。 效果图 配置方式 1)查看基础设置:http…...
uniapp renderjs页面传值
scrip标签里加 lang“renderjs” ,可以使用原生js的dom,但是我在使用中发现以下问题,导致数据不能动态获取 1. onLoad获取上级页面传值 // APP不会触发,h5可以 2. props不会触发 解决办法添加 script 逻辑层数据传入渲染层 ren…...

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表
Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,现已广泛应用于农林生态,资源环境等方面,成为Science、Nature论文的…...

AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
最近买了机械革命无界14X,CPU是8845HS,核显是780M,正好macOS 15也出了正式版,试试兼容性,安装过程和之前差不多,这次我从外网获得了8核和16核openCore,分享一下。 提前发一下ISO镜像地址和open…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...