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

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
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

  1. 模型架构:NanoTrack 使用两个相同的卷积神经网络分别处理模板图像(target template)和搜索区域图像(search region)。这两个网络提取的特征随后用于相似性计算。

  2. 模板分支与搜索分支:
    模板分支:处理目标的模板图像,通常是目标的初始帧或之前帧的一个小区域。通过卷积操作,提取模板的深度特征表示。模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,48,8,8]的模板特征;
    搜索分支:处理搜索区域图像,该图像包含当前帧中可能包含目标的较大区域。这个分支也通过卷积操作提取深度特征。图像S的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,48,16,16]的图像特征;

  3. 相关性计算:特征图上的每个位置都进行一次简单的元素级相乘,通过这种方式生成一个新的响应图。这个响应图每个像素的位置反映了该位置上的模板和搜索区域特征的相似度,表示目标在搜索区域中的可能位置。

  4. 边界框回归:在响应图生成后,跟踪器会根据该响应图来估计目标的位置和尺寸。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中的HeadProcessorpost部分也要修改:
在这里插入图片描述
完成以上运行:

python main.py

三、推理速度对比

模型平均FPS
pt70
onnx95
tensorrt132

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


总结

本文介绍了 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用户可以登录。这种模式提供了对系统的完全控制&#xff0…...

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. 阿里云…...

海外著名新闻门户媒体软文发稿之华盛顿独立报-大舍传媒

在当今全球化的时代,信息传播的速度和范围达到了前所未有的程度。对于企业和个人而言,如何在国际舞台上有效地展示自己、传递信息,成为了一项至关重要的任务。而海外媒体发稿,特别是通过像华盛顿独立报这样的知名新闻门户&#xf…...

青少年编程与数学 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…...

我为什么放弃30W年薪,选择去读AI硕士?

当“点工”撞上“智能墙”周五下午六点,我像往常一样提交了最后一份测试报告,关闭了Jira上的第47个Bug工单。屏幕上,自动化回归脚本的进度条刚好跑到100%,绿色通过。一切看起来都那么完美,那么稳定。但我的内心&#x…...

深入AD9361:除了QPSK和FM,这颗射频芯片在Zynq平台上还能玩出什么花样?

深入AD9361:解锁Zynq平台上的射频创新潜能 当工程师们首次接触AD9361这颗射频芯片时,往往会被其标准应用场景如QPSK调制或FM收音所吸引。然而,这颗高度集成的RF收发器IC的真正价值,在于它为Zynq PSPL架构带来的无限可能性。本文将…...

别再死记硬背了!手把手教你理解UVM寄存器模型中的reg2bus与bus2reg(附APB总线实战代码)

深入解析UVM寄存器模型:揭秘reg2bus与bus2reg的自动化魔法 在芯片验证领域,UVM寄存器模型堪称验证工程师的"瑞士军刀",但其中两个核心转换函数——reg2bus和bus2reg却让不少初学者感到困惑。为什么我们只需要实现这两个函数&#x…...

基于MCP协议的AI驱动API测试:原理、架构与工程实践

1. 项目概述:API测试的“瑞士军刀”MCP最近在梳理团队内部的API测试流程时,发现了一个挺有意思的项目:cocaxcode/api-testing-mcp。乍一看这个标题,可能很多朋友会有点懵,这“MCP”是个啥?其实,…...

电机选型与控制实战指南:从直流、步进到伺服电机

1. 电机选型:从理解需求开始选电机,听起来像是硬件工程师或者资深创客的活儿,但只要你玩过Arduino小车、做过3D打印机,或者想给家里的模型加个能动的部件,这事儿就绕不开。我刚开始接触项目时,也犯过迷糊&a…...

Claude 的下一代 Agent 架构:大脑与双手解耦(译文)

原文链接:https://www.anthropic.com/engineering/managed-agents Harnesses encode assumptions that go stale as models improve. Managed Agents—our hosted service for long-horizon agent work—is built around interfaces that stay stable as harnesses …...

Python性能优化利器:Numba JIT编译器原理与实战应用

1. 项目概述:当Python遇上性能瓶颈,Numba如何成为你的“即时编译器”在数据科学、科学计算和高性能数值模拟领域,Python以其简洁的语法和丰富的生态库(如NumPy、Pandas)成为了事实上的标准语言。然而,任何深…...

AI智能体框架选型指南:从LangChain到CrewAI的实战解析

1. 项目概述:为什么我们需要一个“智能体框架”导航站?如果你最近在关注AI领域,尤其是大语言模型的应用开发,那么“智能体”这个词一定已经听得耳朵起茧了。从OpenAI的GPTs到各种自主执行任务的AI助手,智能体似乎成了将…...

构建个人数字档案馆:用静态站点生成器永久保存思想印记

1. 项目概述:一个灵魂的数字化栖息地 最近在整理个人数字资产时,我常常感到一种无力感。十几年来,从博客、社交媒体到各种笔记应用,产生的文字、图片、链接散落在各处,像一座座孤岛。有些平台已经关闭,有些…...

Go语言树结构:二叉树与AVL树

Go语言树结构:二叉树与AVL树 1. 二叉树实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }type BinaryTree struct {Root *TreeNode }func (t *BinaryTree) Insert(val int) {t.Root insert(t.Root, val) }func insert(node *TreeNode, val in…...